From 6e2055e96fdc469e1183b241907111528a6f6aa2 Mon Sep 17 00:00:00 2001 From: Torsten Schneider Date: Thu, 25 Feb 2021 07:56:54 +0100 Subject: [PATCH] Added SunEditor + First test --- .../app/Http/Controllers/UserController.php | 13 +- motorradig/package-lock.json | 5 + motorradig/package.json | 3 +- motorradig/public/img/user/1.jpg | Bin 4576 -> 0 bytes motorradig/public/img/user/1_gross.jpg | Bin 102429 -> 0 bytes motorradig/public/js/app.js | 21511 ++++++++++++++++ motorradig/resources/js/app.js | 1 + motorradig/resources/js/suneditor.js | 27 + motorradig/resources/views/home.blade.php | 13 +- .../resources/views/users/show.blade.php | 5 +- motorradig/storage/img_storage/user/1.jpg | Bin 4576 -> 6539 bytes .../storage/img_storage/user/1_gross.jpg | Bin 102429 -> 177909 bytes 12 files changed, 21563 insertions(+), 15 deletions(-) delete mode 100644 motorradig/public/img/user/1.jpg delete mode 100644 motorradig/public/img/user/1_gross.jpg create mode 100644 motorradig/resources/js/suneditor.js diff --git a/motorradig/app/Http/Controllers/UserController.php b/motorradig/app/Http/Controllers/UserController.php index 67f893b..138a77f 100644 --- a/motorradig/app/Http/Controllers/UserController.php +++ b/motorradig/app/Http/Controllers/UserController.php @@ -102,22 +102,17 @@ class UserController extends Controller if ($breite>$hoehe) { Image::make($request->bild) ->widen(1200) - ->save(public_path().'/img/user/'.$user->id.'_gross.jpg') - ->save(storage_path().'/img/user/'.$user->id.'_gross.jpg'); + ->save(storage_path().'/img_storage/user/'.$user->id.'_gross.jpg'); Image::make($request->bild) ->widen(64) - ->save(public_path().'/img/user/'.$user->id.'.jpg') - ->save(storage_path().'/img/user/'.$user->id.'.jpg'); + ->save(storage_path().'/img_storage/user/'.$user->id.'.jpg'); }else { Image::make($request->bild) ->heighten(900) - ->save(public_path().'/img/user/'.$user->id.'_gross.jpg') - ->save(storage_path().'/img/user/'.$user->id.'_gross.jpg'); + ->save(storage_path().'/img_storage/user/'.$user->id.'_gross.jpg'); Image::make($request->bild) ->widen(96) - ->save(public_path().'/img/user/'.$user->id.'.jpg') - ->save(storage_path().'/img/user/'.$user->id.'.jpg'); - + ->save(storage_path().'/img_storage/user/'.$user->id.'.jpg'); } } diff --git a/motorradig/package-lock.json b/motorradig/package-lock.json index 9b8a310..a265057 100644 --- a/motorradig/package-lock.json +++ b/motorradig/package-lock.json @@ -8596,6 +8596,11 @@ } } }, + "suneditor": { + "version": "2.36.4", + "resolved": "https://registry.npmjs.org/suneditor/-/suneditor-2.36.4.tgz", + "integrity": "sha512-xOB96cQWzt8PQ8fSF6Q5NzxMPpOFTeaQBbHTx+ZuUt6s7hxh2LE8bh0yU+hLmeoXfBCTtV/A0zb+e7sLy2G0BA==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", diff --git a/motorradig/package.json b/motorradig/package.json index db2c0f4..248b8c8 100644 --- a/motorradig/package.json +++ b/motorradig/package.json @@ -24,6 +24,7 @@ }, "dependencies": { "@fortawesome/fontawesome-free": "^5.14.0", - "lightbox2": "^2.11.3" + "lightbox2": "^2.11.3", + "suneditor": "^2.36.4" } } diff --git a/motorradig/public/img/user/1.jpg b/motorradig/public/img/user/1.jpg deleted file mode 100644 index 1866ed66fa53909ee849bddd552103eaffc3a063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4576 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 diff --git a/motorradig/public/js/app.js b/motorradig/public/js/app.js index ecb1293..7a6a240 100644 --- a/motorradig/public/js/app.js +++ b/motorradig/public/js/app.js @@ -6386,6 +6386,112 @@ module.exports = { //# sourceMappingURL=bootstrap.js.map +/***/ }), + +/***/ "./node_modules/css-loader/index.js?!./node_modules/postcss-loader/src/index.js?!./node_modules/suneditor/dist/css/suneditor.min.css": +/*!*******************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader??ref--6-1!./node_modules/postcss-loader/src??ref--6-2!./node_modules/suneditor/dist/css/suneditor.min.css ***! + \*******************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__(/*! ../../../css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false); +// imports + + +// module +exports.push([module.i, ".sun-editor{width:auto;height:auto;box-sizing:border-box;font-family:Helvetica Neue,sans-serif;border:1px solid #dadada;background-color:#fff;color:#000;user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.sun-editor *{box-sizing:border-box;-webkit-user-drag:none;overflow:visible}.sun-editor-common button,.sun-editor-common input,.sun-editor-common select,.sun-editor-common textarea{font-size:14px;line-height:1.5}.sun-editor-common blockquote,.sun-editor-common body,.sun-editor-common button,.sun-editor-common code,.sun-editor-common dd,.sun-editor-common div,.sun-editor-common dl,.sun-editor-common dt,.sun-editor-common fieldset,.sun-editor-common form,.sun-editor-common h1,.sun-editor-common h2,.sun-editor-common h3,.sun-editor-common h4,.sun-editor-common h5,.sun-editor-common h6,.sun-editor-common input,.sun-editor-common legend,.sun-editor-common li,.sun-editor-common ol,.sun-editor-common p,.sun-editor-common pre,.sun-editor-common select,.sun-editor-common td,.sun-editor-common textarea,.sun-editor-common th,.sun-editor-common ul{margin:0;padding:0;border:0}.sun-editor-common dl,.sun-editor-common li,.sun-editor-common menu,.sun-editor-common ol,.sun-editor-common ul{list-style:none!important}.sun-editor-common hr{margin:6px 0!important}.sun-editor textarea{resize:none;border:0;padding:0}.sun-editor button{border:0;background-color:transparent;touch-action:manipulation;cursor:pointer;outline:none}.sun-editor button,.sun-editor input,.sun-editor select,.sun-editor textarea{vertical-align:middle}.sun-editor button span{display:block;margin:0;padding:0}.sun-editor button .txt{display:block;margin-top:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sun-editor button *{pointer-events:none;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden}.sun-editor .se-svg,.sun-editor button>svg{width:16px;height:16px;margin:auto;fill:currentColor;display:block;text-align:center;float:none}.sun-editor .close>svg,.sun-editor .se-dialog-close>svg{width:10px;height:10px}.sun-editor .se-btn-select>svg{float:right;width:10px;height:10px}.sun-editor .se-btn-list>.se-list-icon{display:inline-block;width:16px;height:16px;margin:-1px 10px 0 0;vertical-align:middle}.sun-editor .se-line-breaker>button>svg{width:24px;height:24px}.sun-editor button>i:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;font-size:15px;line-height:2}.sun-editor button>[class=se-icon-text]{font-size:20px;line-height:1}.sun-editor .se-arrow,.sun-editor .se-arrow:after{position:absolute;display:block;width:0;height:0;border:11px solid transparent}.sun-editor .se-arrow.se-arrow-up{top:-11px;left:20px;margin-left:-11px;border-top-width:0;border-bottom-color:#dadada}.sun-editor .se-arrow.se-arrow-up:after{top:1px;margin-left:-11px;content:\" \";border-top-width:0;border-bottom-color:#fff}.sun-editor .se-toolbar .se-arrow.se-arrow-up:after{border-bottom-color:#fafafa}.sun-editor .se-arrow.se-arrow-down{top:0;left:0;margin-left:-11px;border-bottom-width:0;border-top-color:#dadada}.sun-editor .se-arrow.se-arrow-down:after{top:-12px;margin-left:-11px;content:\" \";border-bottom-width:0;border-top-color:#fff}.sun-editor .se-toolbar .se-arrow.se-arrow-down:after{border-top-color:#fafafa}.sun-editor .se-container{position:relative;width:100%;height:100%}.sun-editor button{color:#000}.sun-editor .se-btn{float:left;width:34px;height:34px;border:0;border-radius:4px;margin:1px!important;padding:0;font-size:12px;line-height:27px}.sun-editor .se-btn:enabled:focus,.sun-editor .se-btn:enabled:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-btn:enabled:active{background-color:#d1d1d1;border-color:#c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-btn-primary{color:#000;background-color:#c7deff;border:1px solid #80bdff;border-radius:4px}.sun-editor .se-btn-primary:focus,.sun-editor .se-btn-primary:hover{color:#000;background-color:#80bdff;border-color:#3f9dff;outline:0 none}.sun-editor .se-btn-primary:active{color:#fff;background-color:#3f9dff;border-color:#4592ff;box-shadow:inset 0 3px 5px #4592ff}.sun-editor input,.sun-editor select,.sun-editor textarea{color:#000;border:1px solid #ccc;border-radius:4px}.sun-editor input:focus,.sun-editor select:focus,.sun-editor textarea:focus{border:1px solid #80bdff;outline:0;box-shadow:0 0 0 .2rem #c7deff;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.sun-editor .se-btn:enabled.active{color:#4592ff;outline:0 none}.sun-editor .se-btn:enabled.active:focus,.sun-editor .se-btn:enabled.active:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-btn:enabled.active:active{background-color:#d1d1d1;border-color:#c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-btn:enabled.on{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-btn:enabled.on:focus,.sun-editor .se-btn:enabled.on:hover{background-color:#d1d1d1;border-color:#c1c1c1;outline:0 none}.sun-editor .se-btn:enabled.on:active{background-color:#c1c1c1;border-color:#b1b1b1;box-shadow:inset 0 3px 5px #b1b1b1}.sun-editor .se-btn-list:disabled,.sun-editor .se-btn:disabled,.sun-editor button:disabled{cursor:not-allowed;background-color:inherit;color:#bdbdbd}.sun-editor .se-loading-box{position:absolute;display:none;width:100%;height:100%;top:0;left:0;background-color:#fff;opacity:.7;filter:alpha(opacity=70);z-index:2147483647}.sun-editor .se-loading-box .se-loading-effect{position:absolute;display:block;top:50%;left:50%;height:25px;width:25px;border-top:2px solid #07d;border-right:2px solid transparent;border-radius:50%;-webkit-animation:spinner .8s linear infinite;animation:spinner .8s linear infinite;margin:-25px 0 0 -25px}.sun-editor .se-line-breaker{position:absolute;display:none;width:100%;height:1px;cursor:text;border-top:1px solid #3288ff;z-index:7}.sun-editor .se-line-breaker>button.se-btn{position:relative;display:inline-block;width:30px;height:30px;top:-15px;float:none;left:-50%;background-color:#fff;border:1px solid #0c2240;opacity:.6;cursor:pointer}.sun-editor .se-line-breaker>button.se-btn:hover{opacity:.9;background-color:#fff;border-color:#041b39}.sun-editor .se-line-breaker-component{position:absolute;display:none;width:24px;height:24px;background-color:#fff;border:1px solid #0c2240;opacity:.6;border-radius:4px;cursor:pointer;z-index:7}.sun-editor .se-line-breaker-component:hover{opacity:.9}.sun-editor .se-toolbar{display:block;position:relative;height:auto;width:100%;overflow:visible;padding:0;margin:0;background-color:#fafafa;outline:1px solid #dadada;z-index:5}.sun-editor .se-toolbar-cover{position:absolute;display:none;font-size:36px;width:100%;height:100%;top:0;left:0;background-color:#fefefe;opacity:.5;filter:alpha(opacity=50);cursor:not-allowed;z-index:4}.sun-editor .se-toolbar-separator-vertical{display:inline-block;height:0;width:0;margin:1px;vertical-align:top}.sun-editor .se-toolbar.se-toolbar-balloon,.sun-editor .se-toolbar.se-toolbar-inline{display:none;position:absolute;box-shadow:0 3px 9px rgba(0,0,0,.5);-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5)}.sun-editor .se-toolbar.se-toolbar-balloon{z-index:2147483647;width:auto}.sun-editor .se-toolbar.se-toolbar-sticky{position:fixed;top:0}.sun-editor .se-toolbar-sticky-dummy{display:none;position:static;z-index:-1}.sun-editor .se-btn-module{display:inline-block}.sun-editor .se-btn-module-border{border:1px solid #dadada;border-radius:4px}.sun-editor .se-btn-module-enter{display:block;width:100%;height:1px;margin-bottom:5px;background-color:transparent}.sun-editor .se-toolbar-more-layer{margin:0 -3px;background-color:#fafafa}.sun-editor .se-toolbar-more-layer .se-more-layer{display:none;border-top:1px solid #dadada}.sun-editor .se-toolbar-more-layer .se-more-layer .se-more-form{display:inline-block;width:100%;height:auto;padding:4px 3px 0}.sun-editor .se-btn-module .se-btn-more.se-btn-more-text{width:auto;padding:0 4px}.sun-editor .se-btn-module .se-btn-more:focus,.sun-editor .se-btn-module .se-btn-more:hover{color:#000;background-color:#d1d1d1;border-color:#c1c1c1;outline:0 none}.sun-editor .se-btn-module .se-btn-more.on{color:#333;background-color:#d1d1d1;border-color:#c1c1c1;outline:0 none}.sun-editor .se-btn-module .se-btn-more.on:hover{color:#000;background-color:#c1c1c1;border-color:#b1b1b1;outline:0 none}.sun-editor .se-menu-list,.sun-editor .se-menu-list li{float:left;padding:0;margin:0}.sun-editor .se-menu-list li{position:relative}.sun-editor .se-btn-select{width:auto;display:flex;padding:4px 6px}.sun-editor .se-btn-select .txt{flex:auto;text-align:left}.sun-editor.se-rtl .se-btn-select svg{margin:auto 1px}.sun-editor .se-btn-select.se-btn-tool-font{width:100px}.sun-editor .se-btn-select.se-btn-tool-format{width:82px}.sun-editor .se-btn-select.se-btn-tool-size{width:78px}.sun-editor .se-btn-tray{position:relative;width:100%;height:auto;padding:4px 3px 0;margin:0}.sun-editor .se-menu-tray{position:absolute;top:0;left:0;width:100%;height:0}.sun-editor .se-submenu{overflow-x:hidden;overflow-y:auto}.sun-editor .se-list-layer{display:none;position:absolute;top:0;left:0;height:auto;z-index:5;border:1px solid #bababa;border-radius:4px;padding:6px 0;background-color:#fff;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none}.sun-editor .se-list-layer .se-list-inner{padding:0;margin:0;overflow-x:initial;overflow-y:initial;overflow:visible}.sun-editor .se-list-layer button{margin:0;width:100%}.sun-editor .se-list-inner ul{width:100%;padding:0}.sun-editor .se-list-inner li>button{min-width:100%;width:-webkit-max-content;width:-moz-max-content;width:max-content}.sun-editor .se-list-inner .se-list-basic li{width:100%}.sun-editor .se-list-inner .se-list-basic li button.active{background-color:#80bdff;border:1px solid #3f9dff;border-left:0;border-right:0}.sun-editor .se-list-inner .se-list-basic li button.active:hover{background-color:#3f9dff;border:1px solid #4592ff;border-left:0;border-right:0}.sun-editor .se-list-inner .se-list-basic li button.active:active{background-color:#4592ff;border:1px solid #407dd1;border-left:0;border-right:0;box-shadow:inset 0 3px 5px #407dd1}.sun-editor .se-list-inner .se-list-checked li button>.se-svg{float:left;padding:6px 6px 0 0}.sun-editor .se-list-inner .se-list-checked li button>.se-svg>svg{display:none}.sun-editor .se-list-inner .se-list-checked li button.se-checked{color:#4592ff}.sun-editor .se-list-inner .se-list-checked li button.se-checked>.se-svg>svg{display:block}.sun-editor .se-btn-list{width:100%;height:auto;min-height:32px;padding:0 14px;cursor:pointer;font-size:12px;line-height:normal;text-indent:0;text-decoration:none;text-align:left}.sun-editor .se-btn-list.default_value{background-color:#f3f3f3;border-top:1px dotted #b1b1b1;border-bottom:1px dotted #b1b1b1}.sun-editor .se-btn-list:focus,.sun-editor .se-btn-list:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-btn-list:active{background-color:#d1d1d1;border-color:#c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-list-layer.se-list-font-size{min-width:140px;max-height:300px}.sun-editor .se-list-layer.se-list-font-family{min-width:156px}.sun-editor .se-list-layer.se-list-font-family .default{border-bottom:1px solid #ccc}.sun-editor .se-list-layer.se-list-line{width:125px}.sun-editor .se-list-layer.se-list-align .se-list-inner{left:9px;width:125px}.sun-editor .se-list-layer.se-list-format{min-width:156px}.sun-editor .se-list-layer.se-list-format li{padding:0;width:100%}.sun-editor .se-list-layer.se-list-format ul .se-btn-list{line-height:100%}.sun-editor .se-list-layer.se-list-format ul .se-btn-list[data-value=h1]{height:40px}.sun-editor .se-list-layer.se-list-format ul .se-btn-list[data-value=h2]{height:34px}.sun-editor .se-list-layer.se-list-format ul p{font-size:13px}.sun-editor .se-list-layer.se-list-format ul div{font-size:13px;padding:4px 2px}.sun-editor .se-list-layer.se-list-format ul h1{font-size:2em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h2{font-size:1.5em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h3{font-size:1.17em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h4{font-size:1em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h5{font-size:.83em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul h6{font-size:.67em;font-weight:700;color:#333}.sun-editor .se-list-layer.se-list-format ul blockquote{font-size:13px;color:#999;height:22px;margin:0;background-color:transparent;line-height:1.5;border-color:#b1b1b1;padding:0 0 0 7px;border-left:5px #b1b1b1;border-style:solid}.sun-editor .se-list-layer.se-list-format ul pre{font-size:13px;color:#666;padding:4px 11px;margin:0;background-color:#f9f9f9;border:1px solid #e1e1e1;border-radius:4px}.sun-editor .se-selector-table{display:none;position:absolute;top:34px;left:1px;z-index:5;padding:5px 0;float:left;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,.175)}.sun-editor .se-selector-table .se-table-size{font-size:18px;padding:0 5px}.sun-editor .se-selector-table .se-table-size-picker{position:absolute!important;z-index:3;font-size:18px;width:10em;height:10em;cursor:pointer}.sun-editor .se-selector-table .se-table-size-highlighted{position:absolute!important;z-index:2;font-size:18px;width:1em;height:1em;background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADJmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4QTZCNzMzN0I3RUYxMUU4ODcwQ0QwMjM1NTgzRTJDNyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4QTZCNzMzNkI3RUYxMUU4ODcwQ0QwMjM1NTgzRTJDNyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MzYyNEUxRUI3RUUxMUU4ODZGQzgwRjNBODgyNTdFOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MzYyNEUxRkI3RUUxMUU4ODZGQzgwRjNBODgyNTdFOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pl0yAuwAAABBSURBVDhPY/wPBAxUAGCDGvdBeWSAeicIDTfIXREiQArYeR9hEBOEohyMGkQYjBpEGAxjg6ib+yFMygCVvMbAAABj0hwMTNeKJwAAAABJRU5ErkJggg==\") repeat}.sun-editor .se-selector-table .se-table-size-unhighlighted{position:relative!important;z-index:1;font-size:18px;width:10em;height:10em;background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat}.sun-editor .se-selector-table .se-table-size-display{padding-left:5px}.sun-editor .se-list-layer.se-table-split{top:36px}.sun-editor .se-list-layer .se-selector-color{display:flex;width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:270px;height:auto;padding:0;margin:auto}.sun-editor .se-list-layer .se-selector-color .se-color-pallet{width:100%;height:100%;padding:0}.sun-editor .se-list-layer .se-selector-color .se-color-pallet li{display:flex;float:left;position:relative;margin:0}.sun-editor .se-list-layer .se-selector-color .se-color-pallet button{display:block;cursor:default;width:30px;height:30px;text-indent:-9999px}.sun-editor .se-list-layer .se-selector-color .se-color-pallet button.active,.sun-editor .se-list-layer .se-selector-color .se-color-pallet button:focus,.sun-editor .se-list-layer .se-selector-color .se-color-pallet button:hover{border:3px solid #fff}.sun-editor .se-form-group{display:flex;width:100%;min-height:40px;height:auto;padding:4px}.sun-editor .se-form-group input{flex:auto;display:inline-block;width:auto;height:33px;font-size:12px;margin:1px 0;padding:0;border-radius:.25rem;border:1px solid #ccc}.sun-editor .se-form-group button,.sun-editor .se-submenu-form-group button{float:right;width:34px;height:34px;margin:0 2px!important}.sun-editor .se-form-group button.se-btn{border:1px solid #ccc}.sun-editor .se-form-group>div{position:relative}.sun-editor .se-form-group label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}.sun-editor .se-form-group-label{width:100%;height:auto;padding:0 4px}.sun-editor .se-form-group-label label{font-size:13px;font-weight:700}.sun-editor .se-submenu .se-form-group input{width:auto;height:33px;color:#555}.sun-editor .se-submenu .se-form-group .se-color-input{width:72px;text-transform:uppercase;border:none;border-bottom:2px solid #b1b1b1;outline:none}.sun-editor .se-submenu .se-form-group .se-color-input:focus{border-bottom:3px solid #b1b1b1}.sun-editor .se-wrapper{position:relative!important;width:100%;height:auto;overflow:hidden;z-index:1}.sun-editor .se-wrapper .se-wrapper-inner{width:100%;height:100%;min-height:65px;overflow-y:auto;overflow-x:auto;-webkit-overflow-scrolling:touch;user-select:auto;-o-user-select:auto;-moz-user-select:auto;-khtml-user-select:auto;-webkit-user-select:auto;-ms-user-select:auto}.sun-editor .se-wrapper .se-wrapper-inner:focus{outline:none}.sun-editor .se-wrapper .se-wrapper-code{background-color:#191919;color:#fff;font-size:13px;word-break:break-all;padding:4px;margin:0;resize:none!important}.sun-editor .se-wrapper .se-wrapper-wysiwyg{background-color:#fff;display:block}.sun-editor .se-wrapper .se-wrapper-code-mirror{font-size:13px}.sun-editor .se-wrapper .se-placeholder{position:absolute;display:none;white-space:nowrap;text-overflow:ellipsis;z-index:1;color:#b1b1b1;font-size:13px;line-height:1.5;top:0;left:0;right:0;overflow:hidden;margin-top:0;padding-top:16px;padding-left:16px;margin-left:0;padding-right:16px;margin-right:0;pointer-events:none;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden}.sun-editor .se-resizing-bar{display:flex;width:auto;height:auto;min-height:16px;border-top:1px solid #dadada;padding:0 4px;background-color:#fafafa;cursor:ns-resize}.sun-editor .se-resizing-bar.se-resizing-none{cursor:default}.sun-editor .se-resizing-back{position:absolute;display:none;cursor:default;top:0;left:0;width:100%;height:100%;z-index:2147483647}.sun-editor .se-resizing-bar .se-navigation{flex:auto;position:relative;width:auto;height:auto;color:#666;margin:0;padding:0;font-size:10px;font-weight:700;line-height:1.5;background:transparent}.sun-editor .se-resizing-bar .se-char-counter-wrapper{flex:none;position:relative;display:block;width:auto;height:auto;margin:0;padding:0;color:#999;font-size:13px;background:transparent}.sun-editor .se-resizing-bar .se-char-counter-wrapper.se-blink{color:#b94a48;-webkit-animation:blinker .2s linear infinite;animation:blinker .2s linear infinite}.sun-editor .se-resizing-bar .se-char-counter-wrapper .se-char-label{margin-right:4px}.sun-editor .se-dialog{position:absolute;display:none;top:0;left:0;width:100%;height:100%;z-index:2147483647}.sun-editor .se-dialog button,.sun-editor .se-dialog input,.sun-editor .se-dialog label{font-size:14px;line-height:1.5;color:#111;margin:0}.sun-editor .se-dialog .se-dialog-back{background-color:#222;opacity:.5}.sun-editor .se-dialog .se-dialog-back,.sun-editor .se-dialog .se-dialog-inner{position:absolute;width:100%;height:100%;top:0;left:0}.sun-editor .se-dialog .se-dialog-inner .se-dialog-content{position:relative;width:auto;max-width:500px;margin:1.75rem auto;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:4px;outline:0;box-shadow:0 3px 9px rgba(0,0,0,.5)}@media screen and (max-width:509px){.sun-editor .se-dialog .se-dialog-inner .se-dialog-content{width:100%}}.sun-editor .se-dialog .se-dialog-inner .se-dialog-content label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}.sun-editor .se-dialog .se-dialog-inner .se-dialog-content .se-btn-primary{display:inline-block;padding:6px 12px;margin:0 0 10px!important;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;border-radius:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-header{height:50px;padding:6px 15px;border-bottom:1px solid #e5e5e5}.sun-editor .se-dialog .se-dialog-inner .se-dialog-header .se-dialog-close{float:right;font-weight:700;text-shadow:0 1px 0 #fff;-webkit-appearance:none;filter:alpha(opacity=100);opacity:1}.sun-editor .se-dialog .se-dialog-inner .se-dialog-header .se-modal-title{float:left;font-size:14px;font-weight:700;margin:0;padding:0;line-height:2.5}.sun-editor .se-dialog .se-dialog-inner .se-dialog-body{position:relative;padding:15px 15px 5px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form{margin-bottom:10px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form-footer{margin-top:10px;margin-bottom:0}.sun-editor .se-dialog .se-dialog-inner input:disabled{background-color:#f3f3f3}.sun-editor .se-dialog .se-dialog-inner .se-dialog-size-text{width:100%}.sun-editor .se-dialog .se-dialog-inner .se-dialog-size-text .size-h,.sun-editor .se-dialog .se-dialog-inner .se-dialog-size-text .size-w{width:70px;text-align:center}.sun-editor .se-dialog .se-dialog-inner .se-dialog-size-x{margin:0 8px;width:25px;text-align:center}.sun-editor .se-dialog .se-dialog-inner .se-dialog-footer{height:auto;min-height:55px;padding:10px 15px 0;text-align:right;border-top:1px solid #e5e5e5}.sun-editor .se-dialog .se-dialog-inner .se-dialog-footer>div{float:left}.sun-editor .se-dialog .se-dialog-inner .se-dialog-footer>div>label{margin:0 5px 0 0}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-radio{margin-left:12px;margin-right:6px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-check{margin-left:12px;margin-right:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form-footer .se-dialog-btn-check{margin-left:0;margin-right:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form-footer label:first-child{margin-right:16px;margin-left:0}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files{position:relative;display:flex;align-items:center}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files>input{flex:auto}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files .se-dialog-files-edge-button{flex:auto;opacity:.8;border:1px solid #ccc}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files .se-dialog-files-edge-button.se-file-remove>svg{width:8px;height:8px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files .se-dialog-files-edge-button:hover{background-color:#f0f0f0;outline:0 none}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-dialog-form-files .se-dialog-files-edge-button:active{background-color:#e9e9e9;box-shadow:inset 0 3px 5px #d6d6d6}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-select{display:inline-block;width:auto;height:34px;font-size:14px;text-align:center;line-height:1.42857143}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-control{display:inline-block;width:70px;height:34px;font-size:14px;text-align:center;line-height:1.42857143}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-form{display:block;width:100%;height:34px;font-size:14px;line-height:1.42857143;padding:0 4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-form.se-input-url{direction:ltr}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-form.se-input-url:disabled{text-decoration:line-through;color:#999}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-video-ratio{width:70px;margin-left:4px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form a{color:#004cff}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-revert{border:1px solid #ccc}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-revert:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-dialog .se-dialog-inner .se-dialog-btn-revert:active{background-color:#d1d1d1;border-color:#c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-dialog-tabs{width:100%;height:25px;border-bottom:1px solid #e5e5e5}.sun-editor .se-dialog-tabs button{background-color:#e5e5e5;border-right:1px solid #e5e5e5;float:left;outline:none;padding:2px 13px;transition:.3s}.sun-editor .se-dialog-tabs button:hover{background-color:#fff}.sun-editor .se-dialog-tabs button.active{background-color:#fff;border-bottom:0}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-form.se-math-exp{resize:vertical;height:4rem;border:1px solid #ccc;font-size:13px;padding:4px;direction:ltr}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-input-select.se-math-size{width:6em;height:28px;margin-left:1em}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-math-preview{font-size:13px}.sun-editor .se-dialog .se-dialog-inner .se-dialog-form .se-math-preview>span{display:inline-block;box-shadow:0 0 0 .1rem #c7deff}.sun-editor .se-dialog .se-dialog-inner .se-link-preview{display:block;height:auto;max-height:18px;font-size:13px;font-weight:400;font-family:inherit;color:#666;background-color:transparent;overflow:hidden;text-overflow:ellipsis;word-break:break-all;white-space:pre}.sun-editor .se-dialog .se-dialog-inner .se-anchor-preview-form{width:100%;display:flex;margin-top:4px}.sun-editor .se-dialog .se-dialog-inner .se-anchor-preview-form .se-svg.se-anchor-preview-icon{flex:unset;display:none;line-height:1.5;color:#4592ff}.sun-editor .se-dialog .se-dialog-inner .se-anchor-preview-form .se-link-preview{flex:auto;margin:0}.sun-editor .se-dialog .se-dialog-inner .se-anchor-rel{height:34px}.sun-editor .se-dialog .se-dialog-inner .se-anchor-rel-btn{width:46px;color:#3f9dff}.sun-editor .se-dialog .se-dialog-inner .se-anchor-rel-wrapper{display:flex;line-height:1.5;padding-top:6px}.sun-editor .se-dialog .se-dialog-inner .se-anchor-rel-preview{text-align:left}.sun-editor .se-controller .se-arrow.se-arrow-up{border-bottom-color:rgba(0,0,0,.25)}.sun-editor .se-controller{position:absolute;display:none;overflow:visible;z-index:6;border:1px solid rgba(0,0,0,.25);border-radius:4px;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.sun-editor .se-controller .se-btn-group{position:relative;display:flex;vertical-align:middle;padding:2px;top:0;left:0}.sun-editor .se-controller .se-btn-group .se-btn-group-sub{left:50%;min-width:auto;width:-webkit-max-content;width:-moz-max-content;width:max-content;display:none}.sun-editor .se-controller .se-btn-group .se-btn-group-sub button{margin:0;min-width:72px}.sun-editor .se-controller .se-btn-group button{position:relative;min-height:34px;height:auto;border:none;border-radius:4px;margin:1px;padding:5px 10px;font-size:12px;line-height:1.5;display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation}.sun-editor .se-controller .se-btn-group button:focus:enabled,.sun-editor .se-controller .se-btn-group button:hover:enabled{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-controller .se-btn-group button:active:enabled{background-color:#d1d1d1;border-color:#c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-controller .se-btn-group button span{display:block;padding:0;margin:0}.sun-editor .se-controller .se-btn-group button:enabled.active{color:#4592ff;outline:0 none}.sun-editor .se-controller .se-btn-group button:enabled.active:focus,.sun-editor .se-controller .se-btn-group button:enabled.active:hover{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-controller .se-btn-group button:enabled.active:active{background-color:#d1d1d1;border-color:#c1c1c1;box-shadow:inset 0 3px 5px #c1c1c1}.sun-editor .se-controller .se-btn-group button:enabled.on{background-color:#e1e1e1;border-color:#d1d1d1;outline:0 none}.sun-editor .se-controller .se-btn-group button:enabled.on:focus,.sun-editor .se-controller .se-btn-group button:enabled.on:hover{background-color:#d1d1d1;border-color:#c1c1c1;outline:0 none}.sun-editor .se-controller .se-btn-group button:enabled.on:active{background-color:#c1c1c1;border-color:#b1b1b1;box-shadow:inset 0 3px 5px #b1b1b1}.sun-editor .se-controller .se-form-group input{min-width:120px}.sun-editor .se-controller-resizing{margin-top:-50px!important;padding:0;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143}.sun-editor .se-controller-resizing .se-btn-group .se-btn-group-sub.se-resizing-align-list{width:74px}.sun-editor .se-resizing-container{position:absolute;display:none;outline:1px solid #3f9dff;background-color:transparent}.sun-editor .se-resizing-container .se-modal-resize{position:absolute;display:inline-block;background-color:#3f9dff;opacity:.3}.sun-editor .se-resizing-container .se-resize-dot{position:absolute;top:0;left:0;width:100%;height:100%}.sun-editor .se-resizing-container .se-resize-dot>span{position:absolute;width:7px;height:7px;background-color:#3f9dff;border:1px solid #4592ff}.sun-editor .se-resizing-container .se-resize-dot>span.tl{top:-5px;left:-5px;cursor:nw-resize}.sun-editor .se-resizing-container .se-resize-dot>span.tr{top:-5px;right:-5px;cursor:ne-resize}.sun-editor .se-resizing-container .se-resize-dot>span.bl{bottom:-5px;left:-5px;cursor:sw-resize}.sun-editor .se-resizing-container .se-resize-dot>span.br{right:-5px;bottom:-5px;cursor:se-resize}.sun-editor .se-resizing-container .se-resize-dot>span.lw{left:-7px;bottom:50%;cursor:w-resize}.sun-editor .se-resizing-container .se-resize-dot>span.th{left:50%;top:-7px;cursor:n-resize}.sun-editor .se-resizing-container .se-resize-dot>span.rw{right:-7px;bottom:50%;cursor:e-resize}.sun-editor .se-resizing-container .se-resize-dot>span.bh{right:50%;bottom:-7px;cursor:s-resize}.sun-editor .se-resizing-container .se-resize-display{position:absolute;right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:#fff;background-color:#333;border-radius:4px}.sun-editor .se-controller-table,.sun-editor .se-controller-table-cell{width:auto}.sun-editor .se-controller-link,.sun-editor .se-controller-table,.sun-editor .se-controller-table-cell{padding:0;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143}.sun-editor .se-controller-link:after,.sun-editor .se-controller-link:before{box-sizing:border-box}.sun-editor .se-controller-link .link-content{padding:0;margin:0}.sun-editor .se-controller-link .link-content a{display:inline-block;color:#4592ff;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;margin-left:5px}.sun-editor .se-file-browser{position:absolute;display:none;top:0;left:0;width:100%;height:100%;z-index:2147483647}.sun-editor .se-file-browser button,.sun-editor .se-file-browser input,.sun-editor .se-file-browser label{font-size:14px;line-height:1.5;color:#111;margin:0}.sun-editor .se-file-browser .se-file-browser-back{background-color:#222;opacity:.5}.sun-editor .se-file-browser .se-file-browser-back,.sun-editor .se-file-browser .se-file-browser-inner{position:absolute;display:block;width:100%;height:100%;top:0;left:0}.sun-editor .se-file-browser .se-file-browser-inner .se-file-browser-content{position:relative;width:960px;max-width:100%;margin:20px auto;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:4px;outline:0;box-shadow:0 3px 9px rgba(0,0,0,.5)}.sun-editor .se-file-browser .se-file-browser-header{height:auto;min-height:50px;padding:6px 15px;border-bottom:1px solid #e5e5e5}.sun-editor .se-file-browser .se-file-browser-header .se-file-browser-close{float:right;font-weight:700;text-shadow:0 1px 0 #fff;-webkit-appearance:none;filter:alpha(opacity=100);opacity:1}.sun-editor .se-file-browser .se-file-browser-header .se-file-browser-close>svg{width:12px;height:12px}.sun-editor .se-file-browser .se-file-browser-header .se-file-browser-title{font-size:16px;font-weight:700;margin:0;padding:0;line-height:2.2}.sun-editor .se-file-browser .se-file-browser-tags{display:block;width:100%;padding:0;text-align:left;margin:0 -15px}.sun-editor .se-file-browser .se-file-browser-tags a{display:inline-block;background-color:#f5f5f5;padding:6px 12px;margin:8px 0 8px 8px;color:#333;text-decoration:none;border-radius:32px;-moz-border-radius:32px;-webkit-border-radius:32px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;cursor:pointer}.sun-editor .se-file-browser .se-file-browser-tags a:hover{background-color:#e1e1e1}.sun-editor .se-file-browser .se-file-browser-tags a:active{background-color:#d1d1d1}.sun-editor .se-file-browser .se-file-browser-tags a.on{background-color:#ebf3fe;color:#4592ff}.sun-editor .se-file-browser .se-file-browser-tags a.on:hover{background-color:#d8e8fe}.sun-editor .se-file-browser .se-file-browser-tags a.on:active{background-color:#c7deff}.sun-editor .se-file-browser .se-file-browser-body{position:relative;height:auto;min-height:350px;padding:20px;overflow-y:auto}.sun-editor .se-file-browser .se-file-browser-body .se-file-browser-list{position:relative;width:100%}@media screen and (max-width:992px){.sun-editor .se-file-browser .se-file-browser-inner .se-file-browser-content{width:748px}}@media screen and (max-width:768px){.sun-editor .se-file-browser .se-file-browser-inner .se-file-browser-content{width:600px}}.sun-editor .se-file-browser .se-file-browser-list .se-file-item-column{position:relative;display:block;height:auto;float:left}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-column{width:calc(25% - 20px);margin:0 10px}@media screen and (max-width:992px){.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-column{width:calc(33% - 20px)}}@media screen and (max-width:768px){.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-column{width:calc(50% - 20px)}}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img{position:relative;display:block;cursor:pointer;width:100%;height:auto;border-radius:4px;outline:0;margin:10px 0}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img:hover{opacity:.8;box-shadow:0 0 0 .2rem #3288ff}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img>img{position:relative;display:block;width:100%;border-radius:4px;outline:0;height:auto}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img>.se-file-img-name{position:absolute;z-index:1;font-size:13px;color:#fff;left:0;bottom:0;padding:5px 10px;background-color:transparent;width:100%;height:30px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.sun-editor .se-file-browser .se-file-browser-list.se-image-list .se-file-item-img>.se-file-img-name.se-file-name-back{background-color:#333;opacity:.6}.sun-editor .se-notice{position:absolute;top:0;display:none;z-index:7;width:100%;height:auto;word-break:break-all;font-size:13px;color:#b94a48;background-color:#f2dede;padding:15px;margin:0;border:1px solid #eed3d7;user-select:auto;-o-user-select:auto;-moz-user-select:auto;-khtml-user-select:auto;-webkit-user-select:auto;-ms-user-select:auto}.sun-editor .se-notice button{float:right;padding:7px}.sun-editor .se-tooltip{position:relative;overflow:visible}.sun-editor .se-tooltip .se-tooltip-inner{visibility:hidden;position:absolute;display:block;width:auto;top:120%;left:50%;background:transparent;opacity:0;z-index:1;line-height:1.5;transition:opacity .5s;margin:0;padding:0;bottom:auto;float:none;pointer-events:none;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden}.sun-editor .se-tooltip .se-tooltip-inner .se-tooltip-text{position:relative;display:inline-block;width:auto;left:-50%;font-size:.9em;margin:0;padding:4px 6px;border-radius:2px;background-color:#333;color:#fff;text-align:center;line-height:unset;white-space:nowrap;cursor:auto}.sun-editor .se-tooltip .se-tooltip-inner .se-tooltip-text:after{content:\"\";position:absolute;bottom:100%;left:50%;margin-left:-5px;border:5px solid transparent;border-bottom-color:#333}.sun-editor .se-tooltip:hover .se-tooltip-inner{visibility:visible;opacity:1}.sun-editor .se-tooltip .se-tooltip-inner .se-tooltip-text .se-shortcut{display:block!important}.sun-editor .se-tooltip .se-tooltip-inner .se-tooltip-text .se-shortcut>.se-shortcut-key{display:inline;font-weight:700}.sun-editor.se-rtl .se-btn-tray{direction:rtl}.sun-editor.se-rtl .se-btn-select .txt{flex:auto;text-align:right;direction:rtl}.sun-editor.se-rtl .se-btn-list{text-align:right}.sun-editor.se-rtl .se-btn-list>.se-list-icon{margin:-1px 0 0 10px}.sun-editor.se-rtl .se-menu-list,.sun-editor.se-rtl .se-menu-list li{float:right}.sun-editor.se-rtl .se-list-layer *{direction:rtl}.sun-editor.se-rtl .se-list-layer.se-list-format ul blockquote{padding:0 7px 0 0;border-right-width:5px;border-left-width:0}.sun-editor.se-rtl .se-list-layer .se-selector-color .se-color-pallet li{float:right}.sun-editor.se-rtl .se-list-inner .se-list-checked li button>.se-svg{float:right;padding:6px 0 0 6px}.sun-editor.se-rtl .se-tooltip .se-tooltip-inner .se-tooltip-text,.sun-editor.se-rtl .se-wrapper .se-placeholder{direction:rtl}.sun-editor.se-rtl .se-tooltip .se-tooltip-inner .se-tooltip-text .se-shortcut{direction:ltr}.sun-editor.se-rtl .se-dialog *{direction:rtl}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-header .se-dialog-close{float:left}.sun-editor.se-rtl .se-dialog-tabs button,.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-header .se-modal-title{float:right}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-size-text{padding-right:34px}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-footer .se-btn-primary{float:left}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-footer>div{float:right}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-footer>div>label{margin:0 0 0 5px}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-dialog-form-footer label:first-child{margin-left:16px;margin-right:0}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-anchor-rel-preview{margin-left:4px;text-align:right}.sun-editor.se-rtl .se-dialog .se-dialog-inner .se-anchor-rel-btn{float:right}.sun-editor.se-rtl .se-file-browser *{direction:rtl}.sun-editor.se-rtl .se-file-browser .se-file-browser-tags{text-align:right}.sun-editor.se-rtl .se-file-browser .se-file-browser-tags a{margin:8px 8px 0}.sun-editor.se-rtl .se-file-browser .se-file-browser-header .se-file-browser-close{float:left}.sun-editor.se-rtl .se-controller .se-btn-group,.sun-editor.se-rtl .se-resizing-container .se-resize-display{direction:rtl}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}@-webkit-keyframes spinner{to{transform:rotate(361deg)}}@keyframes spinner{to{transform:rotate(361deg)}}.sun-editor-editable{font-family:Helvetica Neue,sans-serif;font-size:13px;color:#333;line-height:1.5;background-color:#fff;word-break:normal;word-wrap:break-word;padding:16px;margin:0}.sun-editor-editable *{box-sizing:border-box;font-family:inherit;font-size:inherit;color:inherit}.sun-editor-editable.se-rtl *{direction:rtl}.sun-editor-editable audio,.sun-editor-editable figcaption,.sun-editor-editable figure,.sun-editor-editable iframe,.sun-editor-editable img,.sun-editor-editable td,.sun-editor-editable th,.sun-editor-editable video{position:relative}.sun-editor-editable .__se__float-left{float:left}.sun-editor-editable .__se__float-right{float:right}.sun-editor-editable .__se__float-center{float:center}.sun-editor-editable .__se__float-none{float:none}.sun-editor-editable span{display:inline;vertical-align:baseline;margin:0;padding:0}.sun-editor-editable span.katex{display:inline-block;direction:ltr}.sun-editor-editable a{color:#004cff;text-decoration:none}.sun-editor-editable span[style~=\"color:\"] a{color:inherit}.sun-editor-editable a:focus,.sun-editor-editable a:hover{cursor:pointer;color:#0093ff;text-decoration:underline}.sun-editor-editable a.on{color:#0093ff;background-color:#e8f7ff}.sun-editor-editable pre{display:block;padding:8px;margin:0 0 10px;font-family:monospace;color:#666;line-height:1.45;background-color:#f9f9f9;border:1px solid #e1e1e1;border-radius:2px;white-space:pre-wrap;word-wrap:break-word;overflow:visible}.sun-editor-editable ol{list-style-type:decimal}.sun-editor-editable ol,.sun-editor-editable ul{list-style-position:inside;display:block;-webkit-margin-before:1em;margin-block-start:1em;-webkit-margin-after:1em;margin-block-end:1em;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;-webkit-padding-start:40px;padding-inline-start:40px}.sun-editor-editable ul{list-style-type:disc}.sun-editor-editable li{display:list-item;text-align:-webkit-match-parent;margin-bottom:5px}.sun-editor-editable ol ol,.sun-editor-editable ol ul,.sun-editor-editable ul ol,.sun-editor-editable ul ul{margin:0}.sun-editor-editable ol ol,.sun-editor-editable ul ol{list-style-type:lower-alpha}.sun-editor-editable ol ol ol,.sun-editor-editable ul ol ol,.sun-editor-editable ul ul ol{list-style-type:upper-roman}.sun-editor-editable ol ul,.sun-editor-editable ul ul{list-style-type:circle}.sun-editor-editable ol ol ul,.sun-editor-editable ol ul ul,.sun-editor-editable ul ul ul{list-style-type:square}.sun-editor-editable sub,.sun-editor-editable sup{font-size:75%;line-height:0}.sun-editor-editable sub{vertical-align:sub}.sun-editor-editable sup{vertical-align:super}.sun-editor-editable p{display:block;margin:0 0 10px}.sun-editor-editable div{display:block;margin:0;padding:0}.sun-editor-editable blockquote{display:block;font-family:inherit;font-size:inherit;color:#999;-webkit-margin-before:1em;margin-block-start:1em;-webkit-margin-after:1em;margin-block-end:1em;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;padding:0 5px 0 20px;border:solid #b1b1b1;border-width:0 0 0 5px}.sun-editor-editable blockquote blockquote{border-color:#c1c1c1}.sun-editor-editable blockquote blockquote blockquote{border-color:#d1d1d1}.sun-editor-editable blockquote blockquote blockquote blockquote{border-color:#e1e1e1}.sun-editor-editable.se-rtl blockquote{padding-left:5px;padding-right:20px;border-left-width:0;border-right-width:5px}.sun-editor-editable h1{font-size:2em;-webkit-margin-before:.67em;margin-block-start:.67em;-webkit-margin-after:.67em;margin-block-end:.67em}.sun-editor-editable h1,.sun-editor-editable h2{display:block;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h2{font-size:1.5em;-webkit-margin-before:.83em;margin-block-start:.83em;-webkit-margin-after:.83em;margin-block-end:.83em}.sun-editor-editable h3{font-size:1.17em;-webkit-margin-before:1em;margin-block-start:1em;-webkit-margin-after:1em;margin-block-end:1em}.sun-editor-editable h3,.sun-editor-editable h4{display:block;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h4{font-size:1em;-webkit-margin-before:1.33em;margin-block-start:1.33em;-webkit-margin-after:1.33em;margin-block-end:1.33em}.sun-editor-editable h5{font-size:.83em;-webkit-margin-before:1.67em;margin-block-start:1.67em;-webkit-margin-after:1.67em;margin-block-end:1.67em}.sun-editor-editable h5,.sun-editor-editable h6{display:block;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0;font-weight:700}.sun-editor-editable h6{font-size:.67em;-webkit-margin-before:2.33em;margin-block-start:2.33em;-webkit-margin-after:2.33em;margin-block-end:2.33em}.sun-editor-editable hr{display:flex;border-width:1px 0 0;border-color:#000;-o-border-image:initial;border-image:initial;height:1px}.sun-editor-editable hr.__se__solid{border-style:solid none none}.sun-editor-editable hr.__se__dotted{border-style:dotted none none}.sun-editor-editable hr.__se__dashed{border-style:dashed none none}.sun-editor-editable table{display:table;table-layout:auto;border:1px solid #ccc;width:100%;max-width:100%;margin:0 0 10px;background-color:transparent;border-spacing:0;border-collapse:collapse}.sun-editor-editable.se-rtl table{margin:0 0 10px auto}.sun-editor-editable table thead{border-bottom:2px solid #333}.sun-editor-editable table tr{border:1px solid #efefef}.sun-editor-editable table th{background-color:#f3f3f3}.sun-editor-editable table td,.sun-editor-editable table th{border:1px solid #e1e1e1;padding:.4em;background-clip:padding-box}.sun-editor-editable table.se-table-size-auto{width:auto!important}.sun-editor-editable table.se-table-size-100{width:100%!important}.sun-editor-editable table.se-table-layout-auto{table-layout:auto!important}.sun-editor-editable table.se-table-layout-fixed{table-layout:fixed!important}.sun-editor-editable table td.se-table-selected-cell,.sun-editor-editable table th.se-table-selected-cell{border:1px double #4592ff;background-color:#f1f7ff}.sun-editor-editable.se-disabled *{user-select:none;-o-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.sun-editor-editable .se-component{display:flex;padding:1px;margin:0 0 10px}.sun-editor-editable[contenteditable=true] .se-component{outline:1px dashed #e1e1e1;min-width:16px;min-height:16px}.sun-editor-editable[contenteditable=true] .se-component.se-component-copy{box-shadow:0 0 0 .2rem #3f9dff;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.sun-editor-editable audio,.sun-editor-editable iframe,.sun-editor-editable img,.sun-editor-editable video{display:block;margin:0;padding:0;width:auto;height:auto;max-width:100%}.sun-editor-editable[contenteditable=true] figure:after{position:absolute;content:\"\";z-index:1;top:0;left:0;right:0;bottom:0;cursor:default;display:block;background:transparent}.sun-editor-editable[contenteditable=true] figure a,.sun-editor-editable[contenteditable=true] figure iframe,.sun-editor-editable[contenteditable=true] figure img,.sun-editor-editable[contenteditable=true] figure video{z-index:0}.sun-editor-editable[contenteditable=true] figure figcaption{display:block;z-index:2}.sun-editor-editable[contenteditable=true] figure figcaption:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem #c7deff}.sun-editor-editable .se-image-container,.sun-editor-editable .se-video-container{width:auto;height:auto;max-width:100%}.sun-editor-editable figure{display:block;outline:none;margin:0;padding:0}.sun-editor-editable figure figcaption{padding:1em .5em;margin:0;background-color:#f9f9f9;outline:none}.sun-editor-editable figure figcaption p{line-height:2;margin:0}.sun-editor-editable .se-image-container a img{padding:1px;margin:1px;outline:1px solid #4592ff}.sun-editor-editable .se-video-container iframe,.sun-editor-editable .se-video-container video{outline:1px solid #9e9e9e;position:absolute;top:0;left:0;border:0;width:100%;height:100%}.sun-editor-editable .se-video-container figure{left:0;width:100%;max-width:100%}.sun-editor-editable audio{width:300px;height:54px}.sun-editor-editable audio.active{outline:2px solid #80bdff}.sun-editor-editable.se-show-block div,.sun-editor-editable.se-show-block h1,.sun-editor-editable.se-show-block h2,.sun-editor-editable.se-show-block h3,.sun-editor-editable.se-show-block h4,.sun-editor-editable.se-show-block h5,.sun-editor-editable.se-show-block h6,.sun-editor-editable.se-show-block li,.sun-editor-editable.se-show-block ol,.sun-editor-editable.se-show-block p,.sun-editor-editable.se-show-block pre,.sun-editor-editable.se-show-block ul{border:1px dashed #3f9dff!important;padding:14px 8px 8px!important}.sun-editor-editable.se-show-block ol,.sun-editor-editable.se-show-block ul{border:1px dashed #d539ff!important}.sun-editor-editable.se-show-block pre{border:1px dashed #27c022!important}.se-show-block p{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAPAQMAAAAF7dc0AAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAaSURBVAjXY/j/gwGCPvxg+F4BQiAGDP1HQQByxxw0gqOzIwAAAABJRU5ErkJggg==\") no-repeat}.se-show-block div{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAPAQMAAAAxlBYoAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j//wcDDH+8XsHwDYi/hwNx1A8w/nYLKH4XoQYJAwCXnSgcl2MOPgAAAABJRU5ErkJggg==\") no-repeat}.se-show-block h1{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAfSURBVAjXY/j/v4EBhr+9B+LzEPrDeygfhI8j1CBhAEhmJGY4Rf6uAAAAAElFTkSuQmCC\") no-repeat}.se-show-block h2{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j/v4EBhr+dB+LtQPy9geEDEH97D8T3gbgdoQYJAwA51iPuD2haEAAAAABJRU5ErkJggg==\") no-repeat}.se-show-block h3{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQPy9geHDeQgN5p9HqEHCADeWI+69VG2MAAAAAElFTkSuQmCC\") no-repeat}.se-show-block h4{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAPAQMAAADTSA1RAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j//wADDH97DsTXIfjDdiDdDMTfIRhZHRQDAKJOJ6L+K3y7AAAAAElFTkSuQmCC\") no-repeat}.se-show-block h5{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAlSURBVAjXY/j/v4EBhr+1A/F+IO5vYPiwHUh/B2IQfR6hBgkDABlWIy5uM+9GAAAAAElFTkSuQmCC\") no-repeat}.se-show-block h6{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQLy/geFDP5S9HSKOrA6KAR9GIza1ptJnAAAAAElFTkSuQmCC\") no-repeat}.se-show-block li{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA7SURBVDhPYxgFcNDQ0PAfykQBIHEYhgoRB/BpwCfHBKWpBkaggYxQGgOgBzyQD1aLLA4TGwWDGjAwAACR3RcEU9Ui+wAAAABJRU5ErkJggg==\") no-repeat}.se-show-block ol{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABHSURBVDhPYxgFcNDQ0PAfhKFcFIBLHCdA1oBNM0kGEmMAPgOZoDTVANUNxAqQvURMECADRiiNAWCagDSGGhyW4DRrMAEGBgAu0SX6WpGgjAAAAABJRU5ErkJggg==\") no-repeat}.se-show-block ul{background:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA1SURBVDhPYxgFDA0NDf+hTBSALI5LDQgwQWmqgVEDKQcsUBoF4ItFGEBXA+QzQpmDGjAwAAA8DQ4Lni6gdAAAAABJRU5ErkJggg==\") no-repeat}.sun-editor-editable .__se__p-bordered,.sun-editor .__se__p-bordered{border-top:1px solid #b1b1b1;border-bottom:1px solid #b1b1b1;padding:4px 0}.sun-editor-editable .__se__p-spaced,.sun-editor .__se__p-spaced{letter-spacing:1px}.sun-editor-editable .__se__p-neon,.sun-editor .__se__p-neon{font-weight:200;font-style:italic;background:#000;color:#fff;padding:6px 4px;border:2px solid #fff;border-radius:6px;text-transform:uppercase;-webkit-animation:neonFlicker 1.5s infinite alternate;animation:neonFlicker 1.5s infinite alternate}@-webkit-keyframes neonFlicker{0%,19%,21%,23%,25%,54%,56%,to{text-shadow:-.2rem -.2rem 1rem #fff,.2rem .2rem 1rem #fff,0 0 2px #f40,0 0 4px #f40,0 0 6px #f40,0 0 8px #f40,0 0 10px #f40;box-shadow:0 0 .5px #fff,inset 0 0 .5px #fff,0 0 2px #08f,inset 0 0 2px #08f,0 0 4px #08f,inset 0 0 4px #08f}20%,24%,55%{text-shadow:none;box-shadow:none}}@keyframes neonFlicker{0%,19%,21%,23%,25%,54%,56%,to{text-shadow:-.2rem -.2rem 1rem #fff,.2rem .2rem 1rem #fff,0 0 2px #f40,0 0 4px #f40,0 0 6px #f40,0 0 8px #f40,0 0 10px #f40;box-shadow:0 0 .5px #fff,inset 0 0 .5px #fff,0 0 2px #08f,inset 0 0 2px #08f,0 0 4px #08f,inset 0 0 4px #08f}20%,24%,55%{text-shadow:none;box-shadow:none}}.sun-editor-editable .__se__t-shadow,.sun-editor .__se__t-shadow{text-shadow:-.2rem -.2rem 1rem #fff,.2rem .2rem 1rem #fff,0 0 .2rem #999,0 0 .4rem #888,0 0 .6rem #777,0 0 .8rem #666,0 0 1rem #555}.sun-editor-editable .__se__t-code,.sun-editor .__se__t-code{font-family:monospace;color:#666;background-color:rgba(27,31,35,.05);border-radius:6px;padding:.2em .4em}", ""]); + +// exports + + +/***/ }), + +/***/ "./node_modules/css-loader/lib/css-base.js": +/*!*************************************************!*\ + !*** ./node_modules/css-loader/lib/css-base.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +// css base code, injected by the css-loader +module.exports = function(useSourceMap) { + var list = []; + + // return the list of modules as css string + list.toString = function toString() { + return this.map(function (item) { + var content = cssWithMappingToString(item, useSourceMap); + if(item[2]) { + return "@media " + item[2] + "{" + content + "}"; + } else { + return content; + } + }).join(""); + }; + + // import a list of modules into the list + list.i = function(modules, mediaQuery) { + if(typeof modules === "string") + modules = [[null, modules, ""]]; + var alreadyImportedModules = {}; + for(var i = 0; i < this.length; i++) { + var id = this[i][0]; + if(typeof id === "number") + alreadyImportedModules[id] = true; + } + for(i = 0; i < modules.length; i++) { + var item = modules[i]; + // skip already imported module + // this implementation is not 100% perfect for weird media query combinations + // when a module is imported multiple times with different media queries. + // I hope this will never occur (Hey this way we have smaller bundles) + if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) { + if(mediaQuery && !item[2]) { + item[2] = mediaQuery; + } else if(mediaQuery) { + item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; + } + list.push(item); + } + } + }; + return list; +}; + +function cssWithMappingToString(item, useSourceMap) { + var content = item[1] || ''; + var cssMapping = item[3]; + if (!cssMapping) { + return content; + } + + if (useSourceMap && typeof btoa === 'function') { + var sourceMapping = toComment(cssMapping); + var sourceURLs = cssMapping.sources.map(function (source) { + return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */' + }); + + return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); + } + + return [content].join('\n'); +} + +// Adapted from convert-source-map (MIT) +function toComment(sourceMap) { + // eslint-disable-next-line no-undef + var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); + var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; + + return '/*# ' + data + ' */'; +} + + /***/ }), /***/ "./node_modules/jquery/dist/jquery.js": @@ -37868,6 +37974,21379 @@ process.chdir = function (dir) { process.umask = function() { return 0; }; +/***/ }), + +/***/ "./node_modules/style-loader/lib/addStyles.js": +/*!****************************************************!*\ + !*** ./node_modules/style-loader/lib/addStyles.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +var stylesInDom = {}; + +var memoize = function (fn) { + var memo; + + return function () { + if (typeof memo === "undefined") memo = fn.apply(this, arguments); + return memo; + }; +}; + +var isOldIE = memoize(function () { + // Test for IE <= 9 as proposed by Browserhacks + // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805 + // Tests for existence of standard globals is to allow style-loader + // to operate correctly into non-standard environments + // @see https://github.com/webpack-contrib/style-loader/issues/177 + return window && document && document.all && !window.atob; +}); + +var getTarget = function (target, parent) { + if (parent){ + return parent.querySelector(target); + } + return document.querySelector(target); +}; + +var getElement = (function (fn) { + var memo = {}; + + return function(target, parent) { + // If passing function in options, then use it for resolve "head" element. + // Useful for Shadow Root style i.e + // { + // insertInto: function () { return document.querySelector("#foo").shadowRoot } + // } + if (typeof target === 'function') { + return target(); + } + if (typeof memo[target] === "undefined") { + var styleTarget = getTarget.call(this, target, parent); + // Special case to return head of iframe instead of iframe itself + if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { + try { + // This will throw an exception if access to iframe is blocked + // due to cross-origin restrictions + styleTarget = styleTarget.contentDocument.head; + } catch(e) { + styleTarget = null; + } + } + memo[target] = styleTarget; + } + return memo[target] + }; +})(); + +var singleton = null; +var singletonCounter = 0; +var stylesInsertedAtTop = []; + +var fixUrls = __webpack_require__(/*! ./urls */ "./node_modules/style-loader/lib/urls.js"); + +module.exports = function(list, options) { + if (typeof DEBUG !== "undefined" && DEBUG) { + if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment"); + } + + options = options || {}; + + options.attrs = typeof options.attrs === "object" ? options.attrs : {}; + + // Force single-tag solution on IE6-9, which has a hard limit on the # of ' + + '' + + '' + contentsHTML + '' + + '' + ); + } else { + const links = _d.head.getElementsByTagName('link'); + const styles = _d.head.getElementsByTagName('style'); + let linkHTML = ''; + for (let i = 0, len = links.length; i < len; i++) { + linkHTML += links[i].outerHTML; + } + for (let i = 0, len = styles.length; i < len; i++) { + linkHTML += styles[i].outerHTML; + } + + windowObject.document.write('' + + '' + + '' + + '' + + '' + + '' + lang.toolbar.preview + '' + + linkHTML + + '' + + '' + contentsHTML + '' + + '' + ); + } + }, + + /** + * @description Sets the HTML string + * @param {String|undefined} html HTML string + */ + setContents: function (html) { + this.removeRange(); + + const convertValue = (html === null || html === undefined) ? '' : this.convertContentsForEditor(html); + this._resetComponents(); + + if (!this._variable.isCodeView) { + context.element.wysiwyg.innerHTML = convertValue; + // history stack + this.history.push(false); + } else { + const value = this.convertHTMLForCodeView(convertValue); + this._setCodeView(value); + } + }, + + /** + * @description Sets the contents of the iframe's head tag and body tag when using the "iframe" or "fullPage" option. + * @param {Object} ctx { head: HTML string, body: HTML string} + */ + setIframeContents: function (ctx) { + if (!options.iframe) return false; + if (ctx.head) this._wd.head.innerHTML = ctx.head.replace(/[\s\S]*<\/script>/gi, ''); + if (ctx.body) this._wd.body.innerHTML = this.convertContentsForEditor(ctx.body); + }, + + /** + * @description Gets the current contents + * @param {Boolean} onlyContents Return only the contents of the body without headers when the "fullPage" option is true + * @returns {Object} + */ + getContents: function (onlyContents) { + const contents = context.element.wysiwyg.innerHTML; + const renderHTML = util.createElement('DIV'); + renderHTML.innerHTML = contents; + + const figcaptions = util.getListChildren(renderHTML, function (current) { + return /FIGCAPTION/i.test(current.nodeName); + }); + + for (let i = 0, len = figcaptions.length; i < len; i++) { + figcaptions[i].removeAttribute('contenteditable'); + } + + if (options.fullPage && !onlyContents) { + const attrs = util.getAttributesToString(this._wd.body, ['contenteditable']); + return '' + this._wd.head.outerHTML + '' + renderHTML.innerHTML + ''; + } else { + return renderHTML.innerHTML; + } + }, + + /** + * @description Returns HTML string according to tag type and configuration. + * Use only "cleanHTML" + * @param {Node} node Node + * @param {Boolean} requireFormat If true, text nodes that do not have a format node is wrapped with the format tag. + * @private + */ + _makeLine: function (node, requireFormat) { + const defaultTag = options.defaultTag; + // element + if (node.nodeType === 1) { + if (util._disallowedTags(node)) return ''; + if (!requireFormat || (util.isFormatElement(node) || util.isRangeFormatElement(node) || util.isComponent(node) || util.isMedia(node) || (util.isAnchor(node) && util.isMedia(node.firstElementChild)))) { + return node.outerHTML; + } else { + return '<' + defaultTag + '>' + node.outerHTML + ''; + } + } + // text + if (node.nodeType === 3) { + if (!requireFormat) return node.textContent; + const textArray = node.textContent.split(/\n/g); + let html = ''; + for (let i = 0, tLen = textArray.length, text; i < tLen; i++) { + text = textArray[i].trim(); + if (text.length > 0) html += '<' + defaultTag + '>' + text + ''; + } + return html; + } + // comments + if (node.nodeType === 8 && this._allowHTMLComments) { + return ''; + } + + return ''; + }, + + /** + * @description Removes attribute values such as style and converts tags that do not conform to the "html5" standard. + * @param {String} text + * @returns {String} HTML string + * @private + */ + _tagConvertor: function (text) { + if (!this._disallowedTextTagsRegExp) return text; + + const ec = options._textTagsMap; + return text.replace(this._disallowedTextTagsRegExp, function (m, t, n) { + return t + (typeof ec[n] === 'string' ? ec[n] : n); + }); + }, + + /** + * @description Delete disallowed tags + * @param {String} html HTML string + * @returns {String} + * @private + */ + _deleteDisallowedTags: function (html) { + return html + .replace(/\n/g, '') + .replace(/<(script|style)[\s\S]*>[\s\S]*<\/(script|style)>/gi, '') + .replace(/<[a-z0-9]+\:[a-z0-9]+[^>^\/]*>[^>]*<\/[a-z0-9]+\:[a-z0-9]+>/gi, '') + .replace(this.editorTagsWhitelistRegExp, ''); + }, + + /** + * @description Tag and tag attribute check RegExp function. (used by "cleanHTML" and "convertContentsForEditor") + * @param {Boolean} rowLevelCheck Row level check + * @param {String} m RegExp value + * @param {String} t RegExp value + * @returns {String} + * @private + */ + _cleanTags: function (rowLevelCheck, m, t) { + if (/^<[a-z0-9]+\:[a-z0-9]+/i.test(m)) return m; + + let v = null; + const tAttr = this._attributesTagsWhitelist[t.match(/(?!<)[a-zA-Z0-9]+/)[0].toLowerCase()]; + if (tAttr) v = m.match(tAttr); + else v = m.match(this._attributesWhitelistRegExp); + + if ((rowLevelCheck || /]*(?=>)/g, this._cleanTags.bind(this, false)); + + const dom = _d.createRange().createContextualFragment(html); + try { + util._consistencyCheckOfHTML(dom, this._htmlCheckWhitelistRegExp, options.allowStyles); + } catch (error) { + console.warn('[SUNEDITOR.cleanHTML.consistencyCheck.fail] ' + error); + } + + if (this.managedTagsInfo && this.managedTagsInfo.query) { + const textCompList = dom.querySelectorAll(this.managedTagsInfo.query); + for (let i = 0, len = textCompList.length, initMethod, classList; i < len; i++) { + classList = [].slice.call(textCompList[i].classList); + for (let c = 0, cLen = classList.length; c < cLen; c++) { + initMethod = this.managedTagsInfo.map[classList[c]]; + if (initMethod) { + initMethod(textCompList[i]); + break; + } + } + } + } + + const domTree = dom.childNodes; + let cleanHTML = ''; + let requireFormat = false; + + for (let i = 0, len = domTree.length, t; i < len; i++) { + t = domTree[i]; + if (t.nodeType === 1 && !util.isTextStyleElement(t) && !util.isBreak(t) && !util._disallowedTags(t)) { + requireFormat = true; + break; + } + } + + for (let i = 0, len = domTree.length; i < len; i++) { + cleanHTML += this._makeLine(domTree[i], requireFormat); + } + + cleanHTML = util.htmlRemoveWhiteSpace(cleanHTML); + return this._tagConvertor(!cleanHTML ? html : !whitelist ? cleanHTML : cleanHTML.replace(typeof whitelist === 'string' ? util.createTagsWhitelist(whitelist) : whitelist, '')); + }, + + /** + * @description Converts contents into a format that can be placed in an editor + * @param {String} contents contents + * @returns {String} + */ + convertContentsForEditor: function (contents) { + contents = this._deleteDisallowedTags(contents).replace(/(<[a-zA-Z0-9]+)[^>]*(?=>)/g, this._cleanTags.bind(this, true)); + + const dom = _d.createRange().createContextualFragment(this._deleteDisallowedTags(contents)); + + try { + util._consistencyCheckOfHTML(dom, this._htmlCheckWhitelistRegExp, options.allowStyles); + } catch (error) { + console.warn('[SUNEDITOR.convertContentsForEditor.consistencyCheck.fail] ' + error); + } + + if (this.managedTagsInfo && this.managedTagsInfo.query) { + const textCompList = dom.querySelectorAll(this.managedTagsInfo.query); + for (let i = 0, len = textCompList.length, initMethod, classList; i < len; i++) { + classList = [].slice.call(textCompList[i].classList); + for (let c = 0, cLen = classList.length; c < cLen; c++) { + initMethod = this.managedTagsInfo.map[classList[c]]; + if (initMethod) { + initMethod(textCompList[i]); + break; + } + } + } + } + + const domTree = dom.childNodes; + let cleanHTML = ''; + for (let i = 0, len = domTree.length; i < len; i++) { + cleanHTML += this._makeLine(domTree[i], true); + } + + if (cleanHTML.length === 0) return '<' + options.defaultTag + '>
'; + + cleanHTML = util.htmlRemoveWhiteSpace(cleanHTML); + return this._tagConvertor(cleanHTML); + }, + + /** + * @description Converts wysiwyg area element into a format that can be placed in an editor of code view mode + * @param {Element|String} html WYSIWYG element (context.element.wysiwyg) or HTML string. + * @returns {String} + */ + convertHTMLForCodeView: function (html) { + let returnHTML = ''; + const wRegExp = _w.RegExp; + const brReg = new wRegExp('^(BLOCKQUOTE|PRE|TABLE|THEAD|TBODY|TR|TH|TD|OL|UL|IMG|IFRAME|VIDEO|AUDIO|FIGURE|FIGCAPTION|HR|BR|CANVAS|SELECT)$', 'i'); + const isFormatElement = util.isFormatElement.bind(util); + const wDoc = typeof html === 'string' ? _d.createRange().createContextualFragment(html) : html; + + let indentSize = this._variable.codeIndent * 1; + indentSize = indentSize > 0 ? new _w.Array(indentSize + 1).join(' ') : ''; + + (function recursionFunc (element, indent, lineBR) { + const children = element.childNodes; + const elementRegTest = brReg.test(element.nodeName); + const elementIndent = (elementRegTest ? indent : ''); + + for (let i = 0, len = children.length, node, br, nodeRegTest; i < len; i++) { + node = children[i]; + nodeRegTest = brReg.test(node.nodeName); + br = nodeRegTest ? '\n' : ''; + lineBR = isFormatElement(node) && !elementRegTest && !/^(TH|TD)$/i.test(element.nodeName) ? '\n' : ''; + + if (node.nodeType === 8) { + returnHTML += '\n' + br; + continue; + } + if (node.nodeType === 3) { + returnHTML += util._HTMLConvertor((/^\n+$/.test(node.data) ? '' : node.data)); + continue; + } + if (node.childNodes.length === 0) { + returnHTML += (/^HR$/i.test(node.nodeName) ? '\n' : '') + elementIndent + node.outerHTML + br; + continue; + } + + node.innerHTML = node.innerHTML; + const tag = node.nodeName.toLowerCase(); + returnHTML += (lineBR || (elementRegTest ? '' : br)) + (elementIndent || nodeRegTest ? indent : '') + node.outerHTML.match(wRegExp('<' + tag + '[^>]*>', 'i'))[0] + br; + recursionFunc(node, indent + indentSize, ''); + returnHTML += (nodeRegTest ? indent : '') + '' + (lineBR || br || elementRegTest ? '\n' : false || /^(TH|TD)$/i.test(node.nodeName) ? '\n' : ''); + } + }(wDoc, '', '\n')); + + return returnHTML.trim() + '\n'; + }, + + /** + * @description Add an event to document. + * When created as an Iframe, the same event is added to the document in the Iframe. + * @param {String} type Event type + * @param {Function} listener Event listener + * @param {Boolean} useCapture Use event capture + */ + addDocEvent: function (type, listener, useCapture) { + _d.addEventListener(type, listener, useCapture); + if (options.iframe) { + this._wd.addEventListener(type, listener); + } + }, + + /** + * @description Remove events from document. +  * When created as an Iframe, the event of the document inside the Iframe is also removed. + * @param {String} type Event type + * @param {Function} listener Event listener + */ + removeDocEvent: function (type, listener) { + _d.removeEventListener(type, listener); + if (options.iframe) { + this._wd.removeEventListener(type, listener); + } + }, + + /** + * @description The current number of characters is counted and displayed. + * @param {String} inputText Text added. + * @returns {Boolean} + * @private + */ + _charCount: function (inputText) { + const maxCharCount = options.maxCharCount; + const countType = options.charCounterType; + let nextCharCount = 0; + if (!!inputText) nextCharCount = this.getCharLength(inputText, countType); + + this._setCharCount(); + + if (maxCharCount > 0) { + let over = false; + const count = functions.getCharCount(countType); + + if (count > maxCharCount) { + over = true; + if (nextCharCount > 0) { + this._editorRange(); + const range = this.getRange(); + const endOff = range.endOffset - 1; + const text = this.getSelectionNode().textContent; + const slicePosition = range.endOffset - (count - maxCharCount); + + this.getSelectionNode().textContent = text.slice(0, slicePosition < 0 ? 0 : slicePosition) + text.slice(range.endOffset, text.length); + this.setRange(range.endContainer, endOff, range.endContainer, endOff); + } + } else if ((count + nextCharCount) > maxCharCount) { + over = true; + } + + if (over) { + this._callCounterBlink(); + if (nextCharCount > 0) return false; + } + } + + return true; + }, + + /** + * @description When "element" is added, if it is greater than "options.maxCharCount", false is returned. + * @param {Node|String} element Element node or String. + * @param {String|null} charCounterType charCounterType. If it is null, the options.charCounterType + * @returns {Boolean} + */ + checkCharCount: function (element, charCounterType) { + if (options.maxCharCount) { + const countType = charCounterType || options.charCounterType; + const length = this.getCharLength((typeof element === 'string' ? element : this._charTypeHTML ? element.outerHTML : element.textContent), countType); + if (length > 0 && length + functions.getCharCount(countType) > options.maxCharCount) { + this._callCounterBlink(); + return false; + } + } + return true; + }, + + /** + * @description Get the length of the content. + * Depending on the option, the length of the character is taken. (charCounterType) + * @param {String} content Content to count + * @param {String} charCounterType options.charCounterType + * @returns {Number} + */ + getCharLength: function (content, charCounterType) { + return /byte/.test(charCounterType) ? util.getByteLength(content) : content.length; + }, + + /** + * @description Set the char count to charCounter element textContent. + * @private + */ + _setCharCount: function () { + if (context.element.charCounter) { + _w.setTimeout(function () { context.element.charCounter.textContent = functions.getCharCount(options.charCounterType); }); + } + }, + + /** + * @description The character counter blinks. + * @private + */ + _callCounterBlink: function () { + const charWrapper = context.element.charWrapper; + if (charWrapper && !util.hasClass(charWrapper, 'se-blink')) { + util.addClass(charWrapper, 'se-blink'); + _w.setTimeout(function () { + util.removeClass(charWrapper, 'se-blink'); + }, 600); + } + }, + + /** + * @description Check the components such as image and video and modify them according to the format. + * @private + */ + _checkComponents: function () { + for (let i = 0, len = this._fileInfoPluginsCheck.length; i < len; i++) { + this._fileInfoPluginsCheck[i](); + } + }, + + /** + * @description Initialize the information of the components. + * @private + */ + _resetComponents: function () { + for (let i = 0, len = this._fileInfoPluginsReset.length; i < len; i++) { + this._fileInfoPluginsReset[i](); + } + }, + + /** + * @description Set method in the code view area + * @param {String} value HTML string + * @private + */ + _setCodeView: function (value) { + if (options.codeMirrorEditor) { + options.codeMirrorEditor.getDoc().setValue(value); + } else { + context.element.code.value = value; + } + }, + + /** + * @description Get method in the code view area + * @private + */ + _getCodeView: function () { + return options.codeMirrorEditor ? options.codeMirrorEditor.getDoc().getValue() : context.element.code.value; + }, + + /** + * @description Initializ core variable + * @param {Boolean} reload Is relooad? + * @param {String} _initHTML initial html string + * @private + */ + _init: function (reload, _initHTML) { + const wRegExp = _w.RegExp; + this._ww = options.iframe ? context.element.wysiwygFrame.contentWindow : _w; + this._wd = _d; + this._charTypeHTML = options.charCounterType === 'byte-html'; + + if (!options.iframe && typeof _w.ShadowRoot === 'function') { + let child = context.element.wysiwygFrame; + while (child) { + if (child.shadowRoot) { + this._shadowRoot = child.shadowRoot; + break; + } else if (child instanceof _w.ShadowRoot) { + this._shadowRoot = child; + break; + } + child = child.parentNode; + } + if (this._shadowRoot) this._shadowRootControllerEventTarget = []; + } + + // set disallow text nodes + const disallowTextTags = _w.Object.keys(options._textTagsMap); + const allowTextTags = !options.addTagsWhitelist ? [] : options.addTagsWhitelist.split('|').filter(function (v) { return /b|i|ins|s|strike/i.test(v); }); + for (let i = 0; i < allowTextTags.length; i++) { + disallowTextTags.splice(disallowTextTags.indexOf(allowTextTags[i].toLowerCase()), 1); + } + this._disallowedTextTagsRegExp = disallowTextTags.length === 0 ? null : new wRegExp('(<\\/?)(' + disallowTextTags.join('|') + ')\\b\\s*(?:[^>^<]+)?\\s*(?=>)', 'gi'); + + // set whitelist + const defaultAttr = 'contenteditable|colspan|rowspan|target|href|download|rel|src|alt|class|type|controls|data-format|data-size|data-file-size|data-file-name|data-origin|data-align|data-image-link|data-rotate|data-proportion|data-percentage|origin-size|data-exp|data-font-size'; + this._allowHTMLComments = options._editorTagsWhitelist.indexOf('//') > -1; + this._htmlCheckWhitelistRegExp = new wRegExp('^(' + options._editorTagsWhitelist.replace('|//', '') + ')$', 'i'); + this.editorTagsWhitelistRegExp = util.createTagsWhitelist(options._editorTagsWhitelist.replace('|//', '|')); + this.pasteTagsWhitelistRegExp = util.createTagsWhitelist(options.pasteTagsWhitelist); + + const _attr = options.attributesWhitelist; + const tagsAttr = {}; + let allAttr = ''; + if (!!_attr) { + for (let k in _attr) { + if (!util.hasOwn(_attr, k)) continue; + if (k === 'all') { + allAttr = _attr[k] + '|'; + } else { + tagsAttr[k] = new wRegExp('((?:' + _attr[k] + '|' + defaultAttr + ')\s*=\s*"[^"]*")', 'ig'); + } + } + } + + this._attributesWhitelistRegExp = new wRegExp('((?:' + allAttr + defaultAttr + ')\s*=\s*"[^"]*")', 'ig'); + this._attributesTagsWhitelist = tagsAttr; + + // set modes + this._isInline = /inline/i.test(options.mode); + this._isBalloon = /balloon|balloon-always/i.test(options.mode); + this._isBalloonAlways = /balloon-always/i.test(options.mode); + + // caching buttons + this._cachingButtons(); + + // file components + this._fileInfoPluginsCheck = []; + this._fileInfoPluginsReset = []; + + // text components + this.managedTagsInfo = { query: '', map: {} }; + const managedClass = []; + + // Command and file plugins registration + this.activePlugins = []; + this._fileManager.tags = []; + this._fileManager.pluginMap = {}; + + let filePluginRegExp = []; + let plugin, button; + for (let key in plugins) { + if (!util.hasOwn(plugins, key)) continue; + plugin = plugins[key]; + button = pluginCallButtons[key]; + if (plugin.active && button) { + this.callPlugin(key, null, button); + } + if (typeof plugin.checkFileInfo === 'function' && typeof plugin.resetFileInfo === 'function') { + this.callPlugin(key, null, button); + this._fileInfoPluginsCheck.push(plugin.checkFileInfo.bind(this)); + this._fileInfoPluginsReset.push(plugin.resetFileInfo.bind(this)); + } + if (_w.Array.isArray(plugin.fileTags)) { + const fileTags = plugin.fileTags; + this.callPlugin(key, null, button); + this._fileManager.tags = this._fileManager.tags.concat(fileTags); + filePluginRegExp.push(key); + for (let tag = 0, tLen = fileTags.length; tag < tLen; tag++) { + this._fileManager.pluginMap[fileTags[tag].toLowerCase()] = key; + } + } + if (plugin.managedTags) { + const info = plugin.managedTags(); + managedClass.push('.' + info.className); + this.managedTagsInfo.map[info.className] = info.method.bind(this); + } + } + + this.managedTagsInfo.query = managedClass.toString(); + this._fileManager.queryString = this._fileManager.tags.join(','); + this._fileManager.regExp = new wRegExp('^(' + this._fileManager.tags.join('|') + ')$', 'i'); + this._fileManager.pluginRegExp = new wRegExp('^(' + (filePluginRegExp.length === 0 ? 'undefined' : filePluginRegExp.join('|')) + ')$', 'i'); + + // cache editor's element + this._variable._originCssText = context.element.topArea.style.cssText; + this._placeholder = context.element.placeholder; + this._lineBreaker = context.element.lineBreaker; + this._lineBreakerButton = this._lineBreaker.querySelector('button'); + + // Excute history function + this.history = Object(_history__WEBPACK_IMPORTED_MODULE_2__["default"])(this, this._onChange_historyStack.bind(this)); + + // register notice module + this.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_4__["default"]]); + + // Init, validate + if (options.iframe) { + this._wd = context.element.wysiwygFrame.contentDocument; + context.element.wysiwyg = this._wd.body; + if (options._editorStyles.editor) context.element.wysiwyg.style.cssText = options._editorStyles.editor; + if (options.height === 'auto') this._iframeAuto = this._wd.body; + } + + this._initWysiwygArea(reload, _initHTML); + }, + + /** + * @description Caching basic buttons to use + * @private + */ + _cachingButtons: function () { + this.codeViewDisabledButtons = context.element.toolbar.querySelectorAll('.se-toolbar button:not([class~="se-code-view-enabled"])'); + this.resizingDisabledButtons = context.element.toolbar.querySelectorAll('.se-toolbar button:not([class~="se-resizing-enabled"])'); + const tool = context.tool; + this.commandMap = { + SUB: tool.subscript, + SUP: tool.superscript, + OUTDENT: tool.outdent, + INDENT: tool.indent + }; + this.commandMap[options.textTags.bold.toUpperCase()] = tool.bold; + this.commandMap[options.textTags.underline.toUpperCase()] = tool.underline; + this.commandMap[options.textTags.italic.toUpperCase()] = tool.italic; + this.commandMap[options.textTags.strike.toUpperCase()] = tool.strike; + + this._styleCommandMap = { + fullScreen: tool.fullScreen, + showBlocks: tool.showBlocks, + codeView: tool.codeView + }; + }, + + /** + * @description Initializ wysiwyg area (Only called from core._init) + * @param {Boolean} reload Is relooad? + * @param {String} _initHTML initial html string + * @private + */ + _initWysiwygArea: function (reload, _initHTML) { + context.element.wysiwyg.innerHTML = reload ? _initHTML : this.convertContentsForEditor(typeof _initHTML === 'string' ? _initHTML : context.element.originElement.value); + }, + + /** + * @description Called when there are changes to tags in the wysiwyg region. + * @private + */ + _resourcesStateChange: function () { + this._iframeAutoHeight(); + this._checkPlaceholder(); + }, + + /** + * @description Called when after execute "history.push" + * @private + */ + _onChange_historyStack: function () { + event._applyTagEffects(); + core._variable.isChanged = true; + if (context.tool.save) context.tool.save.removeAttribute('disabled'); + if (functions.onChange) functions.onChange(this.getContents(true), this); + if (context.element.toolbar.style.display === 'block') event._showToolbarBalloon(); + }, + + /** + * @description Modify the height value of the iframe when the height of the iframe is automatic. + * @private + */ + _iframeAutoHeight: function () { + if (this._iframeAuto) { + _w.setTimeout(function () { context.element.wysiwygFrame.style.height = core._iframeAuto.offsetHeight + 'px'; }); + } + }, + + /** + * @description Set display property when there is placeholder. + * @private + */ + _checkPlaceholder: function () { + if (this._placeholder) { + if (this._variable.isCodeView) { + this._placeholder.style.display = 'none'; + return; + } + + const wysiwyg = context.element.wysiwyg; + if (!util.onlyZeroWidthSpace(wysiwyg.textContent) || wysiwyg.querySelector('.se-component, pre, blockquote, hr, li, table, img, iframe, video') || (wysiwyg.innerText.match(/\n/g) || '').length > 1) { + this._placeholder.style.display = 'none'; + } else { + this._placeholder.style.display = 'block'; + } + } + }, + + /** + * @description If there is no default format, add a format and move "selection". + * @param {String|null} formatName Format tag name (default: 'P') + * @private + */ + _setDefaultFormat: function (formatName) { + if (this._fileManager.pluginRegExp.test(this.currentControllerName)) return; + + const range = this.getRange(); + const commonCon = range.commonAncestorContainer; + const startCon = range.startContainer; + const rangeEl = util.getRangeFormatElement(commonCon, null); + let focusNode, offset, format; + + const fileComponent = util.getParentElement(commonCon, util.isComponent); + if (fileComponent && !util.isTable(fileComponent)) return; + if((util.isRangeFormatElement(startCon) || util.isWysiwygDiv(startCon)) && util.isComponent(startCon.childNodes[range.startOffset])) return; + + if (rangeEl) { + format = util.createElement(formatName || options.defaultTag); + format.innerHTML = rangeEl.innerHTML; + if (format.childNodes.length === 0) format.innerHTML = util.zeroWidthSpace; + + rangeEl.innerHTML = format.outerHTML; + format = rangeEl.firstChild; + focusNode = util.getEdgeChildNodes(format, null).sc; + + if (!focusNode) { + focusNode = util.createTextNode(util.zeroWidthSpace); + format.insertBefore(focusNode, format.firstChild); + } + + offset = focusNode.textContent.length; + this.setRange(focusNode, offset, focusNode, offset); + return; + } + + if(util.isRangeFormatElement(commonCon) && (commonCon.childNodes.length <= 1)) { + let br = null; + if (commonCon.childNodes.length === 1 && util.isBreak(commonCon.firstChild)) { + br = commonCon.firstChild; + } else { + br = util.createTextNode(util.zeroWidthSpace); + commonCon.appendChild(br); + } + + this.setRange(br, 1, br, 1); + return; + } + + this.execCommand('formatBlock', false, (formatName || options.defaultTag)); + focusNode = util.getEdgeChildNodes(commonCon, commonCon); + focusNode = focusNode ? focusNode.ec : commonCon; + + format = util.getFormatElement(focusNode, null); + if (!format) { + this.removeRange(); + this._editorRange(); + return; + } + + if (util.isBreak(format.nextSibling)) util.removeItem(format.nextSibling); + if (util.isBreak(format.previousSibling)) util.removeItem(format.previousSibling); + if (util.isBreak(focusNode)) { + const zeroWidth = util.createTextNode(util.zeroWidthSpace); + focusNode.parentNode.insertBefore(zeroWidth, focusNode); + focusNode = zeroWidth; + } + + this.effectNode = null; + this.nativeFocus(); + }, + + /** + * @description Initialization after "setOptions" + * @param {Object} el context.element + * @param {String} _initHTML Initial html string + * @private + */ + _setOptionsInit: function (el, _initHTML) { + this.context = context = Object(_context__WEBPACK_IMPORTED_MODULE_1__["default"])(el.originElement, this._getConstructed(el), options); + this._componentsInfoReset = true; + this._editorInit(true, _initHTML); + }, + + /** + * @description Initializ editor + * @param {Boolean} reload Is relooad? + * @param {String} _initHTML initial html string + * @private + */ + _editorInit: function (reload, _initHTML) { + // initialize core and add event listeners + this._init(reload, _initHTML); + event._addEvent(); + this._setCharCount(); + event._offStickyToolbar(); + event.onResize_window(); + + // toolbar visibility + context.element.toolbar.style.visibility = ''; + + this._checkComponents(); + this._componentsInfoInit = false; + this._componentsInfoReset = false; + + this.history.reset(true); + this._resourcesStateChange(); + + _w.setTimeout(function () { + if (typeof functions.onload === 'function') functions.onload(core, reload); + }); + }, + + /** + * @description Create and return an object to cache the new context. + * @param {Element} contextEl context.element + * @returns {Object} + * @private + */ + _getConstructed: function (contextEl) { + return { + _top: contextEl.topArea, + _relative: contextEl.relative, + _toolBar: contextEl.toolbar, + _menuTray: contextEl._menuTray, + _editorArea: contextEl.editorArea, + _wysiwygArea: contextEl.wysiwygFrame, + _codeArea: contextEl.code, + _placeholder: contextEl.placeholder, + _resizingBar: contextEl.resizingBar, + _navigation: contextEl.navigation, + _charCounter: contextEl.charCounter, + _charWrapper: contextEl.charWrapper, + _loading: contextEl.loading, + _lineBreaker: contextEl.lineBreaker, + _lineBreaker_t: contextEl.lineBreaker_t, + _lineBreaker_b: contextEl.lineBreaker_b, + _resizeBack: contextEl.resizeBackground, + _stickyDummy: contextEl._stickyDummy, + _arrow: contextEl._arrow + }; + } + }; + + /** + * @description event function + */ + const event = { + _IEisComposing: false, // In IE, there is no "e.isComposing" in the key-up event. + _lineBreakerBind: null, + _responsiveCurrentSize: 'default', + _responsiveButtonSize: null, + _responsiveButtons: null, + _directionKeyCode: new _w.RegExp('^(8|13|3[2-9]|40|46)$'), + _nonTextKeyCode: new _w.RegExp('^(8|13|1[6-9]|20|27|3[3-9]|40|45|46|11[2-9]|12[0-3]|144|145)$'), + _historyIgnoreKeyCode: new _w.RegExp('^(1[6-9]|20|27|3[3-9]|40|45|11[2-9]|12[0-3]|144|145)$'), + _onButtonsCheck: new _w.RegExp('^(' + _w.Object.keys(options._textTagsMap).join('|') + ')$', 'i'), + _frontZeroWidthReg: new _w.RegExp(util.zeroWidthSpace + '+', ''), + _keyCodeShortcut: { + 65: 'A', + 66: 'B', + 83: 'S', + 85: 'U', + 73: 'I', + 89: 'Y', + 90: 'Z', + 219: '[', + 221: ']' + }, + + _shortcutCommand: function (keyCode, shift) { + let command = null; + const keyStr = event._keyCodeShortcut[keyCode]; + + switch (keyStr) { + case 'A': + command = 'selectAll'; + break; + case 'B': + if (options.shortcutsDisable.indexOf('bold') === -1) { + command = 'bold'; + } + break; + case 'S': + if (shift && options.shortcutsDisable.indexOf('strike') === -1) { + command = 'strike'; + } else if (!shift && options.shortcutsDisable.indexOf('save') === -1) { + command = 'save'; + } + break; + case 'U': + if (options.shortcutsDisable.indexOf('underline') === -1) { + command = 'underline'; + } + break; + case 'I': + if (options.shortcutsDisable.indexOf('italic') === -1) { + command = 'italic'; + } + break; + case 'Z': + if (options.shortcutsDisable.indexOf('undo') === -1) { + if (shift) { + command = 'redo'; + } else { + command = 'undo'; + } + } + break; + case 'Y': + if (options.shortcutsDisable.indexOf('undo') === -1) { + command = 'redo'; + } + break; + case '[': + if (options.shortcutsDisable.indexOf('indent') === -1) { + command = options.rtl ? 'indent' : 'outdent'; + } + break; + case ']': + if (options.shortcutsDisable.indexOf('indent') === -1) { + command = options.rtl ? 'outdent' : 'indent'; + } + break; + } + + if (!command) return false; + + core.commandHandler(core.commandMap[command], command); + return true; + }, + + _applyTagEffects: function () { + let selectionNode = core.getSelectionNode(); + if (selectionNode === core.effectNode) return; + core.effectNode = selectionNode; + + const marginDir = options.rtl ? 'marginRight' : 'marginLeft'; + const commandMap = core.commandMap; + const classOnCheck = this._onButtonsCheck; + const commandMapNodes = []; + const currentNodes = []; + + const activePlugins = core.activePlugins; + const cLen = activePlugins.length; + let nodeName = ''; + + while (selectionNode.firstChild) { + selectionNode = selectionNode.firstChild; + } + + for (let element = selectionNode; !util.isWysiwygDiv(element); element = element.parentNode) { + if (!element) break; + if (element.nodeType !== 1 || util.isBreak(element)) continue; + nodeName = element.nodeName.toUpperCase(); + currentNodes.push(nodeName); + + /* Active plugins */ + for (let c = 0, name; c < cLen; c++) { + name = activePlugins[c]; + if (commandMapNodes.indexOf(name) === -1 && plugins[name].active.call(core, element)) { + commandMapNodes.push(name); + } + } + + if (util.isFormatElement(element)) { + /* Outdent */ + if (commandMapNodes.indexOf('OUTDENT') === -1 && commandMap.OUTDENT) { + if (util.isListCell(element) || (element.style[marginDir] && util.getNumber(element.style[marginDir], 0) > 0)) { + commandMapNodes.push('OUTDENT'); + commandMap.OUTDENT.removeAttribute('disabled'); + } + } + + /* Indent */ + if (commandMapNodes.indexOf('INDENT') === -1 && commandMap.INDENT && util.isListCell(element) && !element.previousElementSibling) { + commandMapNodes.push('INDENT'); + commandMap.INDENT.setAttribute('disabled', true); + } + + continue; + } + + /** default active buttons [strong, ins, em, del, sub, sup] */ + if (classOnCheck.test(nodeName)) { + commandMapNodes.push(nodeName); + util.addClass(commandMap[nodeName], 'active'); + } + } + + /** remove class, display text */ + for (let key in commandMap) { + if (commandMapNodes.indexOf(key) > -1 || !util.hasOwn(commandMap, key)) continue; + if (activePlugins.indexOf(key) > -1) { + plugins[key].active.call(core, null); + } else if (commandMap.OUTDENT && /^OUTDENT$/i.test(key)) { + commandMap.OUTDENT.setAttribute('disabled', true); + } else if (commandMap.INDENT && /^INDENT$/i.test(key)) { + commandMap.INDENT.removeAttribute('disabled'); + } else { + util.removeClass(commandMap[key], 'active'); + } + } + + /** save current nodes */ + core._variable.currentNodes = currentNodes.reverse(); + core._variable.currentNodesMap = commandMapNodes; + + /** Displays the current node structure to resizingBar */ + if (options.showPathLabel) context.element.navigation.textContent = core._variable.currentNodes.join(' > '); + }, + + _cancelCaptionEdit: function () { + this.setAttribute('contenteditable', false); + this.removeEventListener('blur', event._cancelCaptionEdit); + }, + + _buttonsEventHandler: function (e) { + let target = e.target; + if (core._bindControllersOff) e.stopPropagation(); + + if (/^(input|textarea|select|option)$/i.test(target.nodeName)) { + core._antiBlur = false; + } else { + e.preventDefault(); + } + + if (util.getParentElement(target, '.se-submenu')) { + e.stopPropagation(); + core._notHideToolbar = true; + } else { + let command = target.getAttribute('data-command'); + let className = target.className; + + while (!command && !/se-menu-list/.test(className) && !/sun-editor-common/.test(className)) { + target = target.parentNode; + command = target.getAttribute('data-command'); + className = target.className; + } + + if (command === core._submenuName || command === core._containerName) { + e.stopPropagation(); + } + } + }, + + onClick_toolbar: function (e) { + let target = e.target; + let display = target.getAttribute('data-display'); + let command = target.getAttribute('data-command'); + let className = target.className; + + while (target.parentNode && !command && !/se-menu-list/.test(className) && !/se-toolbar/.test(className)) { + target = target.parentNode; + command = target.getAttribute('data-command'); + display = target.getAttribute('data-display'); + className = target.className; + } + + if (!command && !display) return; + if (target.disabled) return; + if (!core.hasFocus) core.nativeFocus(); + if (!core._variable.isCodeView) core._editorRange(); + + core.actionCall(command, display, target); + }, + + onMouseDown_wysiwyg: function (e) { + if (util.isNonEditable(context.element.wysiwyg)) return; + + const tableCell = util.getParentElement(e.target, util.isCell); + if (tableCell) { + const tablePlugin = core.plugins.table; + if (tablePlugin && tableCell !== tablePlugin._fixedCell && !tablePlugin._shift) { + core.callPlugin('table', function () { + tablePlugin.onTableCellMultiSelect.call(core, tableCell, false); + }, null); + } + } + + if (core._isBalloon) { + event._hideToolbar(); + } + + if (/FIGURE/i.test(e.target.nodeName)) e.preventDefault(); + if (typeof functions.onMouseDown === 'function') functions.onMouseDown(e, core); + }, + + onClick_wysiwyg: function (e) { + const targetElement = e.target; + if (util.isNonEditable(context.element.wysiwyg)) return; + + const fileComponentInfo = core.getFileComponent(targetElement); + if (fileComponentInfo) { + e.preventDefault(); + core.selectComponent(fileComponentInfo.target, fileComponentInfo.pluginName); + return; + } + + const figcaption = util.getParentElement(targetElement, 'FIGCAPTION'); + if (util.isNonEditable(figcaption)) { + e.preventDefault(); + figcaption.setAttribute('contenteditable', true); + figcaption.focus(); + + if (core._isInline && !core._inlineToolbarAttr.isShow) { + event._showToolbarInline(); + + const hideToolbar = function () { + event._hideToolbar(); + figcaption.removeEventListener('blur', hideToolbar); + }; + + figcaption.addEventListener('blur', hideToolbar); + } + } + + _w.setTimeout(core._editorRange.bind(core)); + core._editorRange(); + + const selectionNode = core.getSelectionNode(); + const formatEl = util.getFormatElement(selectionNode, null); + const rangeEl = util.getRangeFormatElement(selectionNode, null); + if ((!formatEl || formatEl === rangeEl) && !util.isNonEditable(targetElement) && !util.isList(rangeEl)) { + const range = core.getRange(); + if (util.getFormatElement(range.startContainer) === util.getFormatElement(range.endContainer)) { + if (util.isList(rangeEl)) { + e.preventDefault(); + const oLi = util.createElement('LI'); + const prevLi = selectionNode.nextElementSibling; + oLi.appendChild(selectionNode); + rangeEl.insertBefore(oLi, prevLi); + core.focus(); + } else if (!util.isWysiwygDiv(selectionNode) && !util.isComponent(selectionNode) && (!util.isTable(selectionNode) || util.isCell(selectionNode))) { + e.preventDefault(); + core._setDefaultFormat(util.isRangeFormatElement(rangeEl) ? 'DIV' : options.defaultTag); + core.focus(); + } else { + event._applyTagEffects(); + } + } + } else { + event._applyTagEffects(); + } + + if (core._isBalloon) _w.setTimeout(event._toggleToolbarBalloon); + if (typeof functions.onClick === 'function') functions.onClick(e, core); + }, + + _balloonDelay: null, + _showToolbarBalloonDelay: function () { + if (event._balloonDelay) { + _w.clearTimeout(event._balloonDelay); + } + + event._balloonDelay = _w.setTimeout(function () { + _w.clearTimeout(this._balloonDelay); + this._balloonDelay = null; + this._showToolbarBalloon(); + }.bind(event), 350); + }, + + _toggleToolbarBalloon: function () { + core._editorRange(); + const range = core.getRange(); + if (core._bindControllersOff || (!core._isBalloonAlways && range.collapsed)) event._hideToolbar(); + else event._showToolbarBalloon(range); + }, + + _showToolbarBalloon: function (rangeObj) { + if (!core._isBalloon) return; + + const range = rangeObj || core.getRange(); + const toolbar = context.element.toolbar; + const topArea = context.element.topArea; + const selection = core.getSelection(); + + let isDirTop; + if (core._isBalloonAlways && range.collapsed) { + isDirTop = true; + } else if (selection.focusNode === selection.anchorNode) { + isDirTop = selection.focusOffset < selection.anchorOffset; + } else { + const childNodes = util.getListChildNodes(range.commonAncestorContainer, null); + isDirTop = util.getArrayIndex(childNodes, selection.focusNode) < util.getArrayIndex(childNodes, selection.anchorNode); + } + + let rects = range.getClientRects(); + rects = rects[isDirTop ? 0 : rects.length - 1]; + + const globalScroll = core.getGlobalScrollOffset(); + let scrollLeft = globalScroll.left; + let scrollTop = globalScroll.top; + + const editorWidth = topArea.offsetWidth; + const offsets = event._getEditorOffsets(null); + const stickyTop = offsets.top; + const editorLeft = offsets.left; + + toolbar.style.top = '-10000px'; + toolbar.style.visibility = 'hidden'; + toolbar.style.display = 'block'; + + if (!rects) { + const node = core.getSelectionNode(); + if (util.isFormatElement(node)) { + const zeroWidth = util.createTextNode(util.zeroWidthSpace); + core.insertNode(zeroWidth, null, false); + core.setRange(zeroWidth, 1, zeroWidth, 1); + core._editorRange(); + rects = core.getRange().getClientRects(); + rects = rects[isDirTop ? 0 : rects.length - 1]; + } + + if (!rects) { + const nodeOffset = util.getOffset(node, context.element.wysiwygFrame); + rects = { + left: nodeOffset.left, + top: nodeOffset.top, + right: nodeOffset.left, + bottom: nodeOffset.top + node.offsetHeight, + noText: true + }; + scrollLeft = 0; + scrollTop = 0; + } + + isDirTop = true; + } + + const arrowMargin = _w.Math.round(context.element._arrow.offsetWidth / 2); + const toolbarWidth = toolbar.offsetWidth; + const toolbarHeight = toolbar.offsetHeight; + const iframeRects = /iframe/i.test(context.element.wysiwygFrame.nodeName) ? context.element.wysiwygFrame.getClientRects()[0] : null; + if (iframeRects) { + rects = { + left: rects.left + iframeRects.left, + top: rects.top + iframeRects.top, + right: rects.right + iframeRects.right - iframeRects.width, + bottom: rects.bottom + iframeRects.bottom - iframeRects.height + }; + } + + event._setToolbarOffset(isDirTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop, arrowMargin); + if (toolbarWidth !== toolbar.offsetWidth || toolbarHeight !== toolbar.offsetHeight) { + event._setToolbarOffset(isDirTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop, arrowMargin); + } + + if (options.toolbarContainer) { + const editorParent = topArea.parentElement; + + let container = options.toolbarContainer; + let left = container.offsetLeft; + let top = container.offsetTop; + + while(!container.parentElement.contains(editorParent) || !/^(BODY|HTML)$/i.test(container.parentElement.nodeName)) { + container = container.offsetParent; + left += container.offsetLeft; + top += container.offsetTop; + } + + toolbar.style.left = (toolbar.offsetLeft - left + topArea.offsetLeft) + 'px'; + toolbar.style.top = (toolbar.offsetTop - top + topArea.offsetTop) + 'px'; + } + + toolbar.style.visibility = ''; + }, + + _setToolbarOffset: function (isDirTop, rects, toolbar, editorLeft, editorWidth, scrollLeft, scrollTop, stickyTop, arrowMargin) { + const padding = 1; + const toolbarWidth = toolbar.offsetWidth; + const toolbarHeight = rects.noText && !isDirTop ? 0 : toolbar.offsetHeight; + + const absoluteLeft = (isDirTop ? rects.left : rects.right) - editorLeft - (toolbarWidth / 2) + scrollLeft; + const overRight = absoluteLeft + toolbarWidth - editorWidth; + + let t = (isDirTop ? rects.top - toolbarHeight - arrowMargin : rects.bottom + arrowMargin) - (rects.noText ? 0 : stickyTop) + scrollTop; + let l = absoluteLeft < 0 ? padding : overRight < 0 ? absoluteLeft : absoluteLeft - overRight - padding - 1; + + let resetTop = false; + const space = t + (isDirTop ? (event._getEditorOffsets(null).top) : (toolbar.offsetHeight - context.element.wysiwyg.offsetHeight)); + if (!isDirTop && space > 0 && event._getPageBottomSpace() < space) { + isDirTop = true; + resetTop = true; + } else if (isDirTop && _d.documentElement.offsetTop > space) { + isDirTop = false; + resetTop = true; + } + + if (resetTop) t = (isDirTop ? rects.top - toolbarHeight - arrowMargin : rects.bottom + arrowMargin) - (rects.noText ? 0 : stickyTop) + scrollTop; + + toolbar.style.left = _w.Math.floor(l) + 'px'; + toolbar.style.top = _w.Math.floor(t) + 'px'; + + if (isDirTop) { + util.removeClass(context.element._arrow, 'se-arrow-up'); + util.addClass(context.element._arrow, 'se-arrow-down'); + context.element._arrow.style.top = toolbarHeight + 'px'; + } else { + util.removeClass(context.element._arrow, 'se-arrow-down'); + util.addClass(context.element._arrow, 'se-arrow-up'); + context.element._arrow.style.top = -arrowMargin + 'px'; + } + + const arrow_left = _w.Math.floor((toolbarWidth / 2) + (absoluteLeft - l)); + context.element._arrow.style.left = (arrow_left + arrowMargin > toolbar.offsetWidth ? toolbar.offsetWidth - arrowMargin : arrow_left < arrowMargin ? arrowMargin : arrow_left) + 'px'; + }, + + _showToolbarInline: function () { + if (!core._isInline) return; + + const toolbar = context.element.toolbar; + if (options.toolbarContainer) toolbar.style.position = 'relative'; + else toolbar.style.position = 'absolute'; + + toolbar.style.visibility = 'hidden'; + toolbar.style.display = 'block'; + core._inlineToolbarAttr.width = toolbar.style.width = options.toolbarWidth; + core._inlineToolbarAttr.top = toolbar.style.top = (options.toolbarContainer ? 0 : (-1 - toolbar.offsetHeight)) + 'px'; + + if (typeof functions.showInline === 'function') functions.showInline(toolbar, context, core); + + event.onScroll_window(); + core._inlineToolbarAttr.isShow = true; + toolbar.style.visibility = ''; + }, + + _hideToolbar: function () { + if (!core._notHideToolbar && !core._variable.isFullScreen) { + context.element.toolbar.style.display = 'none'; + core._inlineToolbarAttr.isShow = false; + } + }, + + onInput_wysiwyg: function (e) { + core._editorRange(); + + const data = (e.data === null ? '' : e.data === undefined ? ' ' : e.data) || ''; + if (!core._charCount(data)) { + e.preventDefault(); + e.stopPropagation(); + } + + // history stack + core.history.push(true); + + if (typeof functions.onInput === 'function') functions.onInput(e, core); + }, + + _isUneditableNode: function (range, isFront) { + const container = isFront ? range.startContainer : range.endContainer; + const offset = isFront ? range.startOffset : range.endOffset; + const siblingKey = isFront ? 'previousSibling' : 'nextSibling'; + const isElement = container.nodeType === 1; + let siblingNode; + + if (isElement) { + siblingNode = event._isUneditableNode_getSibling(container.childNodes[offset], siblingKey, container); + return siblingNode && siblingNode.nodeType === 1 && siblingNode.getAttribute('contenteditable') === 'false'; + } else { + siblingNode = event._isUneditableNode_getSibling(container, siblingKey, container); + return core.isEdgePoint(container, offset, isFront ? 'front' : 'end') && (siblingNode && siblingNode.nodeType === 1 && siblingNode.getAttribute('contenteditable') === 'false'); + } + }, + + _isUneditableNode_getSibling: function (selectNode, siblingKey, container) { + if (!selectNode) return null; + let siblingNode = selectNode[siblingKey]; + + if (!siblingNode) { + siblingNode = util.getFormatElement(container); + siblingNode = siblingNode ? siblingNode[siblingKey] : null; + if (siblingNode && !util.isComponent(siblingNode)) siblingNode = siblingKey === 'previousSibling' ? siblingNode.firstElementChild : siblingNode.lastElementChild; + else return null; + } + + return siblingNode; + }, + + _onShortcutKey: false, + onKeyDown_wysiwyg: function (e) { + const keyCode = e.keyCode; + const shift = e.shiftKey; + const ctrl = e.ctrlKey || e.metaKey || keyCode === 91 || keyCode === 92 || keyCode === 224; + const alt = e.altKey; + event._IEisComposing = keyCode === 229; + + core.submenuOff(); + + if (core._isBalloon) { + event._hideToolbar(); + } + + /** Shortcuts */ + if (ctrl && event._shortcutCommand(keyCode, shift)) { + event._onShortcutKey = true; + e.preventDefault(); + e.stopPropagation(); + return false; + } else if (event._onShortcutKey) { + event._onShortcutKey = false; + } + + /** default key action */ + let selectionNode = core.getSelectionNode(); + const range = core.getRange(); + const selectRange = !range.collapsed || range.startContainer !== range.endContainer; + const fileComponentName = core._fileManager.pluginRegExp.test(core.currentControllerName) ? core.currentControllerName : ''; + let formatEl = util.getFormatElement(selectionNode, null) || selectionNode; + let rangeEl = util.getRangeFormatElement(formatEl, null); + + switch (keyCode) { + case 8: /** backspace key */ + if (!selectRange) { + if (fileComponentName) { + e.preventDefault(); + e.stopPropagation(); + core.plugins[fileComponentName].destroy.call(core); + break; + } + } + + if (selectRange && event._hardDelete()) { + e.preventDefault(); + e.stopPropagation(); + break; + } + + if (!util.isFormatElement(formatEl) && !context.element.wysiwyg.firstElementChild && !util.isComponent(selectionNode)) { + e.preventDefault(); + e.stopPropagation(); + core._setDefaultFormat(options.defaultTag); + return false; + } + + if (!selectRange && !formatEl.previousElementSibling && (range.startOffset === 0 && !selectionNode.previousSibling && !util.isListCell(formatEl) && + (util.isFormatElement(formatEl) && (!util.isFreeFormatElement(formatEl) || util.isClosureFreeFormatElement(formatEl))))) { + // closure range + if (util.isClosureRangeFormatElement(formatEl.parentNode)) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + // maintain default format + if (util.isWysiwygDiv(formatEl.parentNode) && formatEl.childNodes.length <= 1 && (!formatEl.firstChild || util.onlyZeroWidthSpace(formatEl.textContent))) { + e.preventDefault(); + e.stopPropagation(); + + if (formatEl.nodeName.toUpperCase() === options.defaultTag.toUpperCase()) { + formatEl.innerHTML = '
'; + const attrs = formatEl.attributes; + while (attrs[0]) { + formatEl.removeAttribute(attrs[0].name); + } + } else { + const defaultFormat = util.createElement(options.defaultTag); + defaultFormat.innerHTML = '
'; + formatEl.parentElement.replaceChild(defaultFormat, formatEl); + } + + core.nativeFocus(); + return false; + } + } + + // clean remove tag + if (formatEl && range.startContainer === range.endContainer && selectionNode.nodeType === 3 && !util.isFormatElement(selectionNode.parentNode)) { + if (range.collapsed ? selectionNode.textContent.length === 1 : (range.endOffset - range.startOffset) === selectionNode.textContent.length) { + e.preventDefault(); + + let offset = null; + let prev = selectionNode.parentNode.previousSibling; + const next = selectionNode.parentNode.nextSibling; + if (!prev) { + if (!next) { + prev = util.createElement('BR'); + formatEl.appendChild(prev); + } else { + prev = next; + offset = 0; + } + } + + selectionNode.textContent = ''; + util.removeItemAllParents(selectionNode, null, formatEl); + offset = typeof offset === 'number' ? offset : prev.nodeType === 3 ? prev.textContent.length : 1; + core.setRange(prev, offset, prev, offset); + break; + } + } + + // tag[contenteditable="false"] + if (event._isUneditableNode(range, true)) { + e.preventDefault(); + e.stopPropagation(); + break; + } + + // nested list + const commonCon = range.commonAncestorContainer; + formatEl = util.getFormatElement(range.startContainer, null); + rangeEl = util.getRangeFormatElement(formatEl, null); + if (rangeEl && formatEl && !util.isCell(rangeEl) && !/^FIGCAPTION$/i.test(rangeEl.nodeName)) { + if (util.isListCell(formatEl) && util.isList(rangeEl) && (util.isListCell(rangeEl.parentNode) || formatEl.previousElementSibling) && (selectionNode === formatEl || (selectionNode.nodeType === 3 && (!selectionNode.previousSibling || util.isList(selectionNode.previousSibling)))) && + (util.getFormatElement(range.startContainer, null) !== util.getFormatElement(range.endContainer, null) ? rangeEl.contains(range.startContainer) : (range.startOffset === 0 && range.collapsed))) { + if (range.startContainer !== range.endContainer) { + e.preventDefault(); + + core.removeNode(); + if (range.startContainer.nodeType === 3) { + core.setRange(range.startContainer, range.startContainer.textContent.length, range.startContainer, range.startContainer.textContent.length); + } + // history stack + core.history.push(true); + } else { + let prev = formatEl.previousElementSibling || rangeEl.parentNode; + if (util.isListCell(prev)) { + e.preventDefault(); + + let prevLast = prev; + if (!prev.contains(formatEl) && util.isListCell(prevLast) && util.isList(prevLast.lastElementChild)) { + prevLast = prevLast.lastElementChild.lastElementChild; + while (util.isListCell(prevLast) && util.isList(prevLast.lastElementChild)) { + prevLast = prevLast.lastElementChild && prevLast.lastElementChild.lastElementChild; + } + prev = prevLast; + } + + let con = prev === rangeEl.parentNode ? rangeEl.previousSibling : prev.lastChild; + if (!con) { + con = util.createTextNode(util.zeroWidthSpace); + rangeEl.parentNode.insertBefore(con, rangeEl.parentNode.firstChild); + } + const offset = con.nodeType === 3 ? con.textContent.length : 1; + const children = formatEl.childNodes; + let after = con; + let child = children[0]; + while ((child = children[0])) { + prev.insertBefore(child, after.nextSibling); + after = child; + } + + util.removeItem(formatEl); + if (rangeEl.children.length === 0) util.removeItem(rangeEl); + + core.setRange(con, offset, con, offset); + // history stack + core.history.push(true); + } + } + + break; + } + + // detach range + if (!selectRange && range.startOffset === 0) { + let detach = true; + let comm = commonCon; + while (comm && comm !== rangeEl && !util.isWysiwygDiv(comm)) { + if (comm.previousSibling) { + if (comm.previousSibling.nodeType === 1 || !util.onlyZeroWidthSpace(comm.previousSibling.textContent.trim())) { + detach = false; + break; + } + } + comm = comm.parentNode; + } + + if (detach && rangeEl.parentNode) { + e.preventDefault(); + core.detachRangeFormatElement(rangeEl, (util.isListCell(formatEl) ? [formatEl] : null), null, false, false); + // history stack + core.history.push(true); + break; + } + } + } + + // component + if (!selectRange && formatEl && (range.startOffset === 0 || (selectionNode === formatEl ? !!formatEl.childNodes[range.startOffset] : false))) { + const sel = selectionNode === formatEl ? formatEl.childNodes[range.startOffset] : selectionNode; + const prev = formatEl.previousSibling; + // select file component + const ignoreZWS = (commonCon.nodeType === 3 || util.isBreak(commonCon)) && !commonCon.previousSibling && range.startOffset === 0; + if (!sel.previousSibling && (util.isComponent(commonCon.previousSibling) || (ignoreZWS && util.isComponent(prev)))) { + const fileComponentInfo = core.getFileComponent(prev); + if (fileComponentInfo) { + e.preventDefault(); + e.stopPropagation(); + if (formatEl.textContent.length === 0) util.removeItem(formatEl); + if (core.selectComponent(fileComponentInfo.target, fileComponentInfo.pluginName) === false) core.blur(); + } else if (util.isComponent(prev)) { + e.preventDefault(); + e.stopPropagation(); + util.removeItem(prev); + } + break; + } + // delete nonEditable + if (util.isNonEditable(sel.previousSibling)) { + e.preventDefault(); + e.stopPropagation(); + util.removeItem(sel.previousSibling); + break; + } + } + + break; + case 46: /** delete key */ + if (fileComponentName) { + e.preventDefault(); + e.stopPropagation(); + core.plugins[fileComponentName].destroy.call(core); + break; + } + + if (selectRange && event._hardDelete()) { + e.preventDefault(); + e.stopPropagation(); + break; + } + + // tag[contenteditable="false"] + if (event._isUneditableNode(range, false)) { + e.preventDefault(); + e.stopPropagation(); + break; + } + + // component + if ((util.isFormatElement(selectionNode) || selectionNode.nextSibling === null || (util.onlyZeroWidthSpace(selectionNode.nextSibling) && selectionNode.nextSibling.nextSibling === null)) && range.startOffset === selectionNode.textContent.length) { + let nextEl = formatEl.nextElementSibling; + if (!nextEl) { + e.preventDefault(); + break; + } + + if (util.isComponent(nextEl)) { + e.preventDefault(); + + if (util.onlyZeroWidthSpace(formatEl)) { + util.removeItem(formatEl); + // table component + if (util.isTable(nextEl)) { + let cell = util.getChildElement(nextEl, util.isCell, false); + cell = cell.firstElementChild || cell; + core.setRange(cell, 0, cell, 0); + break; + } + } + + // select file component + const fileComponentInfo = core.getFileComponent(nextEl); + if (fileComponentInfo) { + e.stopPropagation(); + if (core.selectComponent(fileComponentInfo.target, fileComponentInfo.pluginName) === false) core.blur(); + } else if (util.isComponent(nextEl)) { + e.stopPropagation(); + util.removeItem(nextEl); + } + + break; + } + } + + if (!selectRange && (core.isEdgePoint(range.endContainer, range.endOffset) || (selectionNode === formatEl ? !!formatEl.childNodes[range.startOffset] : false))) { + const sel = selectionNode === formatEl ? formatEl.childNodes[range.startOffset] : selectionNode; + // delete nonEditable + if (util.isNonEditable(sel.nextSibling)) { + e.preventDefault(); + e.stopPropagation(); + util.removeItem(sel.nextSibling); + break; + } + } + + // nested list + formatEl = util.getFormatElement(range.startContainer, null); + rangeEl = util.getRangeFormatElement(formatEl, null); + if (util.isListCell(formatEl) && util.isList(rangeEl) && (selectionNode === formatEl || (selectionNode.nodeType === 3 && (!selectionNode.nextSibling || util.isList(selectionNode.nextSibling)) && + (util.getFormatElement(range.startContainer, null) !== util.getFormatElement(range.endContainer, null) ? rangeEl.contains(range.endContainer) : (range.endOffset === selectionNode.textContent.length && range.collapsed))))) { + if (range.startContainer !== range.endContainer) core.removeNode(); + + let next = util.getArrayItem(formatEl.children, util.isList, false); + next = next || formatEl.nextElementSibling || rangeEl.parentNode.nextElementSibling; + if (next && (util.isList(next) || util.getArrayItem(next.children, util.isList, false))) { + e.preventDefault(); + + let con, children; + if (util.isList(next)) { + const child = next.firstElementChild; + children = child.childNodes; + con = children[0]; + while (children[0]) { + formatEl.insertBefore(children[0], next); + } + util.removeItem(child); + } else { + con = next.firstChild; + children = next.childNodes; + while (children[0]) { + formatEl.appendChild(children[0]); + } + util.removeItem(next); + } + core.setRange(con, 0, con, 0); + // history stack + core.history.push(true); + } + break; + } + + break; + case 9: /** tab key */ + if (fileComponentName || options.tabDisable) break; + e.preventDefault(); + if (ctrl || alt || util.isWysiwygDiv(selectionNode)) break; + + const isEdge = (!range.collapsed || core.isEdgePoint(range.startContainer, range.startOffset)); + const selectedFormats = core.getSelectedElements(null); + selectionNode = core.getSelectionNode(); + const cells = []; + let lines = []; + let fc = util.isListCell(selectedFormats[0]), lc = util.isListCell(selectedFormats[selectedFormats.length - 1]); + let r = {sc: range.startContainer, so: range.startOffset, ec: range.endContainer, eo: range.endOffset}; + for (let i = 0, len = selectedFormats.length, f; i < len; i++) { + f = selectedFormats[i]; + if (util.isListCell(f)) { + if (!f.previousElementSibling && !shift) { + continue; + } else { + cells.push(f); + } + } else { + lines.push(f); + } + } + + // Nested list + if (cells.length > 0 && isEdge && core.plugins.list) { + r = core.plugins.list.editInsideList.call(core, shift, cells); + } else { + // table + const tableCell = util.getParentElement(selectionNode, util.isCell); + if (tableCell && isEdge) { + const table = util.getParentElement(tableCell, 'table'); + const cells = util.getListChildren(table, util.isCell); + let idx = shift ? util.prevIdx(cells, tableCell) : util.nextIdx(cells, tableCell); + + if (idx === cells.length && !shift) idx = 0; + if (idx === -1 && shift) idx = cells.length - 1; + + let moveCell = cells[idx]; + if (!moveCell) break; + moveCell = moveCell.firstElementChild || moveCell; + core.setRange(moveCell, 0, moveCell, 0); + break; + } + + lines = lines.concat(cells); + fc = lc = null; + } + + // Lines tab(4) + if (lines.length > 0) { + if (!shift) { + const tabText = util.createTextNode(new _w.Array(core._variable.tabSize + 1).join('\u00A0')); + if (lines.length === 1) { + const textRange = core.insertNode(tabText, null, true); + if (!textRange) return false; + if (!fc) { + r.sc = tabText; + r.so = textRange.endOffset; + } + if (!lc) { + r.ec = tabText; + r.eo = textRange.endOffset; + } + } else { + const len = lines.length - 1; + for (let i = 0, child; i <= len; i++) { + child = lines[i].firstChild; + if (!child) continue; + + if (util.isBreak(child)) { + lines[i].insertBefore(tabText.cloneNode(false), child); + } else { + child.textContent = tabText.textContent + child.textContent; + } + } + + const firstChild = util.getChildElement(lines[0], 'text', false); + const endChild = util.getChildElement(lines[len], 'text', true); + if (!fc && firstChild) { + r.sc = firstChild; + r.so = 0; + } + if (!lc && endChild) { + r.ec = endChild; + r.eo = endChild.textContent.length; + } + } + } else { + const len = lines.length - 1; + for (let i = 0, line; i <= len; i++) { + line = lines[i].childNodes; + for (let c = 0, cLen = line.length, child; c < cLen; c++) { + child = line[c]; + if (!child) break; + if (util.onlyZeroWidthSpace(child)) continue; + + if (/^\s{1,4}$/.test(child.textContent)) { + util.removeItem(child); + } else if (/^\s{1,4}/.test(child.textContent)) { + child.textContent = child.textContent.replace(/^\s{1,4}/, ''); + } + + break; + } + } + + const firstChild = util.getChildElement(lines[0], 'text', false); + const endChild = util.getChildElement(lines[len], 'text', true); + if (!fc && firstChild) { + r.sc = firstChild; + r.so = 0; + } + if (!lc && endChild) { + r.ec = endChild; + r.eo = endChild.textContent.length; + } + } + } + + core.setRange(r.sc, r.so, r.ec, r.eo); + // history stack + core.history.push(false); + + break; + case 13: /** enter key */ + const freeFormatEl = util.getFreeFormatElement(selectionNode, null); + + if (core._charTypeHTML) { + let enterHTML = ''; + if ((!shift && freeFormatEl) || shift) { + enterHTML = '
'; + } else { + enterHTML = '<' + formatEl.nodeName + '>
'; + } + + if (!core.checkCharCount(enterHTML, 'byte-html')) { + e.preventDefault(); + return false; + } + } + + if (!shift && /^H[1-6]$/i.test(formatEl.nodeName) && core.isEdgeFormat(range.endContainer, range.endOffset, 'end')) { + e.preventDefault(); + const newFormat = core.appendFormatTag(formatEl, options.defaultTag); + core.setRange(newFormat, 1, newFormat, 1); + break; + } + + if (!shift && freeFormatEl) { + e.preventDefault(); + const selectionFormat = selectionNode === freeFormatEl; + const wSelection = core.getSelection(); + const children = selectionNode.childNodes, offset = wSelection.focusOffset, prev = selectionNode.previousElementSibling, next = selectionNode.nextSibling; + + if (!util.isClosureFreeFormatElement(freeFormatEl) && !!children && ((selectionFormat && range.collapsed && children.length - 1 <= offset + 1 && util.isBreak(children[offset]) && (!children[offset + 1] || ((!children[offset + 2] || util.onlyZeroWidthSpace(children[offset + 2].textContent)) && children[offset + 1].nodeType === 3 && util.onlyZeroWidthSpace(children[offset + 1].textContent))) && offset > 0 && util.isBreak(children[offset - 1])) || + (!selectionFormat && util.onlyZeroWidthSpace(selectionNode.textContent) && util.isBreak(prev) && (util.isBreak(prev.previousSibling) || !util.onlyZeroWidthSpace(prev.previousSibling.textContent)) && (!next || (!util.isBreak(next) && util.onlyZeroWidthSpace(next.textContent)))))) { + if (selectionFormat) util.removeItem(children[offset - 1]); + else util.removeItem(selectionNode); + const newEl = core.appendFormatTag(freeFormatEl, util.isFormatElement(freeFormatEl.nextElementSibling) ? freeFormatEl.nextElementSibling : null); + util.copyFormatAttributes(newEl, freeFormatEl); + core.setRange(newEl, 1, newEl, 1); + break; + } + + if (selectionFormat) { + functions.insertHTML(((range.collapsed && util.isBreak(range.startContainer.childNodes[range.startOffset - 1])) ? '
' : '

'), true, false); + + let focusNode = wSelection.focusNode; + const wOffset = wSelection.focusOffset; + if (freeFormatEl === focusNode) { + focusNode = focusNode.childNodes[wOffset - offset > 1 ? wOffset - 1 : wOffset]; + } + + core.setRange(focusNode, 1, focusNode, 1); + } else { + const focusNext = wSelection.focusNode.nextSibling; + const br = util.createElement('BR'); + core.insertNode(br, null, false); + + const brPrev = br.previousSibling, brNext = br.nextSibling; + if (!util.isBreak(focusNext) && !util.isBreak(brPrev) && (!brNext || util.onlyZeroWidthSpace(brNext))) { + br.parentNode.insertBefore(br.cloneNode(false), br); + core.setRange(br, 1, br, 1); + } else { + core.setRange(brNext, 0, brNext, 0); + } + } + + event._onShortcutKey = true; + break; + } + + if (selectRange) break; + + if (rangeEl && formatEl && !util.isCell(rangeEl) && !/^FIGCAPTION$/i.test(rangeEl.nodeName)) { + const range = core.getRange(); + if(core.isEdgePoint(range.endContainer, range.endOffset) && util.isList(selectionNode.nextSibling)) { + e.preventDefault(); + const newEl = util.createElement('LI'); + const br = util.createElement('BR'); + newEl.appendChild(br); + + formatEl.parentNode.insertBefore(newEl, formatEl.nextElementSibling); + newEl.appendChild(selectionNode.nextSibling); + + core.setRange(br, 1, br, 1); + break; + } + + if ((range.commonAncestorContainer.nodeType === 3 ? !range.commonAncestorContainer.nextElementSibling : true) && util.onlyZeroWidthSpace(formatEl.innerText.trim())) { + e.preventDefault(); + let newEl = null; + + if (util.isListCell(rangeEl.parentNode)) { + rangeEl = formatEl.parentNode.parentNode.parentNode; + newEl = util.splitElement(formatEl, null, util.getElementDepth(formatEl) - 2); + if (!newEl) { + const newListCell = util.createElement('LI'); + newListCell.innerHTML = '
'; + rangeEl.insertBefore(newListCell, newEl); + newEl = newListCell; + } + } else { + const newFormat = util.isCell(rangeEl.parentNode) ? 'DIV' : util.isList(rangeEl.parentNode) ? 'LI' : util.isFormatElement(rangeEl.nextElementSibling) ? rangeEl.nextElementSibling.nodeName : util.isFormatElement(rangeEl.previousElementSibling) ? rangeEl.previousElementSibling.nodeName : options.defaultTag; + newEl = util.createElement(newFormat); + const edge = core.detachRangeFormatElement(rangeEl, [formatEl], null, true, true); + edge.cc.insertBefore(newEl, edge.ec); + } + + newEl.innerHTML = '
'; + util.copyFormatAttributes(newEl, formatEl); + util.removeItemAllParents(formatEl, null, null); + core.setRange(newEl, 1, newEl, 1); + break; + } + } + + if (rangeEl && util.getParentElement(rangeEl, 'FIGCAPTION') && util.getParentElement(rangeEl, util.isList)) { + e.preventDefault(); + formatEl = core.appendFormatTag(formatEl, null); + core.setRange(formatEl, 0, formatEl, 0); + } + + if (fileComponentName) { + e.preventDefault(); + e.stopPropagation(); + const compContext = context[fileComponentName]; + const container = compContext._container; + const sibling = container.previousElementSibling || container.nextElementSibling; + + let newEl = null; + if (util.isListCell(container.parentNode)) { + newEl = util.createElement('BR'); + } else { + newEl = util.createElement(util.isFormatElement(sibling) ? sibling.nodeName : options.defaultTag); + newEl.innerHTML = '
'; + } + + container.parentNode.insertBefore(newEl, container); + + core.callPlugin(fileComponentName, function () { + if (core.selectComponent(compContext._element, fileComponentName) === false) core.blur(); + }, null); + } + + break; + case 27: + if (fileComponentName) { + e.preventDefault(); + e.stopPropagation(); + core.controllersOff(); + return false; + } + break; + } + + if (shift && keyCode === 16) { + e.preventDefault(); + e.stopPropagation(); + const tablePlugin = core.plugins.table; + if (tablePlugin && !tablePlugin._shift && !tablePlugin._ref) { + const cell = util.getParentElement(formatEl, util.isCell); + if (cell) { + tablePlugin.onTableCellMultiSelect.call(core, cell, true); + return; + } + } + } else if (shift && (util.isOSX_IOS ? alt : ctrl) && keyCode === 32) { + e.preventDefault(); + e.stopPropagation(); + const nbsp = core.insertNode(util.createTextNode('\u00a0')); + if (nbsp && nbsp.container) { + core.setRange(nbsp.container, nbsp.endOffset, nbsp.container, nbsp.endOffset); + return; + } + } + + const textKey = !ctrl && !alt && !selectRange && !event._nonTextKeyCode.test(keyCode); + if (textKey && range.collapsed && range.startContainer === range.endContainer && util.isBreak(range.commonAncestorContainer)) { + const zeroWidth = util.createTextNode(util.zeroWidthSpace); + core.insertNode(zeroWidth, null, false); + core.setRange(zeroWidth, 1, zeroWidth, 1); + } + + if (typeof functions.onKeyDown === 'function') functions.onKeyDown(e, core); + }, + + onKeyUp_wysiwyg: function (e) { + if (event._onShortcutKey) return; + core._editorRange(); + + const range = core.getRange(); + const keyCode = e.keyCode; + const ctrl = e.ctrlKey || e.metaKey || keyCode === 91 || keyCode === 92 || keyCode === 224; + const alt = e.altKey; + let selectionNode = core.getSelectionNode(); + + if (core._isBalloon && ((core._isBalloonAlways && keyCode !== 27) || !range.collapsed)) { + if (core._isBalloonAlways) { + if (keyCode !== 27) event._showToolbarBalloonDelay(); + } else { + event._showToolbarBalloon(); + return; + } + } + + /** when format tag deleted */ + if (keyCode === 8 && util.isWysiwygDiv(selectionNode) && selectionNode.textContent === '' && selectionNode.children.length === 0) { + e.preventDefault(); + e.stopPropagation(); + + selectionNode.innerHTML = ''; + + const oFormatTag = util.createElement(util.isFormatElement(core._variable.currentNodes[0]) ? core._variable.currentNodes[0] : options.defaultTag); + oFormatTag.innerHTML = '
'; + + selectionNode.appendChild(oFormatTag); + core.setRange(oFormatTag, 0, oFormatTag, 0); + event._applyTagEffects(); + + core.history.push(false); + return; + } + + const formatEl = util.getFormatElement(selectionNode, null); + const rangeEl = util.getRangeFormatElement(selectionNode, null); + if (((!formatEl && range.collapsed) || formatEl === rangeEl) && !util.isComponent(selectionNode) && !util.isList(selectionNode)) { + core._setDefaultFormat(util.isRangeFormatElement(rangeEl) ? 'DIV' : options.defaultTag); + selectionNode = core.getSelectionNode(); + } + + if (event._directionKeyCode.test(keyCode)) { + event._applyTagEffects(); + } + + const textKey = !ctrl && !alt && !event._nonTextKeyCode.test(keyCode); + if (textKey && selectionNode.nodeType === 3 && util.zeroWidthRegExp.test(selectionNode.textContent) && !(e.isComposing !== undefined ? e.isComposing : event._IEisComposing)) { + let so = range.startOffset, eo = range.endOffset; + const frontZeroWidthCnt = (selectionNode.textContent.substring(0, eo).match(event._frontZeroWidthReg) || '').length; + so = range.startOffset - frontZeroWidthCnt; + eo = range.endOffset - frontZeroWidthCnt; + selectionNode.textContent = selectionNode.textContent.replace(util.zeroWidthRegExp, ''); + core.setRange(selectionNode, so < 0 ? 0 : so, selectionNode, eo < 0 ? 0 : eo); + } + + core._charCount(''); + + // history stack + core.history.push(true); + + if (typeof functions.onKeyUp === 'function') functions.onKeyUp(e, core); + }, + + onScroll_wysiwyg: function (e) { + core.controllersOff(); + if (core._isBalloon) event._hideToolbar(); + if (typeof functions.onScroll === 'function') functions.onScroll(e, core); + }, + + onFocus_wysiwyg: function (e) { + if (core._antiBlur) return; + core.hasFocus = true; + if (core._isInline) event._showToolbarInline(); + if (typeof functions.onFocus === 'function') functions.onFocus(e, core); + }, + + onBlur_wysiwyg: function (e) { + if (core._antiBlur || core._variable.isCodeView) return; + core.hasFocus = false; + core.controllersOff(); + if (core._isInline || core._isBalloon) event._hideToolbar(); + if (typeof functions.onBlur === 'function') functions.onBlur(e, core); + + // active class reset of buttons + const commandMap = core.commandMap; + const activePlugins = core.activePlugins; + for (let key in commandMap) { + if (!util.hasOwn(commandMap, key)) continue; + if (activePlugins.indexOf(key) > -1) { + plugins[key].active.call(core, null); + } else if (commandMap.OUTDENT && /^OUTDENT$/i.test(key)) { + commandMap.OUTDENT.setAttribute('disabled', true); + } else if (commandMap.INDENT && /^INDENT$/i.test(key)) { + commandMap.INDENT.removeAttribute('disabled'); + } else { + util.removeClass(commandMap[key], 'active'); + } + } + + core._variable.currentNodes = []; + core._variable.currentNodesMap = []; + if (options.showPathLabel) context.element.navigation.textContent = ''; + }, + + onMouseDown_resizingBar: function (e) { + e.stopPropagation(); + + core.submenuOff(); + core.controllersOff(); + + core._variable.resizeClientY = e.clientY; + context.element.resizeBackground.style.display = 'block'; + + function closureFunc() { + context.element.resizeBackground.style.display = 'none'; + _d.removeEventListener('mousemove', event._resize_editor); + _d.removeEventListener('mouseup', closureFunc); + } + + _d.addEventListener('mousemove', event._resize_editor); + _d.addEventListener('mouseup', closureFunc); + }, + + _resize_editor: function (e) { + const resizeInterval = context.element.editorArea.offsetHeight + (e.clientY - core._variable.resizeClientY); + context.element.wysiwygFrame.style.height = context.element.code.style.height = (resizeInterval < core._variable.minResizingSize ? core._variable.minResizingSize : resizeInterval) + 'px'; + core._variable.resizeClientY = e.clientY; + }, + + onResize_window: function () { + core.controllersOff(); + + const responsiveSize = event._responsiveButtonSize; + if (responsiveSize) { + let w = 0; + if ((core._isBalloon || core._isInline) && options.toolbarWidth === 'auto') { + w = context.element.topArea.offsetWidth; + } else { + w = context.element.toolbar.offsetWidth; + } + + let responsiveWidth = 'default'; + for (let i = 1, len = responsiveSize.length; i < len; i++) { + if (w < responsiveSize[i]) { + responsiveWidth = responsiveSize[i] + ''; + break; + } + } + + if (event._responsiveCurrentSize !== responsiveWidth) { + event._responsiveCurrentSize = responsiveWidth; + functions.setToolbarButtons(event._responsiveButtons[responsiveWidth]); + } + } + + if (context.element.toolbar.offsetWidth === 0) return; + + if (context.fileBrowser && context.fileBrowser.area.style.display === 'block') { + context.fileBrowser.body.style.maxHeight = (_w.innerHeight - context.fileBrowser.header.offsetHeight - 50) + 'px'; + } + + if (core.submenuActiveButton && core.submenu) { + core._setMenuPosition(core.submenuActiveButton, core.submenu); + } + + if (core._variable.isFullScreen) { + core._variable.innerHeight_fullScreen += (_w.innerHeight - context.element.toolbar.offsetHeight) - core._variable.innerHeight_fullScreen; + context.element.editorArea.style.height = core._variable.innerHeight_fullScreen + 'px'; + return; + } + + if (core._variable.isCodeView && core._isInline) { + event._showToolbarInline(); + return; + } + + core._iframeAutoHeight(); + + if (core._sticky) { + context.element.toolbar.style.width = (context.element.topArea.offsetWidth - 2) + 'px'; + event.onScroll_window(); + } + }, + + onScroll_window: function () { + if (core._variable.isFullScreen || context.element.toolbar.offsetWidth === 0 || options.stickyToolbar < 0) return; + + const element = context.element; + const editorHeight = element.editorArea.offsetHeight; + const y = (this.scrollY || _d.documentElement.scrollTop) + options.stickyToolbar; + const editorTop = event._getEditorOffsets(options.toolbarContainer).top - (core._isInline ? element.toolbar.offsetHeight : 0); + + if (y < editorTop) { + event._offStickyToolbar(); + } + else if (y + core._variable.minResizingSize >= editorHeight + editorTop) { + if (!core._sticky) event._onStickyToolbar(); + element.toolbar.style.top = (editorHeight + editorTop + options.stickyToolbar -y - core._variable.minResizingSize) + 'px'; + } + else if (y >= editorTop) { + event._onStickyToolbar(); + } + }, + + _getEditorOffsets: function (container) { + let offsetEl = container || context.element.topArea; + let t = 0, l = 0, s = 0; + + while (offsetEl) { + t += offsetEl.offsetTop; + l += offsetEl.offsetLeft; + s += offsetEl.scrollTop; + offsetEl = offsetEl.offsetParent; + } + + return { + top: t, + left: l, + scroll: s + }; + }, + + _getPageBottomSpace: function () { + return _d.documentElement.scrollHeight - (event._getEditorOffsets(null).top + context.element.topArea.offsetHeight); + }, + + _onStickyToolbar: function () { + const element = context.element; + + if (!core._isInline && !options.toolbarContainer) { + element._stickyDummy.style.height = element.toolbar.offsetHeight + 'px'; + element._stickyDummy.style.display = 'block'; + } + + element.toolbar.style.top = options.stickyToolbar + 'px'; + element.toolbar.style.width = core._isInline ? core._inlineToolbarAttr.width : element.toolbar.offsetWidth + 'px'; + util.addClass(element.toolbar, 'se-toolbar-sticky'); + core._sticky = true; + }, + + _offStickyToolbar: function () { + const element = context.element; + + element._stickyDummy.style.display = 'none'; + element.toolbar.style.top = core._isInline ? core._inlineToolbarAttr.top : ''; + element.toolbar.style.width = core._isInline ? core._inlineToolbarAttr.width : ''; + element.editorArea.style.marginTop = ''; + + util.removeClass(element.toolbar, 'se-toolbar-sticky'); + core._sticky = false; + }, + + _codeViewAutoHeight: function () { + context.element.code.style.height = context.element.code.scrollHeight + 'px'; + }, + + // FireFox - table delete, Chrome - image, video, audio + _hardDelete: function () { + const range = core.getRange(); + const sc = range.startContainer; + const ec = range.endContainer; + + // table + const sCell = util.getRangeFormatElement(sc); + const eCell = util.getRangeFormatElement(ec); + const sIsCell = util.isCell(sCell); + const eIsCell = util.isCell(eCell); + if (((sIsCell && !sCell.previousElementSibling && !sCell.parentElement.previousElementSibling) || (eIsCell && !eCell.nextElementSibling && !eCell.parentElement.nextElementSibling)) && sCell !== eCell) { + if (!sIsCell) { + util.removeItem(util.getParentElement(eCell, util.isComponent)); + } else if (!eIsCell) { + util.removeItem(util.getParentElement(sCell, util.isComponent)); + } else { + util.removeItem(util.getParentElement(sCell, util.isComponent)); + core.nativeFocus(); + return true; + } + } + + // component + const sComp = sc.nodeType === 1 ? util.getParentElement(sc, '.se-component') : null; + const eComp = ec.nodeType === 1 ? util.getParentElement(ec, '.se-component') : null; + if (sComp) util.removeItem(sComp); + if (eComp) util.removeItem(eComp); + + return false; + }, + + onPaste_wysiwyg: function (e) { + const clipboardData = util.isIE ? _w.clipboardData : e.clipboardData; + if (!clipboardData) return true; + return event._dataTransferAction('paste', e, clipboardData); + }, + + _setClipboardComponent: function (e, info, clipboardData) { + e.preventDefault(); + e.stopPropagation(); + clipboardData.setData('text/html', info.component.outerHTML); + }, + + onCopy_wysiwyg: function (e) { + const clipboardData = util.isIE ? _w.clipboardData : e.clipboardData; + if (typeof functions.onCopy === 'function' && !functions.onCopy(e, clipboardData, core)) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + + const info = core.currentFileComponentInfo; + if (info && !util.isIE) { + event._setClipboardComponent(e, info, clipboardData); + util.addClass(info.component, 'se-component-copy'); + // copy effect + _w.setTimeout(function () { + util.removeClass(info.component, 'se-component-copy'); + }, 150); + } + }, + + onCut_wysiwyg: function (e) { + const clipboardData = util.isIE ? _w.clipboardData : e.clipboardData; + if (typeof functions.onCut === 'function' && !functions.onCut(e, clipboardData, core)) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + + const info = core.currentFileComponentInfo; + if (info && !util.isIE) { + event._setClipboardComponent(e, info, clipboardData); + util.removeItem(info.component); + core.controllersOff(); + } + + _w.setTimeout(function () { + // history stack + core.history.push(false); + }); + }, + + onDrop_wysiwyg: function (e) { + const dataTransfer = e.dataTransfer; + if (!dataTransfer) return true; + if (util.isIE) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + + core.removeNode(); + event._setDropLocationSelection(e); + return event._dataTransferAction('drop', e, dataTransfer); + }, + + _setDropLocationSelection: function (e) { + if (e.rangeParent) { + core.setRange(e.rangeParent, e.rangeOffset, e.rangeParent, e.rangeOffset); + } else if (core._wd.caretRangeFromPoint) { + const r = core._wd.caretRangeFromPoint(e.clientX, e.clientY); + core.setRange(r.startContainer, r.startOffset, r.endContainer, r.endOffset); + } else { + const r = core.getRange(); + core.setRange(r.startContainer, r.startOffset, r.endContainer, r.endOffset); + } + }, + + _dataTransferAction: function (type, e, data) { + let plainText, cleanData; + if (util.isIE) { + plainText = data.getData('Text'); + + const range = core.getRange(); + const tempDiv = util.createElement('DIV'); + const tempRange = { + sc: range.startContainer, + so: range.startOffset, + ec: range.endContainer, + eo: range.endOffset + }; + + tempDiv.setAttribute('contenteditable', true); + tempDiv.style.cssText = 'position:absolute; top:0; left:0; width:1px; height:1px; overflow:hidden;'; + + context.element.relative.appendChild(tempDiv); + tempDiv.focus(); + + _w.setTimeout(function () { + cleanData = tempDiv.innerHTML; + util.removeItem(tempDiv); + core.setRange(tempRange.sc, tempRange.so, tempRange.ec, tempRange.eo); + event._setClipboardData(type, e, plainText, cleanData, data); + }); + + return true; + } else { + plainText = data.getData('text/plain'); + cleanData = data.getData('text/html') || plainText; + if (event._setClipboardData(type, e, plainText, cleanData, data) === false) { + e.preventDefault(); + e.stopPropagation(); + return false; + } + } + }, + + _setClipboardData: function (type, e, plainText, cleanData, data) { + // MS word, OneNode, Excel + const MSData = /class=["']*Mso(Normal|List)/i.test(cleanData) || /content=["']*Word.Document/i.test(cleanData) || /content=["']*OneNote.File/i.test(cleanData) || /content=["']*Excel.Sheet/i.test(cleanData); + if (MSData) { + cleanData = cleanData.replace(/\n/g, ' '); + plainText = plainText.replace(/\n/g, ' '); + } else { + plainText = plainText.replace(/\n/g, ''); + } + + cleanData = core.cleanHTML(cleanData, core.pasteTagsWhitelistRegExp); + const maxCharCount = core._charCount(core._charTypeHTML ? cleanData : plainText); + + // paste event + if (type === 'paste' && typeof functions.onPaste === 'function') { + const value = functions.onPaste(e, cleanData, maxCharCount, core); + if (!value) return false; + if (typeof value === 'string') cleanData = value; + } + // drop event + if (type === 'drop' && typeof functions.onDrop === 'function') { + const value = functions.onDrop(e, cleanData, maxCharCount, core); + if (!value) return false; + if (typeof value === 'string') cleanData = value; + } + + // files + const files = data.files; + if (files.length > 0 && !MSData) { + if (/^image/.test(files[0].type) && core.plugins.image) { + functions.insertImage(files); + } + return false; + } + + if (!maxCharCount) { + return false; + } + + if (cleanData) { + functions.insertHTML(cleanData, true, false); + return false; + } + }, + + onMouseMove_wysiwyg: function (e) { + if (core.isDisabled) return; + const component = util.getParentElement(e.target, util.isComponent); + const lineBreakerStyle = core._lineBreaker.style; + + if (component && !core.currentControllerName) { + const ctxEl = context.element; + let scrollTop = 0; + let el = ctxEl.wysiwyg; + do { + scrollTop += el.scrollTop; + el = el.parentElement; + } while (el && !/^(BODY|HTML)$/i.test(el.nodeName)); + + const wScroll = ctxEl.wysiwyg.scrollTop; + const offsets = event._getEditorOffsets(null); + const componentTop = util.getOffset(component, ctxEl.wysiwygFrame).top + wScroll; + const y = e.pageY + scrollTop + (options.iframe && !options.toolbarContainer ? ctxEl.toolbar.offsetHeight : 0); + const c = componentTop + (options.iframe ? scrollTop : offsets.top); + + const isList = util.isListCell(component.parentNode); + let dir = '', top = ''; + if ((isList ? !component.previousSibling : !util.isFormatElement(component.previousElementSibling)) && y < (c + 20)) { + top = componentTop; + dir = 't'; + } else if ((isList ? !component.nextSibling : !util.isFormatElement(component.nextElementSibling)) && y > (c + component.offsetHeight - 20)) { + top = componentTop + component.offsetHeight; + dir = 'b'; + } else { + lineBreakerStyle.display = 'none'; + return; + } + + core._variable._lineBreakComp = component; + core._variable._lineBreakDir = dir; + lineBreakerStyle.top = (top - wScroll) + 'px'; + core._lineBreakerButton.style.left = (util.getOffset(component).left + (component.offsetWidth / 2) - 15) + 'px'; + lineBreakerStyle.display = 'block'; + } // off line breaker + else if (lineBreakerStyle.display !== 'none') { + lineBreakerStyle.display = 'none'; + } + }, + + _onMouseDown_lineBreak: function (e) { + e.preventDefault(); + }, + + _onLineBreak: function (e) { + e.preventDefault(); + + const component = core._variable._lineBreakComp; + const dir = !this ? core._variable._lineBreakDir : this; + const isList = util.isListCell(component.parentNode); + + const format = util.createElement(isList ? 'BR' : util.isCell(component.parentNode) ? 'DIV' : options.defaultTag); + if (!isList) format.innerHTML = '
'; + + if (core._charTypeHTML && !core.checkCharCount(format.outerHTML, 'byte-html')) return; + + component.parentNode.insertBefore(format, dir === 't' ? component : component.nextSibling); + core._lineBreaker.style.display = 'none'; + core._variable._lineBreakComp = null; + + const focusEl = isList ? format : format.firstChild; + core.setRange(focusEl, 1, focusEl, 1); + // history stack + core.history.push(false); + }, + + _addEvent: function () { + const eventWysiwyg = options.iframe ? core._ww : context.element.wysiwyg; + + /** toolbar event */ + context.element.toolbar.addEventListener('mousedown', event._buttonsEventHandler, false); + context.element._menuTray.addEventListener('mousedown', event._buttonsEventHandler, false); + context.element.toolbar.addEventListener('click', event.onClick_toolbar, false); + /** editor area */ + eventWysiwyg.addEventListener('mousedown', event.onMouseDown_wysiwyg, false); + eventWysiwyg.addEventListener('click', event.onClick_wysiwyg, false); + eventWysiwyg.addEventListener(util.isIE ? 'textinput' : 'input', event.onInput_wysiwyg, false); + eventWysiwyg.addEventListener('keydown', event.onKeyDown_wysiwyg, false); + eventWysiwyg.addEventListener('keyup', event.onKeyUp_wysiwyg, false); + eventWysiwyg.addEventListener('paste', event.onPaste_wysiwyg, false); + eventWysiwyg.addEventListener('copy', event.onCopy_wysiwyg, false); + eventWysiwyg.addEventListener('cut', event.onCut_wysiwyg, false); + eventWysiwyg.addEventListener('drop', event.onDrop_wysiwyg, false); + eventWysiwyg.addEventListener('scroll', event.onScroll_wysiwyg, false); + eventWysiwyg.addEventListener('focus', event.onFocus_wysiwyg, false); + eventWysiwyg.addEventListener('blur', event.onBlur_wysiwyg, false); + + /** line breaker */ + event._lineBreakerBind = { a: event._onLineBreak.bind(''), t: event._onLineBreak.bind('t'), b: event._onLineBreak.bind('b') }; + eventWysiwyg.addEventListener('mousemove', event.onMouseMove_wysiwyg, false); + core._lineBreakerButton.addEventListener('mousedown', event._onMouseDown_lineBreak, false); + core._lineBreakerButton.addEventListener('click', event._lineBreakerBind.a, false); + context.element.lineBreaker_t.addEventListener('mousedown', event._lineBreakerBind.t, false); + context.element.lineBreaker_b.addEventListener('mousedown', event._lineBreakerBind.b, false); + + /** Events are registered only when there is a table plugin. */ + if (core.plugins.table) { + eventWysiwyg.addEventListener('touchstart', event.onMouseDown_wysiwyg, {passive: true, useCapture: false}); + } + + /** code view area auto line */ + if (options.height === 'auto' && !options.codeMirrorEditor) { + context.element.code.addEventListener('keydown', event._codeViewAutoHeight, false); + context.element.code.addEventListener('keyup', event._codeViewAutoHeight, false); + context.element.code.addEventListener('paste', event._codeViewAutoHeight, false); + } + + /** resizingBar */ + if (context.element.resizingBar) { + if (/\d+/.test(options.height)) { + context.element.resizingBar.addEventListener('mousedown', event.onMouseDown_resizingBar, false); + } else { + util.addClass(context.element.resizingBar, 'se-resizing-none'); + } + } + + /** window event */ + event._setResponsiveToolbar(); + _w.removeEventListener('resize', event.onResize_window); + _w.removeEventListener('scroll', event.onScroll_window); + + _w.addEventListener('resize', event.onResize_window, false); + if (options.stickyToolbar > -1) { + _w.addEventListener('scroll', event.onScroll_window, false); + } + }, + + _removeEvent: function () { + const eventWysiwyg = options.iframe ? core._ww : context.element.wysiwyg; + + context.element.toolbar.removeEventListener('mousedown', event._buttonsEventHandler); + context.element._menuTray.removeEventListener('mousedown', event._buttonsEventHandler); + context.element.toolbar.removeEventListener('click', event.onClick_toolbar); + + eventWysiwyg.removeEventListener('mousedown', event.onMouseDown_wysiwyg); + eventWysiwyg.removeEventListener('click', event.onClick_wysiwyg); + eventWysiwyg.removeEventListener(util.isIE ? 'textinput' : 'input', event.onInput_wysiwyg); + eventWysiwyg.removeEventListener('keydown', event.onKeyDown_wysiwyg); + eventWysiwyg.removeEventListener('keyup', event.onKeyUp_wysiwyg); + eventWysiwyg.removeEventListener('paste', event.onPaste_wysiwyg); + eventWysiwyg.removeEventListener('copy', event.onCopy_wysiwyg); + eventWysiwyg.removeEventListener('cut', event.onCut_wysiwyg); + eventWysiwyg.removeEventListener('drop', event.onDrop_wysiwyg); + eventWysiwyg.removeEventListener('scroll', event.onScroll_wysiwyg); + + eventWysiwyg.removeEventListener('mousemove', event.onMouseMove_wysiwyg); + core._lineBreakerButton.removeEventListener('mousedown', event._onMouseDown_lineBreak); + core._lineBreakerButton.removeEventListener('click', event._lineBreakerBind.a); + context.element.lineBreaker_t.removeEventListener('mousedown', event._lineBreakerBind.t); + context.element.lineBreaker_b.removeEventListener('mousedown', event._lineBreakerBind.b); + event._lineBreakerBind = null; + + eventWysiwyg.removeEventListener('touchstart', event.onMouseDown_wysiwyg, {passive: true, useCapture: false}); + + eventWysiwyg.removeEventListener('focus', event.onFocus_wysiwyg); + eventWysiwyg.removeEventListener('blur', event.onBlur_wysiwyg); + + context.element.code.removeEventListener('keydown', event._codeViewAutoHeight); + context.element.code.removeEventListener('keyup', event._codeViewAutoHeight); + context.element.code.removeEventListener('paste', event._codeViewAutoHeight); + + if (context.element.resizingBar) { + context.element.resizingBar.removeEventListener('mousedown', event.onMouseDown_resizingBar); + } + + _w.removeEventListener('resize', event.onResize_window); + _w.removeEventListener('scroll', event.onScroll_window); + }, + + _setResponsiveToolbar: function () { + if (_responsiveButtons.length === 0) { + _responsiveButtons = null; + return; + } + + event._responsiveCurrentSize = 'default'; + const sizeArray = event._responsiveButtonSize = []; + const buttonsObj = event._responsiveButtons = {default: _responsiveButtons[0]}; + for (let i = 1, len = _responsiveButtons.length, size, buttonGroup; i < len; i++) { + buttonGroup = _responsiveButtons[i]; + size = buttonGroup[0] * 1; + sizeArray.push(size); + buttonsObj[size] = buttonGroup[1]; + } + + sizeArray.sort(function (a, b) { return a - b; }).unshift('default'); + } + }; + + /** functions */ + const functions = { + /** + * @description Core, Util object + */ + core: core, + util: util, + + /** + * @description Event functions + * @param {Object} e Event Object + * @param {Object} core Core object + */ + onload: null, + onScroll: null, + onMouseDown: null, + onClick: null, + onInput: null, + onKeyDown: null, + onKeyUp: null, + onCopy: null, + onCut: null, + onFocus: null, + onBlur: null, + + /** + * @description Event functions + * @param {String} contents Current contents + * @param {Object} core Core object + */ + onChange: null, + + /** + * @description Event functions (drop, paste) + * When false is returned, the default behavior is stopped. + * If the string is returned, the cleanData value is modified to the return value. + * @param {Object} e Event object. + * @param {String} cleanData HTML string modified for editor format. + * @param {Boolean} maxChartCount option (true if max character is exceeded) + * @param {Object} core Core object + * @returns {Boolean|String} + */ + onDrop: null, + onPaste: null, + + /** + * @description Called just before the inline toolbar is positioned and displayed on the screen. + * @param {Element} toolbar Toolbar Element + * @param {Object} context The editor's context object (editor.getContext()) + * @param {Object} core Core object + */ + showInline: null, + + /** + * @description Called just after the controller is positioned and displayed on the screen. + * controller - editing elements displayed on the screen [image resizing, table editor, link editor..]] + * @param {String} name The name of the plugin that called the controller + * @param {Array} controllers Array of Controller elements + * @param {Object} core Core object + */ + showController: null, + + /** + * @description An event when toggling between code view and wysiwyg view. + * @param {Boolean} isCodeView Whether the current code view mode + * @param {Object} core Core object + */ + toggleCodeView: null, + + /** + * @description An event when toggling full screen. + * @param {Boolean} isFullScreen Whether the current full screen mode + * @param {Object} core Core object + */ + toggleFullScreen: null, + + /** + * @description It replaces the default callback function of the image upload + * @param {Object} response Response object + * @param {Object} info Input information + * - linkValue: Link url value + * - linkNewWindow: Open in new window Check Value + * - inputWidth: Value of width input + * - inputHeight: Value of height input + * - align: Align Check Value + * - isUpdate: Update image if true, create image if false + * - element: If isUpdate is true, the currently selected image. + * @param {Object} core Core object + */ + imageUploadHandler: null, + + /** + * @description It replaces the default callback function of the video upload + * @param xmlHttp xmlHttpRequest object + * @param info Input information + * - inputWidth: Value of width input + * - inputHeight: Value of height input + * - align: Align Check Value + * - isUpdate: Update video if true, create video if false + * - element: If isUpdate is true, the currently selected video. + * @param core Core object + */ + videoUploadHandler: null, + + /** + * @description It replaces the default callback function of the audio upload + * @param xmlHttp xmlHttpRequest object + * @param info Input information + * - isUpdate: Update audio if true, create audio if false + * - element: If isUpdate is true, the currently selected audio. + * @param core Core object + */ + audioUploadHandler: null, + + /** + * @description Called before the image is uploaded + * If true is returned, the internal upload process runs normally. + * If false is returned, no image upload is performed. + * If new fileList are returned, replaced the previous fileList + * If undefined is returned, it waits until "uploadHandler" is executed. + * @param {Array} files Files array + * @param {Object} info info: { + * - linkValue: Link url value + * - linkNewWindow: Open in new window Check Value + * - inputWidth: Value of width input + * - inputHeight: Value of height input + * - align: Align Check Value + * - isUpdate: Update image if true, create image if false + * - element: If isUpdate is true, the currently selected image. + * } + * @param {Object} core Core object + * @param {Function} uploadHandler If undefined is returned, it waits until "uploadHandler" is executed. + * "uploadHandler" is an upload function with "core" and "info" bound. + * [upload files] : uploadHandler(files or [new File(...),]) + * [error] : uploadHandler("Error message") + * [Just finish] : uploadHandler() + * [directly register] : uploadHandler(response) // Same format as "imageUploadUrl" response + * ex) { + * // "errorMessage": "insert error message", + * "result": [ { "url": "...", "name": "...", "size": "999" }, ] + * } + * @returns {Boolean|Array|undefined} + */ + onImageUploadBefore: null, + /** + * @description Called before the video is uploaded + * If true is returned, the internal upload process runs normally. + * If false is returned, no video(iframe, video) upload is performed. + * If new fileList are returned, replaced the previous fileList + * If undefined is returned, it waits until "uploadHandler" is executed. + * @param {Array} files Files array + * @param {Object} info info: { + * - inputWidth: Value of width input + * - inputHeight: Value of height input + * - align: Align Check Value + * - isUpdate: Update video if true, create video if false + * - element: If isUpdate is true, the currently selected video. + * } + * @param {Object} core Core object + * @param {Function} uploadHandler If undefined is returned, it waits until "uploadHandler" is executed. + * "uploadHandler" is an upload function with "core" and "info" bound. + * [upload files] : uploadHandler(files or [new File(...),]) + * [error] : uploadHandler("Error message") + * [Just finish] : uploadHandler() + * [directly register] : uploadHandler(response) // Same format as "videoUploadUrl" response + * ex) { + * // "errorMessage": "insert error message", + * "result": [ { "url": "...", "name": "...", "size": "999" }, ] + * } + * @returns {Boolean|Array|undefined} + */ + onVideoUploadBefore: null, + /** + * @description Called before the audio is uploaded + * If true is returned, the internal upload process runs normally. + * If false is returned, no audio upload is performed. + * If new fileList are returned, replaced the previous fileList + * If undefined is returned, it waits until "uploadHandler" is executed. + * @param {Array} files Files array + * @param {Object} info info: { + * - isUpdate: Update audio if true, create audio if false + * - element: If isUpdate is true, the currently selected audio. + * } + * @param {Object} core Core object + * @param {Function} uploadHandler If undefined is returned, it waits until "uploadHandler" is executed. + * "uploadHandler" is an upload function with "core" and "info" bound. + * [upload files] : uploadHandler(files or [new File(...),]) + * [error] : uploadHandler("Error message") + * [Just finish] : uploadHandler() + * [directly register] : uploadHandler(response) // Same format as "audioUploadUrl" response + * ex) { + * // "errorMessage": "insert error message", + * "result": [ { "url": "...", "name": "...", "size": "999" }, ] + * } + * @returns {Boolean|Array|undefined} + */ + onAudioUploadBefore: null, + + /** + * @description Called when the image is uploaded, updated, deleted + * @param {Element} targetElement Target element + * @param {Number} index Uploaded index + * @param {String} state Upload status ('create', 'update', 'delete') + * @param {Object} info Image info object + * - index: data index + * - name: file name + * - size: file size + * - select: select function + * - delete: delete function + * - element: target element + * - src: src attribute of tag + * @param {Number} remainingFilesCount Count of remaining files to upload (0 when added as a url) + * @param {Object} core Core object + */ + onImageUpload: null, + /** + * @description Called when the video(iframe, video) is is uploaded, updated, deleted + * -- arguments is same "onImageUpload" -- + */ + onVideoUpload: null, + /** + * @description Called when the audio is is uploaded, updated, deleted + * -- arguments is same "onImageUpload" -- + */ + onAudioUpload: null, + + /** + * @description Called when the image is upload failed + * @param {String} errorMessage Error message + * @param {Object} result Response Object + * @param {Object} core Core object + * @returns {Boolean} + */ + onImageUploadError: null, + /** + * @description Called when the video(iframe, video) upload failed + * -- arguments is same "onImageUploadError" -- + */ + onVideoUploadError: null, + /** + * @description Called when the audio upload failed + * -- arguments is same "onImageUploadError" -- + */ + onAudioUploadError: null, + + /** + * @description Reset the buttons on the toolbar. (Editor is not reloaded) + * You cannot set a new plugin for the button. + * @param {Array} buttonList Button list + */ + setToolbarButtons: function (buttonList) { + core.submenuOff(); + core.containerOff(); + + const newToolbar = _constructor__WEBPACK_IMPORTED_MODULE_0__["default"]._createToolBar(_d, buttonList, core.plugins, options); + _responsiveButtons = newToolbar.responsiveButtons; + core._moreLayerActiveButton = null; + event._setResponsiveToolbar(); + + context.element.toolbar.replaceChild(newToolbar._buttonTray, context.element._buttonTray); + const newContext = Object(_context__WEBPACK_IMPORTED_MODULE_1__["default"])(context.element.originElement, core._getConstructed(context.element), options); + + context.element = newContext.element; + context.tool = newContext.tool; + if (options.iframe) context.element.wysiwyg = core._wd.body; + core._cachingButtons(); + core.history._resetCachingButton(); + + core.activePlugins = []; + const oldCallButtons = pluginCallButtons; + pluginCallButtons = newToolbar.pluginCallButtons; + let plugin, button, oldButton; + for (let key in pluginCallButtons) { + if (!util.hasOwn(pluginCallButtons, key)) continue; + plugin = plugins[key]; + button = pluginCallButtons[key]; + if (plugin.active && button) { + oldButton = oldCallButtons[key]; + core.callPlugin(key, null, oldButton || button); + if (oldButton) { + button.parentElement.replaceChild(oldButton, button); + pluginCallButtons[key] = oldButton; + } + } + } + + if (core.hasFocus) event._applyTagEffects(); + + if (core._variable.isCodeView) util.addClass(core._styleCommandMap.codeView, 'active'); + if (core._variable.isFullScreen) util.addClass(core._styleCommandMap.fullScreen, 'active'); + if (util.hasClass(context.element.wysiwyg, 'se-show-block')) util.addClass(core._styleCommandMap.showBlocks, 'active'); + }, + + /** + * @description Add or reset option property (Editor is reloaded) + * @param {Object} _options Options + */ + setOptions: function (_options) { + event._removeEvent(); + core._resetComponents(); + + util.removeClass(core._styleCommandMap.showBlocks, 'active'); + util.removeClass(core._styleCommandMap.codeView, 'active'); + core._variable.isCodeView = false; + core._iframeAuto = null; + + core.plugins = _options.plugins || core.plugins; + const mergeOptions = [options, _options].reduce(function (init, option) { + for (let key in option) { + if (!util.hasOwn(option, key)) continue; + if (key === 'plugins' && option[key] && init[key]) { + let i = init[key], o = option[key]; + i = i.length ? i : _w.Object.keys(i).map(function(name) { return i[name]; }); + o = o.length ? o : _w.Object.keys(o).map(function(name) { return o[name]; }); + init[key] = (o.filter(function(val) { return i.indexOf(val) === -1; })).concat(i); + } else { + init[key] = option[key]; + } + } + return init; + }, {}); + + const el = context.element; + const _initHTML = el.wysiwyg.innerHTML; + + // set option + const cons = _constructor__WEBPACK_IMPORTED_MODULE_0__["default"]._setOptions(mergeOptions, context, options); + + if (cons.callButtons) { + pluginCallButtons = cons.callButtons; + core.initPlugins = {}; + } + + if (cons.plugins) { + core.plugins = plugins = cons.plugins; + } + + // reset context + if (el._menuTray.children.length === 0) this._menuTray = {}; + _responsiveButtons = cons.toolbar.responsiveButtons; + core.options = options = mergeOptions; + core.lang = lang = options.lang; + + if (options.iframe) { + el.wysiwygFrame.addEventListener('load', function () { + util._setIframeDocument(this, options); + core._setOptionsInit(el, _initHTML); + }); + } + + el.editorArea.appendChild(el.wysiwygFrame); + + if (!options.iframe) { + core._setOptionsInit(el, _initHTML); + } + }, + + /** + * @description Set "options.defaultStyle" style. + * Define the style of the edit area + * It can also be defined with the "setOptions" method, but the "setDefaultStyle" method does not render the editor again. + * @param {String} style Style string + */ + setDefaultStyle: function (style) { + const newStyles = options._editorStyles = util._setDefaultOptionStyle(options, style); + const el = context.element; + + // top area + el.topArea.style.cssText = newStyles.top; + // code view + el.code.style.cssText = options._editorStyles.frame; + el.code.style.display = 'none'; + if (options.height === 'auto') { + el.code.style.overflow = 'hidden'; + } else { + el.code.style.overflow = ''; + } + // wysiwyg frame + if (!options.iframe) { + el.wysiwygFrame.style.cssText = newStyles.frame + newStyles.editor; + } else { + el.wysiwygFrame.style.cssText = newStyles.frame; + el.wysiwyg.style.cssText = newStyles.editor; + } + }, + + /** + * @description Open a notice area + * @param {String} message Notice message + */ + noticeOpen: function (message) { + core.notice.open.call(core, message); + }, + + /** + * @description Close a notice area + */ + noticeClose: function () { + core.notice.close.call(core); + }, + + /** + * @description Copying the contents of the editor to the original textarea + */ + save: function () { + context.element.originElement.value = core.getContents(false); + }, + + /** + * @description Gets the suneditor's context object. Contains settings, plugins, and cached element objects + * @returns {Object} + */ + getContext: function () { + return context; + }, + + /** + * @description Gets the contents of the suneditor + * @param {Boolean} onlyContents - Return only the contents of the body without headers when the "fullPage" option is true + * @returns {String} + */ + getContents: function (onlyContents) { + return core.getContents(onlyContents); + }, + + /** + * @description Gets only the text of the suneditor contents + * @returns {String} + */ + getText: function () { + return context.element.wysiwyg.textContent; + }, + + /** + * @description Get the editor's number of characters or binary data size. + * You can use the "charCounterType" option format. + * @param {String|null} charCounterType options - charCounterType ('char', 'byte', 'byte-html') + * If argument is no value, the currently set "charCounterType" option is used. + * @returns {Number} + */ + getCharCount: function (charCounterType) { + charCounterType = typeof charCounterType === 'string' ? charCounterType : options.charCounterType; + return core.getCharLength((core._charTypeHTML ? context.element.wysiwyg.innerHTML : context.element.wysiwyg.textContent), charCounterType); + }, + + /** + * @description Gets uploaded images informations + * - index: data index + * - name: file name + * - size: file size + * - select: select function + * - delete: delete function + * - element: target element + * - src: src attribute of tag + * @returns {Array} + */ + getImagesInfo: function () { + return context.image ? context.image._infoList : []; + }, + + /** + * @description Gets uploaded files(plugin using fileManager) information list. + * image: [img], video: [video, iframe], audio: [audio] + * When the argument value is 'image', it is the same function as "getImagesInfo". + * - index: data index + * - name: file name + * - size: file size + * - select: select function + * - delete: delete function + * - element: target element + * - src: src attribute of tag + * @param {String} pluginName Plugin name (image, video, audio) + * @returns {Array} + */ + getFilesInfo: function (pluginName) { + return context[pluginName] ? context[pluginName]._infoList : []; + }, + + /** + * @description Upload images using image plugin + * @param {FileList} files FileList + */ + insertImage: function (files) { + if (!core.plugins.image || !files) return; + + if (!core.initPlugins.image) core.callPlugin('image', core.plugins.image.submitAction.bind(core, files), null); + else core.plugins.image.submitAction.call(core, files); + core.focus(); + }, + + /** + * @description Inserts an HTML element or HTML string or plain string at the current cursor position + * @param {Element|String} html HTML Element or HTML string or plain string + * @param {Boolean} notCleaningData If true, inserts the HTML string without refining it with core.cleanHTML. + * @param {Boolean} checkCharCount If true, if "options.maxCharCount" is exceeded when "element" is added, null is returned without addition. + * @param {Boolean} rangeSelection If true, range select the inserted node. + */ + insertHTML: function (html, notCleaningData, checkCharCount, rangeSelection) { + if (typeof html === 'string') { + if (!notCleaningData) html = core.cleanHTML(html, null); + try { + const dom = _d.createRange().createContextualFragment(html); + const domTree = dom.childNodes; + + if (checkCharCount) { + const type = core._charTypeHTML ? 'outerHTML' : 'textContent'; + let checkHTML = ''; + for (let i = 0, len = domTree.length; i < len; i++) { + checkHTML += domTree[i][type]; + } + if (!core.checkCharCount(checkHTML, null)) return; + } + + let c, a, t, firstCon; + while ((c = domTree[0])) { + t = core.insertNode(c, a, false); + a = t.container || t; + if (!firstCon) firstCon = t; + } + + const offset = a.nodeType === 3 ? (t.endOffset || a.textContent.length): a.childNodes.length; + if (rangeSelection) core.setRange(firstCon.container || firstCon, firstCon.startOffset || 0, a, offset); + else core.setRange(a, offset, a, offset); + } catch (error) { + core.execCommand('insertHTML', false, html); + } + } else { + if (util.isComponent(html)) { + core.insertComponent(html, false, checkCharCount, false); + } else { + let afterNode = null; + if (util.isFormatElement(html) || util.isMedia(html)) { + afterNode = util.getFormatElement(core.getSelectionNode(), null); + } + core.insertNode(html, afterNode, checkCharCount); + } + } + + core.effectNode = null; + core.focus(); + + // history stack + core.history.push(false); + }, + + /** + * @description Change the contents of the suneditor + * @param {String|undefined} contents Contents to Input + */ + setContents: function (contents) { + core.setContents(contents); + }, + + /** + * @description Add contents to the suneditor + * @param {String} contents Contents to Input + */ + appendContents: function (contents) { + const convertValue = core.convertContentsForEditor(contents); + + if (!core._variable.isCodeView) { + const temp = util.createElement('DIV'); + temp.innerHTML = convertValue; + + const wysiwyg = context.element.wysiwyg; + const children = temp.children; + for (let i = 0, len = children.length; i < len; i++) { + wysiwyg.appendChild(children[i]); + } + } else { + core._setCodeView(core._getCodeView() + '\n' + core.convertHTMLForCodeView(convertValue)); + } + + // history stack + core.history.push(false); + }, + + /** + * @description Disable the suneditor + */ + disabled: function () { + context.tool.cover.style.display = 'block'; + context.element.wysiwyg.setAttribute('contenteditable', false); + core.isDisabled = true; + + if (options.codeMirrorEditor) { + options.codeMirrorEditor.setOption('readOnly', true); + } else { + context.element.code.setAttribute('disabled', 'disabled'); + } + }, + + /** + * @description Enable the suneditor + */ + enabled: function () { + context.tool.cover.style.display = 'none'; + context.element.wysiwyg.setAttribute('contenteditable', true); + core.isDisabled = false; + + if (options.codeMirrorEditor) { + options.codeMirrorEditor.setOption('readOnly', false); + } else { + context.element.code.removeAttribute('disabled'); + } + }, + + /** + * @description Show the suneditor + */ + show: function () { + const topAreaStyle = context.element.topArea.style; + if (topAreaStyle.display === 'none') topAreaStyle.display = options.display; + }, + + /** + * @description Hide the suneditor + */ + hide: function () { + context.element.topArea.style.display = 'none'; + }, + + /** + * @description Destroy the suneditor + */ + destroy: function () { + /** off menus */ + core.submenuOff(); + core.containerOff(); + core.controllersOff(); + if (core.notice) core.notice.close.call(core); + if (core.modalForm) core.plugins.dialog.close.call(core); + + /** remove history */ + core.history._destroy(); + + /** remove event listeners */ + event._removeEvent(); + + /** remove element */ + util.removeItem(context.element.toolbar); + util.removeItem(context.element.topArea); + + /** remove object reference */ + for (let k in core) { if (util.hasOwn(core, k)) delete core[k]; } + for (let k in event) { if (util.hasOwn(event, k)) delete event[k]; } + for (let k in context) { if (util.hasOwn(context, k)) delete context[k]; } + for (let k in pluginCallButtons) { if (util.hasOwn(pluginCallButtons, k)) delete pluginCallButtons[k]; } + + /** remove user object */ + for (let k in this) { if (util.hasOwn(this, k)) delete this[k]; } + }, + + /** + * @description Toolbar methods + */ + toolbar: { + /** + * @description Disable the toolbar + */ + disabled: function () { + context.tool.cover.style.display = 'block'; + }, + + /** + * @description Enable the toolbar + */ + enabled: function () { + context.tool.cover.style.display = 'none'; + }, + + /** + * @description Show the toolbar + */ + show: function () { + if (core._isInline) { + event._showToolbarInline(); + } else { + context.element.toolbar.style.display = ''; + context.element._stickyDummy.style.display = ''; + } + }, + + /** + * @description Hide the toolbar + */ + hide: function () { + if (core._isInline) { + event._hideToolbar(); + } else { + context.element.toolbar.style.display = 'none'; + context.element._stickyDummy.style.display = 'none'; + } + }, + } + }; + + /************ Core init ************/ + // functions + core.functions = functions; + core.options = options; + + // Create to sibling node + let contextEl = context.element; + let originEl = contextEl.originElement; + let topEl = contextEl.topArea; + originEl.style.display = 'none'; + topEl.style.display = 'block'; + + // init + if (options.iframe) { + contextEl.wysiwygFrame.addEventListener('load', function () { + util._setIframeDocument(this, options); + core._editorInit(false, options.value); + options.value = null; + }); + } + + // insert editor element + if (typeof originEl.nextElementSibling === 'object') { + originEl.parentNode.insertBefore(topEl, originEl.nextElementSibling); + } else { + originEl.parentNode.appendChild(topEl); + } + + contextEl.editorArea.appendChild(contextEl.wysiwygFrame); + contextEl = originEl = topEl = null; + + // init + if (!options.iframe) { + core._editorInit(false, options.value); + options.value = null; + } + + return functions; +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/lib/history.js": +/*!***************************************************!*\ + !*** ./node_modules/suneditor/src/lib/history.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2019 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = (function (core, change) { + const _w = core._w; + const util = core.util; + const delayTime = core.options.historyStackDelayTime; + let editor = core.context.element; + let undo = core.context.tool.undo; + let redo = core.context.tool.redo; + + let pushDelay = null; + let stackIndex = 0; + let stack = []; + + function setContentsFromStack () { + const item = stack[stackIndex]; + editor.wysiwyg.innerHTML = item.contents; + + core.setRange(util.getNodeFromPath(item.s.path, editor.wysiwyg), item.s.offset, util.getNodeFromPath(item.e.path, editor.wysiwyg), item.e.offset); + core.focus(); + + if (stackIndex === 0) { + if (undo) undo.setAttribute('disabled', true); + if (redo) redo.removeAttribute('disabled'); + } else if (stackIndex === stack.length - 1) { + if (undo) undo.removeAttribute('disabled'); + if (redo) redo.setAttribute('disabled', true); + } else { + if (undo) undo.removeAttribute('disabled'); + if (redo) redo.removeAttribute('disabled'); + } + + core.controllersOff(); + core._checkComponents(); + core._setCharCount(); + core._resourcesStateChange(); + + // onChange + change(); + } + + function pushStack () { + core._checkComponents(); + const current = core.getContents(true); + if (!current || (!!stack[stackIndex] && current === stack[stackIndex].contents)) return; + + stackIndex++; + const range = core._variable._range; + + if (stack.length > stackIndex) { + stack = stack.slice(0, stackIndex); + if (redo) redo.setAttribute('disabled', true); + } + + if (!range) { + stack[stackIndex] = { + contents: current, + s: { path: [0, 0], offset: [0, 0] }, + e: { path: 0, offset: 0 } + }; + } else { + stack[stackIndex] = { + contents: current, + s: { + path: util.getNodePath(range.startContainer, null, null), + offset: range.startOffset + }, + e: { + path: util.getNodePath(range.endContainer, null, null), + offset: range.endOffset + } + }; + } + + if (stackIndex === 1 && undo) undo.removeAttribute('disabled'); + + core._setCharCount(); + // onChange + change(); + } + + return { + /** + * @description History stack + */ + stack: stack, + + /** + * @description Saving the current status to the history object stack + * If "delay" is true, it will be saved after (options.historyStackDelayTime || 400) miliseconds + * If the function is called again with the "delay" argument true before it is saved, the delay time is renewal + * You can specify the delay time by sending a number. + * @param {Boolean|Number} delay If true, Add stack without delay time. + */ + push: function (delay) { + _w.setTimeout(core._resourcesStateChange.bind(core)); + const time = typeof delay === 'number' ? (delay > 0 ? delay : 0) : (!delay ? 0 : delayTime); + + if (!time || pushDelay) { + _w.clearTimeout(pushDelay); + if (!time) { + pushStack(); + return; + } + } + + pushDelay = _w.setTimeout(function () { + _w.clearTimeout(pushDelay); + pushDelay = null; + pushStack(); + }, time); + }, + + /** + * @description Undo function + */ + undo: function () { + if (stackIndex > 0) { + stackIndex--; + setContentsFromStack(); + } + }, + + /** + * @description Redo function + */ + redo: function () { + if (stack.length - 1 > stackIndex) { + stackIndex++; + setContentsFromStack(); + } + }, + + /** + * @description Go to the history stack for that index. + * If "index" is -1, go to the last stack + * @param {Number} index Stack index + */ + go: function (index) { + stackIndex = index < 0 ? (stack.length - 1) : index; + setContentsFromStack(); + }, + + /** + * @description Reset the history object + */ + reset: function (ignoreChangeEvent) { + if (undo) undo.setAttribute('disabled', true); + if (redo) redo.setAttribute('disabled', true); + core._variable.isChanged = false; + if (core.context.tool.save) core.context.tool.save.setAttribute('disabled', true); + + stack.splice(0); + stackIndex = 0; + + // pushStack + stack[stackIndex] = { + contents: core.getContents(true), + s: { + path: [0, 0], + offset: 0 + }, + e: { + path: [0, 0], + offset: 0 + } + }; + + if (!ignoreChangeEvent) change(); + }, + + /** + * @description Reset the disabled state of the buttons to fit the current stack. + * @private + */ + _resetCachingButton: function () { + editor = core.context.element; + undo = core.context.tool.undo; + redo = core.context.tool.redo; + + if (stackIndex === 0) { + if (undo) undo.setAttribute('disabled', true); + if (redo && stackIndex === stack.length - 1) redo.setAttribute('disabled', true); + core._variable.isChanged = false; + if (core.context.tool.save) core.context.tool.save.setAttribute('disabled', true); + } else if (stackIndex === stack.length - 1) { + if (redo) redo.setAttribute('disabled', true); + } + }, + + /** + * @description Remove all stacks and remove the timeout function. + * @private + */ + _destroy: function () { + if (pushDelay) _w.clearTimeout(pushDelay); + stack = null; + } + }; +}); + +/***/ }), + +/***/ "./node_modules/suneditor/src/lib/util.js": +/*!************************************************!*\ + !*** ./node_modules/suneditor/src/lib/util.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/** + * @description utility function + */ +const util = { + _d: null, + _w: null, + isIE: null, + isIE_Edge: null, + isOSX_IOS: null, + _propertiesInit: function () { + if (this._d) return; + this._d = document; + this._w = window; + this.isIE = navigator.userAgent.indexOf('Trident') > -1; + this.isIE_Edge = (navigator.userAgent.indexOf('Trident') > -1) || (navigator.appVersion.indexOf('Edge') > -1); + this.isOSX_IOS = /(Mac|iPhone|iPod|iPad)/.test(navigator.platform); + }, + + /** + * @description HTML Reserved Word Converter. + * @param {String} contents + * @returns {String} HTML string + * @private + */ + _HTMLConvertor: function (contents) { + const ec = {'&': '&', '\u00A0': ' ', '\'': ''', '"': '"', '<': '<', '>': '>'}; + return contents.replace(/&|\u00A0|'|"|<|>/g, function (m) { + return (typeof ec[m] === 'string') ? ec[m] : m; + }); + }, + + /** + * @description Unicode Character 'ZERO WIDTH SPACE' (\u200B) + */ + zeroWidthSpace: String.fromCharCode(8203), + + /** + * @description Regular expression to find 'zero width space' (/\u200B/g) + */ + zeroWidthRegExp: new RegExp(String.fromCharCode(8203), 'g'), + + /** + * @description Regular expression to find only 'zero width space' (/^\u200B+$/) + */ + onlyZeroWidthRegExp: new RegExp('^' + String.fromCharCode(8203) + '+$'), + + /** + * @description A method that checks If the text is blank or to see if it contains 'ZERO WIDTH SPACE' or empty (util.zeroWidthSpace) + * @param {String|Node} text String value or Node + * @returns {Boolean} + */ + onlyZeroWidthSpace: function (text) { + if (typeof text !== 'string') text = text.textContent; + return text === '' || this.onlyZeroWidthRegExp.test(text); + }, + + /** + * @description Gets XMLHttpRequest object + * @returns {XMLHttpRequest|ActiveXObject} + */ + getXMLHttpRequest: function () { + /** IE */ + if (this._w.ActiveXObject) { + try { + return new ActiveXObject('Msxml2.XMLHTTP'); + } catch (e) { + try { + return new ActiveXObject('Microsoft.XMLHTTP'); + } catch (e1) { + return null; + } + } + } + /** netscape */ + else if (this._w.XMLHttpRequest) { + return new XMLHttpRequest(); + } + /** fail */ + else { + return null; + } + }, + + /** + * @description Create Element node + * @param {String} elementName Element name + * @returns {Element} + */ + createElement: function (elementName) { + return this._d.createElement(elementName); + }, + + /** + * @description Create text node + * @param {String} text text contents + * @returns {Node} + */ + createTextNode: function (text) { + return this._d.createTextNode(text || ''); + }, + + /** + * @description The editor checks tags by string. + * If there is "<" or ">" in the attribute of tag, HTML is broken when checking the tag. + * When using an attribute with "<" or ">", use "HTMLEncoder" to save. (ex: math(katex)) + * @param {String} contents HTML or Text string + * @returns {String} + */ + HTMLEncoder: function (contents) { + const ec = {'<': '$lt;', '>': '$gt;'}; + return contents.replace(/<|>/g, function (m) { + return (typeof ec[m] === 'string') ? ec[m] : m; + }); + }, + + /** + * @description The editor checks tags by string. + * If there is "<" or ">" in the attribute of tag, HTML is broken when checking the tag. + * Decoder of data stored as "HTMLEncoder" (ex: math(katex)) + * @param {String} contents HTML or Text string + * @returns {String} + */ + HTMLDecoder: function (contents) { + const ec = {'$lt;': '<', '$gt;': '>'}; + return contents.replace(/\$lt;|\$gt;/g, function (m) { + return (typeof ec[m] === 'string') ? ec[m] : m; + }); + }, + + /** + * @description This method run Object.prototype.hasOwnProperty.call(obj, key) + * @param {Object} obj Object + * @param {String} key obj.key + * @returns {Boolean} + */ + hasOwn: function (obj, key) { + return this._hasOwn.call(obj, key); + }, + _hasOwn: Object.prototype.hasOwnProperty, + + /** + * @deprecated + * @description Get the the tag path of the arguments value + * If not found, return the first found value + * @param {Array} nameArray File name array + * @param {String} extension js, css + * @returns {String} + */ + getIncludePath: function (nameArray, extension) { + let path = ''; + const pathList = []; + const tagName = extension === 'js' ? 'script' : 'link'; + const src = extension === 'js' ? 'src' : 'href'; + + let fileName = '(?:'; + for (let i = 0, len = nameArray.length; i < len; i++) { + fileName += nameArray[i] + (i < len - 1 ? '|' : ')'); + } + + const regExp = new this._w.RegExp('(^|.*[\\/])' + fileName + '(\\.[^\\/]+)?\.' + extension + '(?:\\?.*|;.*)?$', 'i'); + const extRegExp = new this._w.RegExp('.+\\.' + extension + '(?:\\?.*|;.*)?$', 'i'); + + for (let c = this._d.getElementsByTagName(tagName), i = 0; i < c.length; i++) { + if (extRegExp.test(c[i][src])) { + pathList.push(c[i]); + } + } + + for (let i = 0; i < pathList.length; i++) { + let editorTag = pathList[i][src].match(regExp); + if (editorTag) { + path = editorTag[0]; + break; + } + } + + if (path === '') path = pathList.length > 0 ? pathList[0][src] : ''; + + -1 === path.indexOf(':/') && '//' !== path.slice(0, 2) && (path = 0 === path.indexOf('/') ? location.href.match(/^.*?:\/\/[^\/]*/)[0] + path : location.href.match(/^[^\?]*\/(?:)/)[0] + path); + + if (!path) throw '[SUNEDITOR.util.getIncludePath.fail] The SUNEDITOR installation path could not be automatically detected. (name: +' + name + ', extension: ' + extension + ')'; + + return path; + }, + + /** + * @deprecated + * @description Returns the CSS text that has been applied to the current page. + * @param {Document|null} doc To get the CSS text of an document(core._wd). If null get the current document. + * @returns {String} Styles string + */ + getPageStyle: function (doc) { + let cssText = ''; + const sheets = (doc || this._d).styleSheets; + + for (let i = 0, len = sheets.length, rules; i < len; i++) { + try { + rules = sheets[i].cssRules; + } catch (e) { + continue; + } + + if (rules) { + for (let c = 0, cLen = rules.length; c < cLen; c++) { + cssText += rules[c].cssText; + } + } + } + + return cssText; + }, + + /** + * @description Get the argument iframe's document object + * @param {Element} iframe Iframe element (context.element.wysiwygFrame) + * @returns {Document} + */ + getIframeDocument: function (iframe) { + let wDocument = iframe.contentWindow || iframe.contentDocument; + if (wDocument.document) wDocument = wDocument.document; + return wDocument; + }, + + /** + * @description Get attributes of argument element to string ('class="---" name="---" ') + * @param {Element} element Element object + * @param {Array|null} exceptAttrs Array of attribute names to exclude from the result + * @returns {String} + */ + getAttributesToString: function (element, exceptAttrs) { + if (!element.attributes) return ''; + + const attrs = element.attributes; + let attrString = ''; + + for (let i = 0, len = attrs.length; i < len; i++) { + if (exceptAttrs && exceptAttrs.indexOf(attrs[i].name) > -1) continue; + attrString += attrs[i].name + '="' + attrs[i].value + '" '; + } + + return attrString; + }, + + /** + * @descriptionGets Get the length in bytes of a string. + * referencing code: "https://github.com/shaan1974/myrdin/blob/master/expressions/string.js#L11" + * @param {String} text String text + * @returns {Number} + */ + getByteLength: function(text) { + const encoder = this._w.encodeURIComponent; + let cr, cl; + if (this.isIE_Edge) { + cl = this._w.unescape(encoder(text.toString())).length; + cr = 0; + + if (encoder(text.toString()).match(/(%0A|%0D)/gi) !== null) { + cr = encoder(text.toString()).match(/(%0A|%0D)/gi).length; + } + + return cl + cr; + } else { + cl = (new this._w.TextEncoder('utf-8').encode(text.toString())).length; + cr = 0; + + if (encoder(text.toString()).match(/(%0A|%0D)/gi) !== null) { + cr = encoder(text.toString()).match(/(%0A|%0D)/gi).length; + } + + return cl + cr; + } + }, + + /** + * @description It is judged whether it is the edit region top div element or iframe's body tag. + * @param {Node} element The node to check + * @returns {Boolean} + */ + isWysiwygDiv: function (element) { + return element && element.nodeType === 1 && (this.hasClass(element, 'se-wrapper-wysiwyg') || /^BODY$/i.test(element.nodeName)); + }, + + /** + * @description It is judged whether it is the contenteditable property is false. + * @param {Node} element The node to check + * @returns {Boolean} + */ + isNonEditable: function (element) { + return element && element.nodeType === 1 && element.getAttribute('contenteditable') === 'false'; + }, + + /** + * @description It is judged whether it is a node related to the text style. + * (strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code) + * @param {Node} element The node to check + * @returns {Boolean} + */ + isTextStyleElement: function (element) { + return element && element.nodeType !== 3 && /^(strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code)$/i.test(element.nodeName); + }, + + /** + * @description It is judged whether it is the format element (P, DIV, H[1-6], PRE, LI | class="__se__format__replace_xxx") + * Format element also contain "free format Element" + * @param {Node} element The node to check + * @returns {Boolean} + */ + isFormatElement: function (element) { + return element && element.nodeType === 1 && (/^(P|DIV|H[1-6]|PRE|LI|TH|TD)$/i.test(element.nodeName) || this.hasClass(element, '(\\s|^)__se__format__replace_.+(\\s|$)|(\\s|^)__se__format__free_.+(\\s|$)')) && !this.isComponent(element) && !this.isWysiwygDiv(element); + }, + + /** + * @description It is judged whether it is the range format element. (BLOCKQUOTE, OL, UL, FIGCAPTION, TABLE, THEAD, TBODY, TR, TH, TD | class="__se__format__range_xxx") + * Range format element is wrap the "format element" and "component" + * @param {Node} element The node to check + * @returns {Boolean} + */ + isRangeFormatElement: function (element) { + return element && element.nodeType === 1 && (/^(BLOCKQUOTE|OL|UL|FIGCAPTION|TABLE|THEAD|TBODY|TR|TH|TD)$/i.test(element.nodeName) || this.hasClass(element, '(\\s|^)__se__format__range_.+(\\s|$)')); + }, + + /** + * @description It is judged whether it is the closure range format element. (TH, TD | class="__se__format__range__closure_xxx") + * Closure range format elements is included in the range format element. + * - Closure range format element is wrap the "format element" and "component" + * ※ You cannot exit this format with the Enter key or Backspace key. + * ※ Use it only in special cases. ([ex] format of table cells) + * @param {Node} element The node to check + * @returns {Boolean} + */ + isClosureRangeFormatElement: function (element) { + return element && element.nodeType === 1 && (/^(TH|TD)$/i.test(element.nodeName) || this.hasClass(element, '(\\s|^)__se__format__range__closure_.+(\\s|$)')); + }, + + /** + * @description It is judged whether it is the free format element. (PRE | class="__se__format__free_xxx") + * Free format elements is included in the format element. + * Free format elements's line break is "BR" tag. + * ※ Entering the Enter key in the space on the last line ends "Free Format" and appends "Format". + * @param {Node} element The node to check + * @returns {Boolean} + */ + isFreeFormatElement: function (element) { + return element && element.nodeType === 1 && (/^PRE$/i.test(element.nodeName) || this.hasClass(element, '(\\s|^)__se__format__free_.+(\\s|$)')) && !this.isComponent(element) && !this.isWysiwygDiv(element); + }, + + /** + * @description It is judged whether it is the closure free format element. (class="__se__format__free__closure_xxx") + * Closure free format elements is included in the free format element. + * - Closure free format elements's line break is "BR" tag. + * ※ You cannot exit this format with the Enter key or Backspace key. + * ※ Use it only in special cases. ([ex] format of table cells) + * @param {Node} element The node to check + * @returns {Boolean} + */ + isClosureFreeFormatElement: function (element) { + return element && element.nodeType === 1 && this.hasClass(element, '(\\s|^)__se__format__free__closure_.+(\\s|$)'); + }, + + /** + * @description It is judged whether it is the component[img, iframe, video, audio, table] cover(class="se-component") and table, hr + * @param {Node} element The node to check + * @returns {Boolean} + */ + isComponent: function (element) { + return element && (/se-component/.test(element.className) || /^(TABLE|HR)$/.test(element.nodeName)); + }, + + /** + * @description Checks for "__se__uneditable" in the class list. + * Components with class "__se__uneditable" cannot be modified. + * @param {Element} element The element to check + * @returns {Boolean} + */ + isUneditableComponent: function (element) { + return element && this.hasClass(element, '__se__uneditable'); + }, + + /** + * @description It is judged whether it is the component [img, iframe] cover(class="se-component") + * @param {Node} element The node to check + * @returns {Boolean} + */ + isMediaComponent: function (element) { + return element && /se-component/.test(element.className); + }, + + /** + * @description It is judged whether it is the not checking node. (class="katex", "__se__tag") + * @param {Node} element The node to check + * @returns {Boolean} + */ + isNotCheckingNode: function (element) { + return element && /katex|__se__tag/.test(element.className); + }, + + /** + * @description If a parent node that contains an argument node finds a format node (util.isFormatElement), it returns that node. + * @param {Node} element Reference node. + * @param {Function|null} validation Additional validation function. + * @returns {Element|null} + */ + getFormatElement: function (element, validation) { + if (!element) return null; + if (!validation) { + validation = function () { return true; }; + } + + while (element) { + if (this.isWysiwygDiv(element)) return null; + if (this.isRangeFormatElement(element)) element.firstElementChild; + if (this.isFormatElement(element) && validation(element)) return element; + + element = element.parentNode; + } + + return null; + }, + + /** + * @description If a parent node that contains an argument node finds a format node (util.isRangeFormatElement), it returns that node. + * @param {Node} element Reference node. + * @param {Function|null} validation Additional validation function. + * @returns {Element|null} + */ + getRangeFormatElement: function (element, validation) { + if (!element) return null; + if (!validation) { + validation = function () { return true; }; + } + + while (element) { + if (this.isWysiwygDiv(element)) return null; + if (this.isRangeFormatElement(element) && !/^(THEAD|TBODY|TR)$/i.test(element.nodeName) && validation(element)) return element; + element = element.parentNode; + } + + return null; + }, + + /** + * @description If a parent node that contains an argument node finds a free format node (util.isFreeFormatElement), it returns that node. + * @param {Node} element Reference node. + * @param {Function|null} validation Additional validation function. + * @returns {Element|null} + */ + getFreeFormatElement: function (element, validation) { + if (!element) return null; + if (!validation) { + validation = function () { return true; }; + } + + while (element) { + if (this.isWysiwygDiv(element)) return null; + if (this.isFreeFormatElement(element) && validation(element)) return element; + + element = element.parentNode; + } + + return null; + }, + + /** + * @description If a parent node that contains an argument node finds a closure free format node (util.isClosureFreeFormatElement), it returns that node. + * @param {Node} element Reference node. + * @param {Function|null} validation Additional validation function. + * @returns {Element|null} + */ + getClosureFreeFormatElement: function (element, validation) { + if (!element) return null; + if (!validation) { + validation = function () { return true; }; + } + + while (element) { + if (this.isWysiwygDiv(element)) return null; + if (this.isClosureFreeFormatElement(element) && validation(element)) return element; + + element = element.parentNode; + } + + return null; + }, + + /** + * @description Add style and className of copyEl to originEl + * @param {Element} originEl Origin element + * @param {Element} copyEl Element to copy + */ + copyTagAttributes: function (originEl, copyEl) { + if (copyEl.style.cssText) { + originEl.style.cssText += copyEl.style.cssText; + } + + const classes = copyEl.classList; + for (let i = 0, len = classes.length; i < len; i++) { + this.addClass(originEl, classes[i]); + } + + if (!originEl.style.cssText) originEl.removeAttribute('style'); + if (!originEl.className.trim()) originEl.removeAttribute('class'); + }, + + /** + * @description Copy and apply attributes of format tag that should be maintained. (style, class) Ignore "__se__format__" class + * @param {Element} originEl Origin element + * @param {Element} copyEl Element to copy + */ + copyFormatAttributes: function (originEl, copyEl) { + copyEl = copyEl.cloneNode(false); + copyEl.className = copyEl.className.replace(/(\s|^)__se__format__[^\s]+/g, ''); + this.copyTagAttributes(originEl, copyEl); + }, + + /** + * @description Get the item from the array that matches the condition. + * @param {Array|HTMLCollection|NodeList} array Array to get item + * @param {Function|null} validation Conditional function + * @param {Boolean} multi If true, returns all items that meet the criteria otherwise, returns an empty array. + * If false, returns only one item that meet the criteria otherwise return null. + * @returns {Array|Node|null} + */ + getArrayItem: function (array, validation, multi) { + if (!array || array.length === 0) return null; + + validation = validation || function () { return true; }; + const arr = []; + + for (let i = 0, len = array.length, a; i < len; i++) { + a = array[i]; + if (validation(a)) { + if (!multi) return a; + else arr.push(a); + } + } + + return !multi ? null : arr; + }, + + /** + * @description Get the index of the argument value in the element array + * @param {Array|HTMLCollection|NodeList} array element array + * @param {Node} element The element to find index + * @returns {Number} + */ + getArrayIndex: function (array, element) { + let idx = -1; + for (let i = 0, len = array.length; i < len; i++) { + if (array[i] === element) { + idx = i; + break; + } + } + + return idx; + }, + + /** + * @description Get the next index of the argument value in the element array + * @param {Array|HTMLCollection|NodeList} array element array + * @param {Node} item The element to find index + * @returns {Number} + */ + nextIdx: function (array, item) { + let idx = this.getArrayIndex(array, item); + if (idx === -1) return -1; + return idx + 1; + }, + + /** + * @description Get the previous index of the argument value in the element array + * @param {Array|HTMLCollection|NodeList} array Element array + * @param {Node} item The element to find index + * @returns {Number} + */ + prevIdx: function (array, item) { + let idx = this.getArrayIndex(array, item); + if (idx === -1) return -1; + return idx - 1; + }, + + /** + * @description Returns the index compared to other sibling nodes. + * @param {Node} node The Node to find index + * @returns {Number} + */ + getPositionIndex: function (node) { + let idx = 0; + while ((node = node.previousSibling)) { + idx += 1; + } + return idx; + }, + + /** + * @description Returns the position of the "node" in the "parentNode" in a numerical array. + * ex)

aabb

: getNodePath(node: "bb", parentNode: "

") -> [1, 0] + * @param {Node} node The Node to find position path + * @param {Node|null} parentNode Parent node. If null, wysiwyg div area + * @param {Object|null} _newOffsets If you send an object of the form "{s: 0, e: 0}", the text nodes that are attached together are merged into one, centered on the "node" argument. + * "_newOffsets.s" stores the length of the combined characters after "node" and "_newOffsets.e" stores the length of the combined characters before "node". + * Do not use unless absolutely necessary. + * @returns {Array} + */ + getNodePath: function (node, parentNode, _newOffsets) { + const path = []; + let finds = true; + + this.getParentElement(node, function (el) { + if (el === parentNode) finds = false; + if (finds && !this.isWysiwygDiv(el)) { + // merge text nodes + if (_newOffsets && el.nodeType === 3) { + let temp = null, tempText = null; + _newOffsets.s = _newOffsets.e = 0; + + let previous = el.previousSibling; + while (previous && previous.nodeType === 3) { + tempText = previous.textContent.replace(this.zeroWidthRegExp, ''); + _newOffsets.s += tempText.length; + el.textContent = tempText + el.textContent; + temp = previous; + previous = previous.previousSibling; + this.removeItem(temp); + } + + let next = el.nextSibling; + while (next && next.nodeType === 3) { + tempText = next.textContent.replace(this.zeroWidthRegExp, ''); + _newOffsets.e += tempText.length; + el.textContent += tempText; + temp = next; + next = next.nextSibling; + this.removeItem(temp); + } + } + + // index push + path.push(el); + } + return false; + }.bind(this)); + + return path.map(this.getPositionIndex).reverse(); + }, + + /** + * @description Returns the node in the location of the path array obtained from "util.getNodePath". + * @param {Array} offsets Position array, array obtained from "util.getNodePath" + * @param {Node} parentNode Base parent element + * @returns {Node} + */ + getNodeFromPath: function (offsets, parentNode) { + let current = parentNode; + let nodes; + + for (let i = 0, len = offsets.length; i < len; i++) { + nodes = current.childNodes; + if (nodes.length === 0) break; + if (nodes.length <= offsets[i]) { + current = nodes[nodes.length - 1]; + } else { + current = nodes[offsets[i]]; + } + } + + return current; + }, + + /** + * @description Compares the style and class for equal values. + * Returns true if both are text nodes. + * @param {Node} a Node to compare + * @param {Node} b Node to compare + * @returns {Boolean} + */ + isSameAttributes: function (a, b) { + if (a.nodeType === 3 && b.nodeType === 3) return true; + if (a.nodeType === 3 || b.nodeType === 3) return false; + + const style_a = a.style; + const style_b = b.style; + let compStyle = 0; + + for (let i = 0, len = style_a.length; i < len; i++) { + if (style_a[style_a[i]] === style_b[style_a[i]]) compStyle++; + } + + const class_a = a.classList; + const class_b = b.classList; + const reg = this._w.RegExp; + let compClass = 0; + + for (let i = 0, len = class_a.length; i < len; i++) { + if (reg('(\s|^)' + class_a[i] + '(\s|$)').test(class_b.value)) compClass++; + } + + return (compStyle === style_b.length && compStyle === style_a.length) && (compClass === class_b.length && compClass === class_a.length); + }, + + /** + * @description Check the node is a list (ol, ul) + * @param {Node|String} node The element or element name to check + * @returns {Boolean} + */ + isList: function (node) { + return node && /^(OL|UL)$/i.test(typeof node === 'string' ? node : node.nodeName); + }, + + /** + * @description Check the node is a list cell (li) + * @param {Node|String} node The element or element name to check + * @returns {Boolean} + */ + isListCell: function (node) { + return node && /^LI$/i.test(typeof node === 'string' ? node : node.nodeName); + }, + + /** + * @description Check the node is a table (table, thead, tbody, tr, th, td) + * @param {Node|String} node The element or element name to check + * @returns {Boolean} + */ + isTable: function (node) { + return node && /^(TABLE|THEAD|TBODY|TR|TH|TD)$/i.test(typeof node === 'string' ? node : node.nodeName); + }, + + /** + * @description Check the node is a table cell (td, th) + * @param {Node|String} node The element or element name to check + * @returns {Boolean} + */ + isCell: function (node) { + return node && /^(TD|TH)$/i.test(typeof node === 'string' ? node : node.nodeName); + }, + + /** + * @description Check the node is a break node (BR) + * @param {Node|String} node The element or element name to check + * @returns {Boolean} + */ + isBreak: function (node) { + return node && /^BR$/i.test(typeof node === 'string' ? node : node.nodeName); + }, + + + /** + * @description Check the node is a anchor node (A) + * @param {Node|String} node The element or element name to check + * @returns {Boolean} + */ + isAnchor: function (node) { + return node && /^A$/i.test(typeof node === 'string' ? node : node.nodeName); + }, + + /** + * @description Check the node is a media node (img, iframe, audio, video, canvas) + * @param {Node|String} node The element or element name to check + * @returns {Boolean} + */ + isMedia: function (node) { + return node && /^(IMG|IFRAME|AUDIO|VIDEO|CANVAS)$/i.test(typeof node === 'string' ? node : node.nodeName); + }, + + /** + * @description Checks for numeric (with decimal point). + * @param {String|Number} text Text string or number + * @returns {Boolean} + */ + isNumber: function (text) { + return !!text && /^-?\d+(\.\d+)?$/.test(text + ''); + }, + + /** + * @description Get a number. + * @param {String|Number} text Text string or number + * @param {Number} maxDec Maximum number of decimal places (-1 : Infinity) + * @returns {Number} + */ + getNumber: function (text, maxDec) { + if (!text) return 0; + + let number = (text + '').match(/-?\d+(\.\d+)?/); + if (!number || !number[0]) return 0; + + number = number[0]; + return maxDec < 0 ? number * 1 : maxDec === 0 ? this._w.Math.round(number * 1) : (number * 1).toFixed(maxDec) * 1; + }, + + /** + * @description Get all "children" of the argument value element (Without text nodes) + * @param {Element} element element to get child node + * @param {Function|null} validation Conditional function + * @returns {Array} + */ + getListChildren: function (element, validation) { + const children = []; + if (!element || !element.children || element.children.length === 0) return children; + + validation = validation || function () { return true; }; + + (function recursionFunc(current) { + if (element !== current && validation(current)) { + children.push(current); + } + + for (let i = 0, len = current.children.length; i < len; i++) { + recursionFunc(current.children[i]); + } + })(element); + + return children; + }, + + /** + * @description Get all "childNodes" of the argument value element (Include text nodes) + * @param {Node} element element to get child node + * @param {Function|null} validation Conditional function + * @returns {Array} + */ + getListChildNodes: function (element, validation) { + const children = []; + if (!element || element.childNodes.length === 0) return children; + + validation = validation || function () { return true; }; + + (function recursionFunc(current) { + if (element !== current && validation(current)) { + children.push(current); + } + + for (let i = 0, len = current.childNodes.length; i < len; i++) { + recursionFunc(current.childNodes[i]); + } + })(element); + + return children; + }, + + /** + * @description Returns the number of parents nodes. + * "0" when the parent node is the WYSIWYG area. + * "-1" when the element argument is the WYSIWYG area. + * @param {Node} element The element to check + * @returns {Number} + */ + getElementDepth: function (element) { + if (!element || this.isWysiwygDiv(element)) return -1; + + let depth = 0; + element = element.parentNode; + + while (element && !this.isWysiwygDiv(element)) { + depth += 1; + element = element.parentNode; + } + + return depth; + }, + + /** + * @description Compares two elements to find a common ancestor, and returns the order of the two elements. + * @param {Node} a Node to compare. + * @param {Node} b Node to compare. + * @returns {Object} { ancesstor, a, b, result: (a > b ? 1 : a < b ? -1 : 0) }; + */ + compareElements: function (a, b) { + let aNode = a, bNode = b; + while (aNode && bNode && aNode.parentNode !== bNode.parentNode) { + aNode = aNode.parentNode; + bNode = bNode.parentNode; + } + + if (!aNode || !bNode) return { ancestor: null, a: a, b: b, result: 0 }; + + const children = aNode.parentNode.childNodes; + const aIndex = this.getArrayIndex(children, aNode); + const bIndex = this.getArrayIndex(children, bNode); + + return { + ancestor: aNode.parentNode, + a: aNode, + b: bNode, + result: aIndex > bIndex ? 1 : aIndex < bIndex ? -1 : 0 + }; + }, + + /** + * @description Get the parent element of the argument value. + * A tag that satisfies the query condition is imported. + * Returns null if not found. + * @param {Node} element Reference element + * @param {String|Function} query Query String (nodeName, .className, #ID, :name) or validation function. + * Not use it like jquery. + * Only one condition can be entered at a time. + * @returns {Element|null} + */ + getParentElement: function (element, query) { + let check; + + if (typeof query === 'function') { + check = query; + } else { + let attr; + if (/^\./.test(query)) { + attr = 'className'; + query = query.split('.')[1]; + } else if (/^#/.test(query)) { + attr = 'id'; + query = '^' + query.split('#')[1] + '$'; + } else if (/^:/.test(query)) { + attr = 'name'; + query = '^' + query.split(':')[1] + '$'; + } else { + attr = 'nodeName'; + query = '^' + query + '$'; + } + + const regExp = new this._w.RegExp(query, 'i'); + check = function (el) { + return regExp.test(el[attr]); + }; + } + + while (element && !check(element)) { + if (this.isWysiwygDiv(element)) { + return null; + } + element = element.parentNode; + } + + return element; + }, + + /** + * @description Get the child element of the argument value. + * A tag that satisfies the query condition is imported. + * Returns null if not found. + * @param {Node} element Reference element + * @param {String|Function} query Query String (nodeName, .className, #ID, :name) or validation function. + * @param {Boolean} last If true returns the last node among the found child nodes. (default: first node) + * Not use it like jquery. + * Only one condition can be entered at a time. + * @returns {Element|null} + */ + getChildElement: function (element, query, last) { + let check; + + if (typeof query === 'function') { + check = query; + } else { + let attr; + if (/^\./.test(query)) { + attr = 'className'; + query = query.split('.')[1]; + } else if (/^#/.test(query)) { + attr = 'id'; + query = '^' + query.split('#')[1] + '$'; + } else if (/^:/.test(query)) { + attr = 'name'; + query = '^' + query.split(':')[1] + '$'; + } else { + attr = 'nodeName'; + query = '^' + (query === 'text' ? '#' + query : query) + '$'; + } + + const regExp = new this._w.RegExp(query, 'i'); + check = function (el) { + return regExp.test(el[attr]); + }; + } + + const childList = this.getListChildNodes(element, function (current) { + return check(current); + }); + + return childList[last ? childList.length - 1 : 0]; + }, + + /** + * @description 1. The first node of all the child nodes of the "first" element is returned. + * 2. The last node of all the child nodes of the "last" element is returned. + * 3. When there is no "last" element, the first and last nodes of all the children of the "first" element are returned. + * { sc: "first", ec: "last" } + * @param {Node} first First element + * @param {Node|null} last Last element + * @returns {Object} + */ + getEdgeChildNodes: function (first, last) { + if (!first) return; + if (!last) last = first; + + while (first && first.nodeType === 1 && first.childNodes.length > 0 && !this.isBreak(first)) first = first.firstChild; + while (last && last.nodeType === 1 && last.childNodes.length > 0 && !this.isBreak(last)) last = last.lastChild; + + return { + sc: first, + ec: last || first + }; + }, + + /** + * @description Returns the position of the left and top of argument. {left:0, top:0} + * @param {Node} element Target node + * @param {Element|null} wysiwygFrame When use iframe option, iframe object should be sent (context.element.wysiwygFrame) + * @returns {Object} + */ + getOffset: function (element, wysiwygFrame) { + let offsetLeft = 0; + let offsetTop = 0; + let offsetElement = element.nodeType === 3 ? element.parentElement : element; + const wysiwyg = this.getParentElement(element, this.isWysiwygDiv.bind(this)); + + while (offsetElement && !this.hasClass(offsetElement, 'se-container') && offsetElement !== wysiwyg) { + offsetLeft += offsetElement.offsetLeft; + offsetTop += offsetElement.offsetTop; + offsetElement = offsetElement.offsetParent; + } + + const iframe = wysiwygFrame && /iframe/i.test(wysiwygFrame.nodeName); + + return { + left: offsetLeft + (iframe ? wysiwygFrame.parentElement.offsetLeft : 0), + top: (offsetTop - (wysiwyg ? wysiwyg.scrollTop : 0)) + (iframe ? wysiwygFrame.parentElement.offsetTop : 0) + }; + }, + + /** + * @description It compares the start and end indexes of "a" and "b" and returns the number of overlapping indexes in the range. + * ex) 1, 5, 4, 6 => "2" (4 ~ 5) + * @param {Number} aStart Start index of "a" + * @param {Number} aEnd End index of "a" + * @param {Number} bStart Start index of "b" + * @param {Number} bEnd Start index of "b" + * @returns {Number} + */ + getOverlapRangeAtIndex: function (aStart, aEnd, bStart, bEnd) { + if (aStart <= bEnd ? aEnd < bStart : aEnd > bStart) return 0; + + const overlap = (aStart > bStart ? aStart : bStart) - (aEnd < bEnd ? aEnd : bEnd); + return (overlap < 0 ? overlap * -1 : overlap) + 1; + }, + + /** + * @description Set the text content value of the argument value element + * @param {Node} element Element to replace text content + * @param {String} txt Text to be applied + */ + changeTxt: function (element, txt) { + if (!element || !txt) return; + element.textContent = txt; + }, + + /** + * @description Replace element + * @param {Element} element Target element + * @param {String|Element} newElement String or element of the new element to apply + */ + changeElement: function (element, newElement) { + if (typeof newElement === 'string') { + if (element.outerHTML) { + element.outerHTML = newElement; + } else { + const doc = this.createElement('DIV'); + doc.innerHTML = newElement; + newElement = doc.firstChild; + element.parentNode.replaceChild(newElement, element); + } + } else if (newElement.nodeType === 1) { + element.parentNode.replaceChild(newElement, element); + } + }, + + /** + * @description Set style, if all styles are deleted, the style properties are deleted. + * @param {Element} element Element to set style + * @param {String} styleName Style attribute name (marginLeft, textAlign...) + * @param {String|Number} value Style value + */ + setStyle: function (element, styleName, value) { + element.style[styleName] = value; + + if (!value && !element.style.cssText) { + element.removeAttribute('style'); + } + }, + + /** + * @description Determine whether any of the matched elements are assigned the given class + * @param {Element} element Elements to search class name + * @param {String} className Class name to search for + * @returns {Boolean} + */ + hasClass: function (element, className) { + if (!element) return; + + return (new this._w.RegExp(className)).test(element.className); + }, + + /** + * @description Append the className value of the argument value element + * @param {Element} element Elements to add class name + * @param {String} className Class name to be add + */ + addClass: function (element, className) { + if (!element) return; + + const check = new this._w.RegExp('(\\s|^)' + className + '(\\s|$)'); + if (check.test(element.className)) return; + + element.className += (element.className.length > 0 ? ' ' : '') + className; + }, + + /** + * @description Delete the className value of the argument value element + * @param {Element} element Elements to remove class name + * @param {String} className Class name to be remove + */ + removeClass: function (element, className) { + if (!element) return; + + const check = new this._w.RegExp('(\\s|^)' + className + '(\\s|$)'); + element.className = element.className.replace(check, ' ').trim(); + + if (!element.className.trim()) element.removeAttribute('class'); + }, + + /** + * @description Argument value If there is no class name, insert it and delete the class name if it exists + * @param {Element} element Elements to replace class name + * @param {String} className Class name to be change + * @returns {Boolean|undefined} + */ + toggleClass: function (element, className) { + if (!element) return; + let result = false; + + const check = new this._w.RegExp('(\\s|^)' + className + '(\\s|$)'); + if (check.test(element.className)) { + element.className = element.className.replace(check, ' ').trim(); + } else { + element.className += ' ' + className; + result = true; + } + + if (!element.className.trim()) element.removeAttribute('class'); + + return result; + }, + + /** + * @description In the predefined code view mode, the buttons except the executable button are changed to the 'disabled' state. + * core.codeViewDisabledButtons (An array of buttons whose class name is not "se-code-view-enabled") + * core.resizingDisabledButtons (An array of buttons whose class name is not "se-resizing-enabled") + * @param {Boolean} disabled Disabled value + * @param {Array|HTMLCollection|NodeList} buttonList Button array + */ + setDisabledButtons: function (disabled, buttonList) { + for (let i = 0, len = buttonList.length; i < len; i++) { + buttonList[i].disabled = disabled; + } + }, + + /** + * @description Delete argumenu value element + * @param {Node} item Node to be remove + */ + removeItem: function (item) { + if (!item) return; + try { + item.remove(); + } catch (e) { + if (item.parentNode) item.parentNode.removeChild(item); + } + }, + + /** + * @description Delete all parent nodes that match the condition. + * Returns an {sc: previousSibling, ec: nextSibling}(the deleted node reference) or null. + * @param {Node} item Node to be remove + * @param {Function|null} validation Validation function. default(Deleted if it only have breakLine and blanks) + * @param {Element|null} stopParent Stop when the parent node reaches stopParent + * @returns {Object|null} {sc: previousSibling, ec: nextSibling} + */ + removeItemAllParents: function (item, validation, stopParent) { + if (!item) return null; + let cc = null; + if (!validation) { + validation = function (current) { + if (current === stopParent || this.isComponent(current)) return false; + const text = current.textContent.trim(); + return text.length === 0 || /^(\n|\u200B)+$/.test(text); + }.bind(this); + } + + (function recursionFunc (element) { + if (!util.isWysiwygDiv(element)) { + const parent = element.parentNode; + if (parent && validation(element)) { + cc = { + sc: element.previousElementSibling, + ec: element.nextElementSibling + }; + util.removeItem(element); + recursionFunc(parent); + } + } + }(item)); + + return cc; + }, + + /** + * @description Detach Nested all nested lists under the "baseNode". + * Returns a list with nested removed. + * @param {Node} baseNode Element on which to base. + * @param {Boolean} all If true, it also detach all nested lists of a returned list. + * @returns {Element} + */ + detachNestedList: function (baseNode, all) { + const rNode = this._deleteNestedList(baseNode); + let rangeElement, cNodes; + + if (rNode) { + rangeElement = rNode.cloneNode(false); + cNodes = rNode.childNodes; + const index = this.getPositionIndex(baseNode); + while (cNodes[index]) { + rangeElement.appendChild(cNodes[index]); + } + } else { + rangeElement = baseNode; + } + + let rChildren; + if (!all) { + const depth = this.getElementDepth(baseNode) + 2; + rChildren = this.getListChildren(baseNode, function (current) { return this.isListCell(current) && !current.previousElementSibling && this.getElementDepth(current) === depth; }.bind(this)); + } else { + rChildren = this.getListChildren(rangeElement, function (current) { return this.isListCell(current) && !current.previousElementSibling; }.bind(this)); + } + + for (let i = 0, len = rChildren.length; i < len; i++) { + this._deleteNestedList(rChildren[i]); + } + + if (rNode) { + rNode.parentNode.insertBefore(rangeElement, rNode.nextSibling); + if (cNodes && cNodes.length === 0) this.removeItem(rNode); + } + + return rangeElement === baseNode ? rangeElement.parentNode : rangeElement; + }, + + /** + * @description Sub function of util.detachNestedList method. + * @private + */ + _deleteNestedList: function (baseNode) { + const baseParent = baseNode.parentNode; + let sibling = baseParent; + let parent = sibling.parentNode; + let liSibling, liParent, child, index, c; + + while (this.isListCell(parent)) { + index = this.getPositionIndex(baseNode); + liSibling = parent.nextElementSibling; + liParent = parent.parentNode; + child = sibling; + while(child) { + sibling = sibling.nextSibling; + if (this.isList(child)) { + c = child.childNodes; + while (c[index]) { + liParent.insertBefore(c[index], liSibling); + } + if (c.length === 0) this.removeItem(child); + } else { + liParent.appendChild(child); + } + child = sibling; + } + sibling = liParent; + parent = liParent.parentNode; + } + + if (baseParent.children.length === 0) this.removeItem(baseParent); + + return liParent; + }, + + /** + * @description Split all tags based on "baseNode" + * Returns the last element of the splited tag. + * @param {Node} baseNode Element or text node on which to base + * @param {Number|null} offset Text offset of "baseNode" (Only valid when "baseNode" is a text node) + * @param {Number} depth The nesting depth of the element being split. (default: 0) + * @returns {Element} + */ + splitElement: function (baseNode, offset, depth) { + const bp = baseNode.parentNode; + let index = 0, newEl, children, temp; + let next = true; + if (!depth || depth < 0) depth = 0; + + if (baseNode.nodeType === 3) { + index = this.getPositionIndex(baseNode); + if (offset >= 0) { + baseNode.splitText(offset); + const after = this.getNodeFromPath([index + 1], bp); + if (this.onlyZeroWidthSpace(after)) after.data = this.zeroWidthSpace; + } + } else if (baseNode.nodeType === 1) { + if (!baseNode.previousSibling) { + if (this.getElementDepth(baseNode) === depth) next = false; + } else { + baseNode = baseNode.previousSibling; + } + } + + let depthEl = baseNode; + while (this.getElementDepth(depthEl) > depth) { + index = this.getPositionIndex(depthEl) + 1; + depthEl = depthEl.parentNode; + + temp = newEl; + newEl = depthEl.cloneNode(false); + children = depthEl.childNodes; + + if (temp) { + if (this.isListCell(newEl) && this.isList(temp) && temp.firstElementChild) { + newEl.innerHTML = temp.firstElementChild.innerHTML; + util.removeItem(temp.firstElementChild); + if (temp.children.length > 0) newEl.appendChild(temp); + } else { + newEl.appendChild(temp); + } + } + + while (children[index]) { + newEl.appendChild(children[index]); + } + } + + if (depthEl.childNodes.length <= 1 && (!depthEl.firstChild || depthEl.firstChild.textContent.length === 0)) depthEl.innerHTML = '
'; + + const pElement = depthEl.parentNode; + if (next) depthEl = depthEl.nextSibling; + if (!newEl) return depthEl; + + this.mergeSameTags(newEl, null, false); + this.mergeNestedTags(newEl, function (current) { return this.isList(current); }.bind(this)); + + if (newEl.childNodes.length > 0) pElement.insertBefore(newEl, depthEl); + else newEl = depthEl; + + if (bp.childNodes.length === 0) this.removeItem(bp); + + return newEl; + }, + + /** + * @description Use with "npdePath (util.getNodePath)" to merge the same attributes and tags if they are present and modify the nodepath. + * If "offset" has been changed, it will return as much "offset" as it has been modified. + * An array containing change offsets is returned in the order of the "nodePathArray" array. + * @param {Element} element Element + * @param {Array|null} nodePathArray Array of NodePath object ([util.getNodePath(), ..]) + * @param {Boolean} onlyText If true, non-text nodes(!util._isIgnoreNodeChange) like 'span', 'strong'.. are ignored. + * @returns {Array} [offset, ..] + */ + mergeSameTags: function (element, nodePathArray, onlyText) { + const inst = this; + const nodePathLen = nodePathArray ? nodePathArray.length : 0; + let offsets = null; + + if (nodePathLen) { + offsets = this._w.Array.apply(null, new this._w.Array(nodePathLen)).map(this._w.Number.prototype.valueOf, 0); + } + + (function recursionFunc(current, depth, depthIndex) { + const children = current.childNodes; + + for (let i = 0, len = children.length, child, next; i < len; i++) { + child = children[i]; + next = children[i + 1]; + if (!child) break; + if((onlyText && inst._isIgnoreNodeChange(child)) || (!onlyText && (inst.isTable(child) || inst.isListCell(child) || (inst.isFormatElement(child) && !inst.isFreeFormatElement(child))))) { + if (inst.isTable(child) || inst.isListCell(child)) { + recursionFunc(child, depth + 1, i); + } + continue; + } + if (len === 1 && current.nodeName === child.nodeName && current.parentNode) { + // update nodePath + if (nodePathLen) { + let path, c, p, cDepth, spliceDepth; + for (let n = 0; n < nodePathLen; n++) { + path = nodePathArray[n]; + if (path && path[depth] === i) { + c = child, p = current, cDepth = depth, spliceDepth = true; + while (cDepth >= 0) { + if (inst.getArrayIndex(p.childNodes, c) !== path[cDepth]) { + spliceDepth = false; + break; + } + c = child.parentNode; + p = c.parentNode; + cDepth--; + } + if (spliceDepth) { + path.splice(depth, 1); + path[depth] = i; + } + } + } + } + + // merge tag + inst.copyTagAttributes(child, current); + current.parentNode.insertBefore(child, current); + inst.removeItem(current); + } + if (!next) { + if (child.nodeType === 1) recursionFunc(child, depth + 1, i); + break; + } + + if (child.nodeName === next.nodeName && inst.isSameAttributes(child, next) && child.href === next.href) { + const childs = child.childNodes; + let childLength = 0; + for (let n = 0, nLen = childs.length; n < nLen; n++) { + if (childs[n].textContent.length > 0) childLength++; + } + + const l = child.lastChild; + const r = next.firstChild; + let addOffset = 0; + if (l && r) { + const textOffset = l.nodeType === 3 && r.nodeType === 3; + addOffset = l.textContent.length; + let tempL = l.previousSibling; + while(tempL && tempL.nodeType === 3) { + addOffset += tempL.textContent.length; + tempL = tempL.previousSibling; + } + + if (childLength > 0 && l.nodeType === 3 && r.nodeType === 3 && (l.textContent.length > 0 || r.textContent.length > 0)) childLength--; + + if (nodePathLen) { + let path = null; + for (let n = 0; n < nodePathLen; n++) { + path = nodePathArray[n]; + if (path && path[depth] > i) { + if (depth > 0 && path[depth - 1] !== depthIndex) continue; + + path[depth] -= 1; + if (path[depth + 1] >= 0 && path[depth] === i) { + path[depth + 1] += childLength; + if (textOffset) { + if (l && l.nodeType === 3 && r && r.nodeType === 3) { + offsets[n] += addOffset; + } + } + } + } + } + } + } + + if (child.nodeType === 3) { + addOffset = child.textContent.length; + child.textContent += next.textContent; + if (nodePathLen) { + let path = null; + for (let n = 0; n < nodePathLen; n++) { + path = nodePathArray[n]; + if (path && path[depth] > i) { + if (depth > 0 && path[depth - 1] !== depthIndex) continue; + + path[depth] -= 1; + if (path[depth + 1] >= 0 && path[depth] === i) { + path[depth + 1] += childLength; + offsets[n] += addOffset; + } + } + } + } + } else { + child.innerHTML += next.innerHTML; + } + + inst.removeItem(next); + i--; + } else if (child.nodeType === 1) { + recursionFunc(child, depth + 1, i); + } + } + })(element, 0, 0); + + return offsets; + }, + + /** + * @description Remove nested tags without other child nodes. + * @param {Element} element Element object + * @param {Function|String|null} validation Validation function / String("tag1|tag2..") / If null, all tags are applicable. + */ + mergeNestedTags: function (element, validation) { + if (typeof validation === 'string') { + validation = function (current) { return this.test(current.tagName); }.bind(new this._w.RegExp('^(' + (validation ? validation : '.+') + ')$', 'i')); + } else if (typeof validation !== 'function') { + validation = function () { return true; }; + } + + (function recursionFunc(current) { + let children = current.children; + if (children.length === 1 && children[0].nodeName === current.nodeName && validation(current)) { + const temp = children[0]; + children = temp.children; + while (children[0]) { + current.appendChild(children[0]); + } + current.removeChild(temp); + } + + for (let i = 0, len = current.children.length; i < len; i++) { + recursionFunc(current.children[i]); + } + })(element); + }, + + /** + * @description Delete a empty child node of argument element + * @param {Element} element Element node + * @param {Node|null} notRemoveNode Do not remove node + */ + removeEmptyNode: function (element, notRemoveNode) { + const inst = this; + + if (notRemoveNode) { + notRemoveNode = inst.getParentElement(notRemoveNode, function (current) { + return element === current.parentElement; + }); + } + + (function recursionFunc(current) { + if (inst._notTextNode(current) || current === notRemoveNode || inst.isNonEditable(current)) return 0; + if (current !== element && inst.onlyZeroWidthSpace(current.textContent) && (!current.firstChild || !inst.isBreak(current.firstChild))) { + if (current.parentNode) { + current.parentNode.removeChild(current); + return -1; + } + } else { + const children = current.children; + for (let i = 0, len = children.length, r = 0; i < len; i++) { + if (!children[i + r] || inst.isComponent(children[i + r])) continue; + r += recursionFunc(children[i + r]); + } + } + + return 0; + })(element); + + if (element.childNodes.length === 0) element.innerHTML = '
'; + }, + + /** + * @description Remove whitespace between tags in HTML string. + * @param {String} html HTML string + * @returns {String} + */ + htmlRemoveWhiteSpace: function (html) { + if (!html) return ''; + return html.trim().replace(/<\/?(?!strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code)[^>^<]+>\s+(?=<)/ig, function (m) { return m.trim(); }); + }, + + /** + * @description Sort a element array by depth of element. + * @param {Array} array Array object + * @param {Boolean} des true: descending order / false: ascending order + */ + sortByDepth: function (array, des) { + const t = !des ? -1 : 1; + const f = t * -1; + + array.sort(function (a, b) { + if (!this.isListCell(a) || !this.isListCell(b)) return 0; + a = this.getElementDepth(a); + b = this.getElementDepth(b); + return a > b ? t : a < b ? f : 0; + }.bind(this)); + }, + + /** + * @description Nodes that need to be added without modification when changing text nodes + * @param {Node} element Element to check + * @returns {Boolean} + * @private + */ + _isIgnoreNodeChange: function (element) { + return element && element.nodeType !== 3 && (this.isNonEditable(element) || !this.isTextStyleElement(element)); + }, + + /** + * @description Nodes that must remain undetached when changing text nodes (A, Label, Code) + * @param {Node|String} element Element to check + * @returns {Boolean} + * @private + */ + _isMaintainedNode: function (element) { + return element && element.nodeType !== 3 && /^(a|label|code)$/i.test(typeof element === 'string' ? element : element.nodeName); + }, + + /** + * @description Node with font-size style + * @param {Node} element Element to check + * @returns {Boolean} + * @private + */ + _isSizeNode: function (element) { + return element && element.nodeType !== 3 && this.isTextStyleElement(element) && !!element.style.fontSize; + }, + + /** + * @description Nodes without text + * @param {Node} element Element to check + * @returns {Boolean} + * @private + */ + _notTextNode: function (element) { + return element && element.nodeType !== 3 && (this.isComponent(element) || /^(br|input|select|canvas|img|iframe|audio|video)$/i.test(typeof element === 'string' ? element : element.nodeName)); + }, + + /** + * @description Check disallowed tags + * @param {Node} element Element to check + * @returns {Boolean} + * @private + */ + _disallowedTags: function (element) { + return /^(meta|script|link|style|[a-z]+\:[a-z]+)$/i.test(element.nodeName); + }, + + /** + * @description Create whitelist RegExp object. + * Return RegExp format: new RegExp("<\\/?\\b(?!" + list + ")\\b[^>^<]*+>", "gi") + * @param {String} list Tags list ("br|p|div|pre...") + * @returns {RegExp} + */ + createTagsWhitelist: function (list) { + return new RegExp('<\\/?\\b(?!\\b' + list.replace(/\|/g, '\\b|\\b') + '\\b)[^>]*>', 'gi'); + }, + + /** + * @description Get key of the options.allowStyles + * @param {Node} node Node + * @returns {String} + * @private + */ + _getCheckFormat: function (node) { + return node.nodeType === 3 ? 'null' : + this.isComponent(node) ? 'component' : + this.isClosureFreeFormatElement(node) ? 'closureFreeFormat' : + this.isFreeFormatElement(node) ? 'freeFormat' : + this.isClosureRangeFormatElement(node) ? 'closureRangeFormat' : + this.isRangeFormatElement(node) ? 'rangeFormat' : + this.isFormatElement(node) ? 'format' : node.nodeName.toLowerCase(); + }, + + /** + * @description Fix tags that do not fit the editor format. + * @param {Element} documentFragment Document fragment "DOCUMENT_FRAGMENT_NODE" (nodeType === 11) + * @param {RegExp} htmlCheckWhitelistRegExp Editor tags whitelist (core._htmlCheckWhitelistRegExp) + * @param {Object} allowStyles options.allowStyles + * @private + */ + _consistencyCheckOfHTML: function (documentFragment, htmlCheckWhitelistRegExp, allowStyles) { + /** + * It is can use ".children(util.getListChildren)" to exclude text nodes, but "documentFragment.children" is not supported in IE. + * So check the node type and exclude the text no (current.nodeType !== 1) + */ + const removeTags = [], emptyTags = [], wrongList = [], withoutFormatCells = []; + + // wrong position + const wrongTags = this.getListChildNodes(documentFragment, function (current) { + if (current.nodeType !== 1) return false; + + // white list + if (!htmlCheckWhitelistRegExp.test(current.nodeName) && current.childNodes.length === 0 && this.isNotCheckingNode(current)) { + removeTags.push(current); + return false; + } + + const nrtag = !this.getParentElement(current, this.isNotCheckingNode); + // empty tags + if ((!this.isTable(current) && !this.isListCell(current)) && (this.isFormatElement(current) || this.isRangeFormatElement(current) || this.isTextStyleElement(current)) && current.childNodes.length === 0 && nrtag) { + emptyTags.push(current); + return false; + } + + // wrong list + if (this.isList(current.parentNode) && !this.isList(current) && !this.isListCell(current)) { + wrongList.push(current); + return false; + } + + // table cells + if (this.isCell(current)) { + const fel = current.firstElementChild; + if (!this.isFormatElement(fel) && !this.isRangeFormatElement(fel) && !this.isComponent(fel)) { + withoutFormatCells.push(current); + return false; + } + } + + const result = current.parentNode !== documentFragment && + (this.isFormatElement(current) || this.isComponent(current) || this.isList(current)) && + !this.isRangeFormatElement(current.parentNode) && !this.isListCell(current.parentNode) && + !this.getParentElement(current, this.isComponent) && nrtag; + + // @v3 + // if (!result) { + // const styles = allowStyles[this._getCheckFormat(current)]; + // if (!!styles && styles.length > 0) { + // let s = ''; + // const currentStyle = current.style; + // for (let i = 0, len = styles.length; i < len; i++) { + // s += styles[i] + ':' + currentStyle[styles[i]] + '; '; + // } + + // if (!s) current.removeAttribute('style'); + // else current.style.cssText = s; + // } + // } + + return result; + }.bind(this)); + + for (let i = 0, len = removeTags.length; i < len; i++) { + this.removeItem(removeTags[i]); + } + + const checkTags = []; + for (let i = 0, len = wrongTags.length, t, p; i < len; i++) { + t = wrongTags[i]; + p = t.parentNode; + if (!p || !p.parentNode) continue; + p.parentNode.insertBefore(t, p); + checkTags.push(p); + } + + for (let i = 0, len = checkTags.length, t; i < len; i++) { + t = checkTags[i]; + if (this.onlyZeroWidthSpace(t.textContent.trim())) { + this.removeItem(t); + } + } + + for (let i = 0, len = emptyTags.length; i < len; i++) { + this.removeItem(emptyTags[i]); + } + + for (let i = 0, len = wrongList.length, t, tp, children, p; i < len; i++) { + t = wrongList[i]; + + tp = this.createElement('LI'); + children = t.childNodes; + while (children[0]) { + tp.appendChild(children[0]); + } + + p = t.parentNode; + if (!p) continue; + p.insertBefore(tp, t); + this.removeItem(t); + } + + for (let i = 0, len = withoutFormatCells.length, t, f; i < len; i++) { + t = withoutFormatCells[i]; + f = this.createElement('DIV'); + f.innerHTML = (t.textContent.trim().length === 0 && t.children.length === 0) ? '
' : t.innerHTML; + t.innerHTML = f.outerHTML; + } + }, + + _setDefaultOptionStyle: function (options, defaultStyle) { + let optionStyle = ''; + if (options.height) optionStyle += 'height:' + options.height + ';'; + if (options.minHeight) optionStyle += 'min-height:' + options.minHeight + ';'; + if (options.maxHeight) optionStyle += 'max-height:' + options.maxHeight + ';'; + if (options.position) optionStyle += 'position:' + options.position + ';'; + if (options.width) optionStyle += 'width:' + options.width + ';'; + if (options.minWidth) optionStyle += 'min-width:' + options.minWidth + ';'; + if (options.maxWidth) optionStyle += 'max-width:' + options.maxWidth + ';'; + + let top = '', frame = '', editor = ''; + defaultStyle = optionStyle + defaultStyle; + const styleArr = defaultStyle.split(';'); + for (let i = 0, len = styleArr.length, s; i < len; i++) { + s = styleArr[i].trim(); + if (!s) continue; + if (/^(min-|max-)?width\s*:/.test(s)) { + top += s + ';'; + continue; + } + if (/^(min-|max-)?height\s*:/.test(s)) { + if (/^height/.test(s) && s.split(':')[1].trim() === 'auto') { + options.height = 'auto'; + } + frame += s + ';'; + continue; + } + editor += s + ';'; + } + + return { + top: top, + frame: frame, + editor: editor + }; + }, + + _setIframeDocument: function (frame, options) { + frame.setAttribute('scrolling', 'auto'); + frame.contentDocument.head.innerHTML = '' + + '' + + '' + + this._setIframeCssTags(options); + frame.contentDocument.body.className = options._editableClass; + frame.contentDocument.body.setAttribute('contenteditable', true); + }, + + _setIframeCssTags: function (options) { + const linkNames = options.iframeCSSFileName; + const wRegExp = this._w.RegExp; + let tagString = ''; + + for (let f = 0, len = linkNames.length, path; f < len; f++) { + path = []; + + if (/(^https?:\/\/)|(^data:text\/css,)/.test(linkNames[f])) { + path.push(linkNames[f]); + } else { + const CSSFileName = new wRegExp('(^|.*[\\/])' + linkNames[f] + '(\\..+)?\\.css(?:\\?.*|;.*)?$', 'i'); + for (let c = document.getElementsByTagName('link'), i = 0, len = c.length, styleTag; i < len; i++) { + styleTag = c[i].href.match(CSSFileName); + if (styleTag) path.push(styleTag[0]); + } + } + + if (!path || path.length === 0) throw '[SUNEDITOR.constructor.iframe.fail] The suneditor CSS files installation path could not be automatically detected. Please set the option property "iframeCSSFileName" before creating editor instances.'; + + for (let i = 0, len = path.length; i < len; i++) { + tagString += ''; + } + } + + return tagString + (options.height === 'auto' ? '' : ''); + } +}; + +/* harmony default export */ __webpack_exports__["default"] = (util); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/command/blockquote.js": +/*!******************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/command/blockquote.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'blockquote', + display: 'command', + add: function (core, targetElement) { + const context = core.context; + context.blockquote = { + targetButton: targetElement, + tag: core.util.createElement('BLOCKQUOTE') + }; + }, + + /** + * @Override core + */ + active: function (element) { + if (!element) { + this.util.removeClass(this.context.blockquote.targetButton, 'active'); + } else if (/blockquote/i.test(element.nodeName)) { + this.util.addClass(this.context.blockquote.targetButton, 'active'); + return true; + } + + return false; + }, + + /** + * @Override core + */ + action: function () { + const currentBlockquote = this.util.getParentElement(this.getSelectionNode(), 'blockquote'); + + if (currentBlockquote) { + this.detachRangeFormatElement(currentBlockquote, null, null, false, false); + } else { + this.applyRangeFormatElement(this.context.blockquote.tag.cloneNode(false)); + } + } +}); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/dialog/audio.js": +/*!************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/dialog/audio.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/dialog */ "./node_modules/suneditor/src/plugins/modules/dialog.js"); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_dialog__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _modules_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/component */ "./node_modules/suneditor/src/plugins/modules/component.js"); +/* harmony import */ var _modules_component__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_modules_component__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _modules_fileManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/fileManager */ "./node_modules/suneditor/src/plugins/modules/fileManager.js"); +/* harmony import */ var _modules_fileManager__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_modules_fileManager__WEBPACK_IMPORTED_MODULE_2__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'audio', + display: 'dialog', + add: function (core) { + core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_0___default.a, _modules_component__WEBPACK_IMPORTED_MODULE_1___default.a, _modules_fileManager__WEBPACK_IMPORTED_MODULE_2___default.a]); + + const context = core.context; + const contextAudio = context.audio = { + _infoList: [], // @Override fileManager + _infoIndex: 0, // @Override fileManager + _uploadFileLength: 0, // @Override fileManager + focusElement: null, // @Override dialog // This element has focus when the dialog is opened. + targetSelect: null, + _origin_w: core.options.audioWidth, + _origin_h: core.options.audioHeight, + _linkValue: '', + // @require @Override component + _element: null, + _cover: null, + _container: null, + }; + + /** dialog */ + let audio_dialog = this.setDialog(core); + contextAudio.modal = audio_dialog; + contextAudio.audioInputFile = audio_dialog.querySelector('._se_audio_files'); + contextAudio.audioUrlFile = audio_dialog.querySelector('.se-input-url'); + contextAudio.focusElement = contextAudio.audioInputFile || contextAudio.audioUrlFile; + contextAudio.preview = audio_dialog.querySelector('.se-link-preview'); + + /** controller */ + let audio_controller = this.setController(core); + contextAudio.controller = audio_controller; + + /** add event listeners */ + audio_dialog.querySelector('form').addEventListener('submit', this.submit.bind(core)); + if (contextAudio.audioInputFile) audio_dialog.querySelector('.se-dialog-files-edge-button').addEventListener('click', this._removeSelectedFiles.bind(contextAudio.audioInputFile, contextAudio.audioUrlFile, contextAudio.preview)); + if (contextAudio.audioInputFile && contextAudio.audioUrlFile) contextAudio.audioInputFile.addEventListener('change', this._fileInputChange.bind(contextAudio)); + audio_controller.addEventListener('click', this.onClick_controller.bind(core)); + if (contextAudio.audioUrlFile) contextAudio.audioUrlFile.addEventListener('input', this._onLinkPreview.bind(contextAudio.preview, contextAudio, core.options.linkProtocol)); + + /** append html */ + context.dialog.modal.appendChild(audio_dialog); + + /** append controller */ + context.element.relative.appendChild(audio_controller); + + /** empty memory */ + audio_dialog = null, audio_controller = null; + }, + + /** HTML - dialog */ + setDialog: function (core) { + const option = core.options; + const lang = core.lang; + const dialog = core.util.createElement('DIV'); + + dialog.className = 'se-dialog-content'; + dialog.style.display = 'none'; + let html = '' + + '

' + + '
' + + '' + + '' + lang.dialogBox.audioBox.title + '' + + '
' + + '
'; + + if (option.audioFileInput) { + html += '' + + '
' + + '' + + '
' + + '' + + '' + + '
' + + '
'; + } + + if (option.audioUrlInput) { + html += '' + + '
' + + '' + + '' + + '' + + '
'; + } + + html += '' + + '
' + + '' + + '
'; + + dialog.innerHTML = html; + + return dialog; + }, + + /** HTML - controller */ + setController: function (core) { + const lang = core.lang; + const icons = core.icons; + const link_btn = core.util.createElement('DIV'); + + link_btn.className = 'se-controller se-controller-link'; + link_btn.innerHTML = '' + + '
' + + ''; + + return link_btn; + }, + + // Disable url input when uploading files + _fileInputChange: function () { + if (!this.audioInputFile.value) { + this.audioUrlFile.removeAttribute('disabled'); + this.preview.style.textDecoration = ''; + } else { + this.audioUrlFile.setAttribute('disabled', true); + this.preview.style.textDecoration = 'line-through'; + } + }, + + // Disable url input when uploading files + _removeSelectedFiles: function (urlInput, preview) { + this.value = ''; + if (urlInput) { + urlInput.removeAttribute('disabled'); + preview.style.textDecoration = ''; + } + }, + + // create new audio tag + _createAudioTag: function () { + const oAudio = this.util.createElement('AUDIO'); + this.plugins.audio._setTagAttrs.call(this, oAudio); + + const w = this.context.audio._origin_w; + const h = this.context.audio._origin_h; + oAudio.setAttribute('origin-size', w + ',' + h); + oAudio.style.cssText = (w ? ('width:' + w + '; ') : '') + (h ? ('height:' + h + ';') : ''); + + return oAudio; + }, + + _setTagAttrs: function (element) { + element.setAttribute('controls', true); + + const attrs = this.options.audioTagAttrs; + if (!attrs) return; + + for (let key in attrs) { + if (!this.util.hasOwn(attrs, key)) continue; + element.setAttribute(key, attrs[key]); + } + }, + + _onLinkPreview: function (context, protocol, e) { + const value = e.target.value.trim(); + context._linkValue = this.textContent = !value ? '' : (protocol && value.indexOf('://') === -1 && value.indexOf('#') !== 0) ? protocol + value : value.indexOf('://') === -1 ? '/' + value : value; + }, + + /** + * @Required @Override fileManager + */ + fileTags: ['audio'], + + /** + * @Override core, fileManager, resizing + * @description It is called from core.selectComponent. + * @param {Element} element Target element + */ + select: function (element) { + this.plugins.audio.onModifyMode.call(this, element); + }, + + /** + * @Override fileManager, resizing + */ + destroy: function (element) { + element = element || this.context.audio._element; + const container = this.util.getParentElement(element, this.util.isComponent) || element; + const dataIndex = element.getAttribute('data-index') * 1; + const focusEl = (container.previousElementSibling || container.nextElementSibling); + + const emptyDiv = container.parentNode; + this.util.removeItem(container); + this.plugins.audio.init.call(this); + this.controllersOff(); + + if (emptyDiv !== this.context.element.wysiwyg) this.util.removeItemAllParents(emptyDiv, function (current) { return current.childNodes.length === 0; }, null); + + // focus + this.focusEdge(focusEl); + + // fileManager event + this.plugins.fileManager.deleteInfo.call(this, 'audio', dataIndex, this.functions.onAudioUpload); + + // history stack + this.history.push(false); + }, + + /** + * @Override fileManager + */ + checkFileInfo: function () { + this.plugins.fileManager.checkInfo.call(this, 'audio', ['audio'], this.functions.onAudioUpload, this.plugins.audio.updateCover.bind(this), false); + }, + + /** + * @Override fileManager + */ + resetFileInfo: function () { + this.plugins.fileManager.resetInfo.call(this, 'audio', this.functions.onAudioUpload); + }, + + /** + * @Required @Override dialog + */ + on: function (update) { + const contextAudio = this.context.audio; + + if (!update) { + this.plugins.audio.init.call(this); + if (contextAudio.audioInputFile && this.options.audioMultipleFile) contextAudio.audioInputFile.setAttribute('multiple', 'multiple'); + } else if (contextAudio._element) { + this.context.dialog.updateModal = true; + contextAudio._linkValue = contextAudio.preview.textContent = contextAudio.audioUrlFile.value = contextAudio._element.src; + if (contextAudio.audioInputFile && this.options.audioMultipleFile) contextAudio.audioInputFile.removeAttribute('multiple'); + } else { + if (contextAudio.audioInputFile && this.options.audioMultipleFile) contextAudio.audioInputFile.removeAttribute('multiple'); + } + }, + + /** + * @Required @Override dialog + */ + open: function () { + this.plugins.dialog.open.call(this, 'audio', 'audio' === this.currentControllerName); + }, + + submit: function (e) { + const contextAudio = this.context.audio; + + e.preventDefault(); + e.stopPropagation(); + + try { + if (contextAudio.audioInputFile && contextAudio.audioInputFile.files.length > 0) { + this.showLoading(); + this.plugins.audio.submitAction.call(this, contextAudio.audioInputFile.files); + } else if (contextAudio.audioUrlFile && contextAudio._linkValue.length > 0) { + this.showLoading(); + this.plugins.audio.setupUrl.call(this, contextAudio._linkValue); + } + } catch (error) { + this.closeLoading(); + throw Error('[SUNEDITOR.audio.submit.fail] cause : "' + error.message + '"'); + } finally { + this.plugins.dialog.close.call(this); + } + + return false; + }, + + submitAction: function (fileList) { + if (fileList.length === 0) return; + + let fileSize = 0; + let files = []; + for (let i = 0, len = fileList.length; i < len; i++) { + if (/audio/i.test(fileList[i].type)) { + files.push(fileList[i]); + fileSize += fileList[i].size; + } + } + + const limitSize = this.options.audioUploadSizeLimit; + if (limitSize > 0) { + let infoSize = 0; + const audiosInfo = this.context.audio._infoList; + for (let i = 0, len = audiosInfo.length; i < len; i++) { + infoSize += audiosInfo[i].size * 1; + } + + if ((fileSize + infoSize) > limitSize) { + this.closeLoading(); + const err = '[SUNEDITOR.audioUpload.fail] Size of uploadable total audios: ' + (limitSize/1000) + 'KB'; + if (typeof this.functions.onAudioUploadError !== 'function' || this.functions.onAudioUploadError(err, { 'limitSize': limitSize, 'currentSize': infoSize, 'uploadSize': fileSize }, this)) { + this.functions.noticeOpen(err); + } + return; + } + } + + const contextAudio = this.context.audio; + contextAudio._uploadFileLength = files.length; + + const info = { + isUpdate: this.context.dialog.updateModal, + element: contextAudio._element + }; + + if (typeof this.functions.onAudioUploadBefore === 'function') { + const result = this.functions.onAudioUploadBefore(files, info, this, function (data) { + if (data && this._w.Array.isArray(data.result)) { + this.plugins.audio.register.call(this, info, data); + } else { + this.plugins.audio.upload.call(this, info, data); + } + }.bind(this)); + + if (typeof result === 'undefined') return; + if (!result) { + this.closeLoading(); + return; + } + if (typeof result === 'object' && result.length > 0) files = result; + } + + this.plugins.audio.upload.call(this, info, files); + }, + + error: function (message, response) { + this.closeLoading(); + if (typeof this.functions.onAudioUploadError !== 'function' || this.functions.onAudioUploadError(message, response, this)) { + this.functions.noticeOpen(message); + throw Error('[SUNEDITOR.plugin.audio.exception] response: ' + message); + } + }, + + upload: function (info, files) { + if (!files) { + this.closeLoading(); + return; + } + if (typeof files === 'string') { + this.plugins.audio.error.call(this, files, null); + return; + } + + const audioUploadUrl = this.options.audioUploadUrl; + const filesLen = this.context.dialog.updateModal ? 1 : files.length; + + // create formData + const formData = new FormData(); + for (let i = 0; i < filesLen; i++) { + formData.append('file-' + i, files[i]); + } + + // server upload + this.plugins.fileManager.upload.call(this, audioUploadUrl, this.options.audioUploadHeader, formData, this.plugins.audio.callBack_upload.bind(this, info), this.functions.onAudioUploadError); + }, + + callBack_upload: function (info, xmlHttp) { + if (typeof this.functions.audioUploadHandler === 'function') { + this.functions.audioUploadHandler(xmlHttp, info, this); + } else { + const response = JSON.parse(xmlHttp.responseText); + if (response.errorMessage) { + this.plugins.audio.error.call(this, response.errorMessage, response); + } else { + this.plugins.audio.register.call(this, info, response); + } + } + }, + + register: function (info, response) { + const fileList = response.result; + + for (let i = 0, len = fileList.length, file, oAudio; i < len; i++) { + if (info.isUpdate) oAudio = info.element; + else oAudio = this.plugins.audio._createAudioTag.call(this); + + file = { name: fileList[i].name, size: fileList[i].size }; + this.plugins.audio.create_audio.call(this, oAudio, fileList[i].url, file, info.isUpdate); + } + + this.closeLoading(); + }, + + setupUrl: function (src) { + try { + if (src.length === 0) return false; + this.plugins.audio.create_audio.call(this, this.plugins.audio._createAudioTag.call(this), src, null, this.context.dialog.updateModal); + } catch (error) { + throw Error('[SUNEDITOR.audio.audio.fail] cause : "' + error.message + '"'); + } finally { + this.closeLoading(); + } + }, + + create_audio: function (element, src, file, isUpdate) { + const contextAudio = this.context.audio; + + // create new tag + if (!isUpdate) { + element.src = src; + const cover = this.plugins.component.set_cover.call(this, element); + const container = this.plugins.component.set_container.call(this, cover, ''); + if (!this.insertComponent(container, false, true, !this.options.mediaAutoSelect)) { + this.focus(); + return; + } + if (!this.options.mediaAutoSelect) { + const line = this.appendFormatTag(container, null); + this.setRange(line, 0, line, 0); + } + } // update + else { + if (contextAudio._element) element = contextAudio._element; + if (element && element.src !== src) { + element.src = src; + this.selectComponent(element, 'audio'); + } else { + this.selectComponent(element, 'audio'); + return; + } + } + + this.plugins.fileManager.setInfo.call(this, 'audio', element, this.functions.onAudioUpload, file, false); + if (isUpdate) this.history.push(false); + }, + + updateCover: function (element) { + const contextAudio = this.context.audio; + this.plugins.audio._setTagAttrs.call(this, element); + + // find component element + const existElement = this.util.getParentElement(element, this.util.isMediaComponent) || + this.util.getParentElement(element, function (current) { + return this.isWysiwygDiv(current.parentNode); + }.bind(this.util)); + + // clone element + contextAudio._element = element = element.cloneNode(false); + const cover = this.plugins.component.set_cover.call(this, element); + const container = this.plugins.component.set_container.call(this, cover, 'se-audio-container'); + + existElement.parentNode.replaceChild(container, existElement); + this.plugins.fileManager.setInfo.call(this, 'audio', element, this.functions.onAudioUpload, null, false); + }, + + /** + * @Required @Override fileManager, resizing + */ + onModifyMode: function (selectionTag) { + const contextAudio = this.context.audio; + + this.setControllerPosition(contextAudio.controller, selectionTag, 'bottom', {left: 0, top: 0}); + this.controllersOn(contextAudio.controller, selectionTag, this.plugins.audio.onControllerOff.bind(this, selectionTag), 'audio'); + + this.util.addClass(selectionTag, 'active'); + contextAudio._element = selectionTag; + contextAudio._cover = this.util.getParentElement(selectionTag, 'FIGURE'); + contextAudio._container = this.util.getParentElement(selectionTag, this.util.isComponent); + }, + + /** + * @Required @Override fileManager, resizing + */ + openModify: function (notOpen) { + if (this.context.audio.audioUrlFile) { + const contextAudio = this.context.audio; + contextAudio._linkValue = contextAudio.preview.textContent = contextAudio.audioUrlFile.value = contextAudio._element.src; + } + if (!notOpen) this.plugins.dialog.open.call(this, 'audio', true); + }, + + onClick_controller: function (e) { + e.stopPropagation(); + + const command = e.target.getAttribute('data-command'); + if (!command) return; + + e.preventDefault(); + + if (/update/.test(command)) { + this.plugins.audio.openModify.call(this, false); + } + else { /** delete */ + this.plugins.audio.destroy.call(this, this.context.audio._element); + } + + this.controllersOff(); + }, + + onControllerOff: function (selectionTag) { + this.util.removeClass(selectionTag, 'active'); + this.context.audio.controller.style.display = 'none'; + }, + + /** + * @Required @Override dialog + */ + init: function () { + if (this.context.dialog.updateModal) return; + const contextAudio = this.context.audio; + + if (contextAudio.audioInputFile) contextAudio.audioInputFile.value = ''; + if (contextAudio.audioUrlFile) contextAudio._linkValue = contextAudio.preview.textContent = contextAudio.audioUrlFile.value = ''; + if (contextAudio.audioInputFile && contextAudio.audioUrlFile) { + contextAudio.audioUrlFile.removeAttribute('disabled'); + contextAudio.preview.style.textDecoration = ''; + } + + contextAudio._element = null; + } +}); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/dialog/image.js": +/*!************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/dialog/image.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/dialog */ "./node_modules/suneditor/src/plugins/modules/dialog.js"); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_dialog__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _modules_anchor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/_anchor */ "./node_modules/suneditor/src/plugins/modules/_anchor.js"); +/* harmony import */ var _modules_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/component */ "./node_modules/suneditor/src/plugins/modules/component.js"); +/* harmony import */ var _modules_component__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_modules_component__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _modules_resizing__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/resizing */ "./node_modules/suneditor/src/plugins/modules/resizing.js"); +/* harmony import */ var _modules_resizing__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_modules_resizing__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _modules_fileManager__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/fileManager */ "./node_modules/suneditor/src/plugins/modules/fileManager.js"); +/* harmony import */ var _modules_fileManager__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_modules_fileManager__WEBPACK_IMPORTED_MODULE_4__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + + + + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'image', + display: 'dialog', + add: function (core) { + core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_0___default.a, _modules_anchor__WEBPACK_IMPORTED_MODULE_1__["default"], _modules_component__WEBPACK_IMPORTED_MODULE_2___default.a, _modules_resizing__WEBPACK_IMPORTED_MODULE_3___default.a, _modules_fileManager__WEBPACK_IMPORTED_MODULE_4___default.a]); + + const options = core.options; + const context = core.context; + const contextImage = context.image = { + _infoList: [], // @Override fileManager + _infoIndex: 0, // @Override fileManager + _uploadFileLength: 0, // @Override fileManager + focusElement: null, // @Override dialog // This element has focus when the dialog is opened. + sizeUnit: options._imageSizeUnit, + _linkElement: '', + _altText: '', + _align: 'none', + _floatClassRegExp: '__se__float\\-[a-z]+', + _v_src: {_linkValue: ''}, + svgDefaultSize: '30%', + base64RenderIndex: 0, + // @require @Override component + _element: null, + _cover: null, + _container: null, + // @Override resizing properties + inputX: null, + inputY: null, + _element_w: 1, + _element_h: 1, + _element_l: 0, + _element_t: 0, + _defaultSizeX: 'auto', + _defaultSizeY: 'auto', + _origin_w: options.imageWidth === 'auto' ? '' : options.imageWidth, + _origin_h: options.imageHeight === 'auto' ? '' : options.imageHeight, + _proportionChecked: true, + _resizing: options.imageResizing, + _resizeDotHide: !options.imageHeightShow, + _rotation: options.imageRotation, + _onlyPercentage: options.imageSizeOnlyPercentage, + _ratio: false, + _ratioX: 1, + _ratioY: 1, + _captionShow: true, + _captionChecked: false, + _caption: null, + captionCheckEl: null + }; + + /** image dialog */ + let image_dialog = this.setDialog(core); + contextImage.modal = image_dialog; + contextImage.imgInputFile = image_dialog.querySelector('._se_image_file'); + contextImage.imgUrlFile = image_dialog.querySelector('._se_image_url'); + contextImage.focusElement = contextImage.imgInputFile || contextImage.imgUrlFile; + contextImage.altText = image_dialog.querySelector('._se_image_alt'); + contextImage.captionCheckEl = image_dialog.querySelector('._se_image_check_caption'); + contextImage.previewSrc = image_dialog.querySelector('._se_tab_content_image .se-link-preview'); + + /** add event listeners */ + image_dialog.querySelector('.se-dialog-tabs').addEventListener('click', this.openTab.bind(core)); + image_dialog.querySelector('form').addEventListener('submit', this.submit.bind(core)); + if (contextImage.imgInputFile) image_dialog.querySelector('.se-file-remove').addEventListener('click', this._removeSelectedFiles.bind(contextImage.imgInputFile, contextImage.imgUrlFile, contextImage.previewSrc)); + if (contextImage.imgUrlFile) contextImage.imgUrlFile.addEventListener('input', this._onLinkPreview.bind(contextImage.previewSrc, contextImage._v_src, options.linkProtocol)); + if (contextImage.imgInputFile && contextImage.imgUrlFile) contextImage.imgInputFile.addEventListener('change', this._fileInputChange.bind(contextImage)); + + const imageGalleryButton = image_dialog.querySelector('.__se__gallery'); + if (imageGalleryButton) imageGalleryButton.addEventListener('click', this._openGallery.bind(core)); + + contextImage.proportion = {}; + contextImage.inputX = {}; + contextImage.inputY = {}; + if (options.imageResizing) { + contextImage.proportion = image_dialog.querySelector('._se_image_check_proportion'); + contextImage.inputX = image_dialog.querySelector('._se_image_size_x'); + contextImage.inputY = image_dialog.querySelector('._se_image_size_y'); + contextImage.inputX.value = options.imageWidth; + contextImage.inputY.value = options.imageHeight; + + contextImage.inputX.addEventListener('keyup', this.setInputSize.bind(core, 'x')); + contextImage.inputY.addEventListener('keyup', this.setInputSize.bind(core, 'y')); + + contextImage.inputX.addEventListener('change', this.setRatio.bind(core)); + contextImage.inputY.addEventListener('change', this.setRatio.bind(core)); + contextImage.proportion.addEventListener('change', this.setRatio.bind(core)); + + image_dialog.querySelector('.se-dialog-btn-revert').addEventListener('click', this.sizeRevert.bind(core)); + } + + /** append html */ + context.dialog.modal.appendChild(image_dialog); + + /** link event */ + core.plugins.anchor.initEvent.call(core, 'image', image_dialog.querySelector('._se_tab_content_url')); + contextImage.anchorCtx = core.context.anchor.caller.image; + + /** empty memory */ + image_dialog = null; + }, + + /** dialog */ + setDialog: function (core) { + const option = core.options; + const lang = core.lang; + const dialog = core.util.createElement('DIV'); + + dialog.className = 'se-dialog-content se-dialog-image'; + dialog.style.display = 'none'; + + let html = '' + + '
' + + '' + + '' + lang.dialogBox.imageBox.title + '' + + '
' + + '
' + + '' + + '' + + '
' + + '
' + + '
' + + '
'; + + if (option.imageFileInput) { + html += '' + + '
' + + '' + + '
' + + '' + + '' + + '
' + + '
' ; + } + + if (option.imageUrlInput) { + html += '' + + '
' + + '' + + '
' + + '' + + ((option.imageGalleryUrl && core.plugins.imageGallery) ? '' : '') + + '
' + + '' + + '
'; + } + + html += '
' + + '
' + + '' + + '
'; + + if (option.imageResizing) { + const onlyPercentage = option.imageSizeOnlyPercentage; + const onlyPercentDisplay = onlyPercentage ? ' style="display: none !important;"' : ''; + const heightDisplay = !option.imageHeightShow ? ' style="display: none !important;"' : ''; + html += '
'; + if (onlyPercentage || !option.imageHeightShow) { + html += '' + + '
' + + '' + + '
'; + } else { + html += '' + + '
' + + '' + + '' + + '' + + '
'; + } + html += '' + + '' + + '' + + '' + + ' ' + lang.dialogBox.proportion + '' + + '' + + '
' ; + } + + html += '' + + '' + + '
' + + '
' + + '' + + '' + + '
'; + + dialog.innerHTML = html; + + return dialog; + }, + + _fileInputChange: function () { + if (!this.imgInputFile.value) { + this.imgUrlFile.removeAttribute('disabled'); + this.previewSrc.style.textDecoration = ''; + } else { + this.imgUrlFile.setAttribute('disabled', true); + this.previewSrc.style.textDecoration = 'line-through'; + } + }, + + _removeSelectedFiles: function (urlInput, previewSrc) { + this.value = ''; + if (urlInput) { + urlInput.removeAttribute('disabled'); + previewSrc.style.textDecoration = ''; + } + }, + + _openGallery: function () { + this.callPlugin('imageGallery', this.plugins.imageGallery.open.bind(this, this.plugins.image._setUrlInput.bind(this.context.image)), null); + }, + + _setUrlInput: function (target) { + this.altText.value = target.alt; + this._v_src._linkValue = this.previewSrc.textContent = this.imgUrlFile.value = target.src; + this.imgUrlFile.focus(); + }, + + _onLinkPreview: function (context, protocol, e) { + const value = e.target.value.trim(); + context._linkValue = this.textContent = !value ? '' : (protocol && value.indexOf('://') === -1 && value.indexOf('#') !== 0) ? protocol + value : value.indexOf('://') === -1 ? '/' + value : value; + }, + + /** + * @Override @Required fileManager + */ + fileTags: ['img'], + + /** + * @Override core, fileManager, resizing + * @description It is called from core.selectComponent. + * @param {Element} element Target element + */ + select: function (element) { + this.plugins.image.onModifyMode.call(this, element, this.plugins.resizing.call_controller_resize.call(this, element, 'image')); + }, + + /** + * @Override fileManager, resizing + */ + destroy: function (element) { + const imageEl = element || this.context.image._element; + const imageContainer = this.util.getParentElement(imageEl, this.util.isMediaComponent) || imageEl; + const dataIndex = imageEl.getAttribute('data-index') * 1; + let focusEl = (imageContainer.previousElementSibling || imageContainer.nextElementSibling); + + const emptyDiv = imageContainer.parentNode; + this.util.removeItem(imageContainer); + this.plugins.image.init.call(this); + this.controllersOff(); + + if (emptyDiv !== this.context.element.wysiwyg) this.util.removeItemAllParents(emptyDiv, function (current) { return current.childNodes.length === 0; }, null); + + // focus + this.focusEdge(focusEl); + + // event + this.plugins.fileManager.deleteInfo.call(this, 'image', dataIndex, this.functions.onImageUpload); + + // history stack + this.history.push(false); + }, + + /** + * @Required @Override dialog + */ + on: function (update) { + const contextImage = this.context.image; + + if (!update) { + contextImage.inputX.value = contextImage._origin_w = this.options.imageWidth === contextImage._defaultSizeX ? '' : this.options.imageWidth; + contextImage.inputY.value = contextImage._origin_h = this.options.imageHeight === contextImage._defaultSizeY ? '' : this.options.imageHeight; + if (contextImage.imgInputFile && this.options.imageMultipleFile) contextImage.imgInputFile.setAttribute('multiple', 'multiple'); + } else { + if (contextImage.imgInputFile && this.options.imageMultipleFile) contextImage.imgInputFile.removeAttribute('multiple'); + } + this.plugins.anchor.on.call(this, contextImage.anchorCtx, update); + }, + + /** + * @Required @Override dialog + */ + open: function () { + this.plugins.dialog.open.call(this, 'image', 'image' === this.currentControllerName); + }, + + openTab: function (e) { + const modal = this.context.image.modal; + const targetElement = (e === 'init' ? modal.querySelector('._se_tab_link') : e.target); + + if (!/^BUTTON$/i.test(targetElement.tagName)) { + return false; + } + + // Declare all variables + const tabName = targetElement.getAttribute('data-tab-link'); + const contentClassName = '_se_tab_content'; + let i, tabContent, tabLinks; + + // Get all elements with class="tabcontent" and hide them + tabContent = modal.getElementsByClassName(contentClassName); + for (i = 0; i < tabContent.length; i++) { + tabContent[i].style.display = 'none'; + } + + // Get all elements with class="tablinks" and remove the class "active" + tabLinks = modal.getElementsByClassName('_se_tab_link'); + for (i = 0; i < tabLinks.length; i++) { + this.util.removeClass(tabLinks[i], 'active'); + } + + // Show the current tab, and add an "active" class to the button that opened the tab + modal.querySelector('.' + contentClassName + '_' + tabName).style.display = 'block'; + this.util.addClass(targetElement, 'active'); + + // focus + if (tabName === 'image' && this.context.image.focusElement) { + this.context.image.focusElement.focus(); + } else if (tabName === 'url') { + this.context.anchor.caller.image.urlInput.focus(); + } + + return false; + }, + + submit: function (e) { + const contextImage = this.context.image; + const imagePlugin = this.plugins.image; + + e.preventDefault(); + e.stopPropagation(); + + contextImage._altText = contextImage.altText.value; + contextImage._align = contextImage.modal.querySelector('input[name="suneditor_image_radio"]:checked').value; + contextImage._captionChecked = contextImage.captionCheckEl.checked; + if (contextImage._resizing) contextImage._proportionChecked = contextImage.proportion.checked; + + try { + if (this.context.dialog.updateModal) { + imagePlugin.update_image.call(this, false, true, false); + } + + if (contextImage.imgInputFile && contextImage.imgInputFile.files.length > 0) { + this.showLoading(); + imagePlugin.submitAction.call(this, this.context.image.imgInputFile.files); + } else if (contextImage.imgUrlFile && contextImage._v_src._linkValue.length > 0) { + this.showLoading(); + imagePlugin.onRender_imgUrl.call(this); + } + } catch (error) { + this.closeLoading(); + throw Error('[SUNEDITOR.image.submit.fail] cause : "' + error.message + '"'); + } finally { + this.plugins.dialog.close.call(this); + } + + return false; + }, + + submitAction: function (fileList) { + if (fileList.length === 0) return; + + let fileSize = 0; + let files = []; + for (let i = 0, len = fileList.length; i < len; i++) { + if (/image/i.test(fileList[i].type)) { + files.push(fileList[i]); + fileSize += fileList[i].size; + } + } + + const limitSize = this.options.imageUploadSizeLimit; + if (limitSize > 0) { + let infoSize = 0; + const imagesInfo = this.context.image._infoList; + for (let i = 0, len = imagesInfo.length; i < len; i++) { + infoSize += imagesInfo[i].size * 1; + } + + if ((fileSize + infoSize) > limitSize) { + this.closeLoading(); + const err = '[SUNEDITOR.imageUpload.fail] Size of uploadable total images: ' + (limitSize/1000) + 'KB'; + if (typeof this.functions.onImageUploadError !== 'function' || this.functions.onImageUploadError(err, { 'limitSize': limitSize, 'currentSize': infoSize, 'uploadSize': fileSize }, this)) { + this.functions.noticeOpen(err); + } + return; + } + } + + const contextImage = this.context.image; + contextImage._uploadFileLength = files.length; + + const anchor = this.plugins.anchor.createAnchor.call(this, contextImage.anchorCtx, true); + const info = { + anchor: anchor, + inputWidth: contextImage.inputX.value, + inputHeight: contextImage.inputY.value, + align: contextImage._align, + isUpdate: this.context.dialog.updateModal, + element: contextImage._element + }; + + if (typeof this.functions.onImageUploadBefore === 'function') { + const result = this.functions.onImageUploadBefore(files, info, this, function (data) { + if (data && this._w.Array.isArray(data.result)) { + this.plugins.image.register.call(this, info, data); + } else { + this.plugins.image.upload.call(this, info, data); + } + }.bind(this)); + + if (typeof result === 'undefined') return; + if (!result) { + this.closeLoading(); + return; + } + if (this._w.Array.isArray(result) && result.length > 0) files = result; + } + + this.plugins.image.upload.call(this, info, files); + }, + + error: function (message, response) { + this.closeLoading(); + if (typeof this.functions.onImageUploadError !== 'function' || this.functions.onImageUploadError(message, response, this)) { + this.functions.noticeOpen(message); + throw Error('[SUNEDITOR.plugin.image.error] response: ' + message); + } + }, + + upload: function (info, files) { + if (!files) { + this.closeLoading(); + return; + } + if (typeof files === 'string') { + this.plugins.image.error.call(this, files, null); + return; + } + + const imageUploadUrl = this.options.imageUploadUrl; + const filesLen = this.context.dialog.updateModal ? 1 : files.length; + + // server upload + if (typeof imageUploadUrl === 'string' && imageUploadUrl.length > 0) { + const formData = new FormData(); + for (let i = 0; i < filesLen; i++) { + formData.append('file-' + i, files[i]); + } + this.plugins.fileManager.upload.call(this, imageUploadUrl, this.options.imageUploadHeader, formData, this.plugins.image.callBack_imgUpload.bind(this, info), this.functions.onImageUploadError); + } else { // base64 + this.plugins.image.setup_reader.call(this, files, info.anchor, info.inputWidth, info.inputHeight, info.align, filesLen, info.isUpdate); + } + }, + + callBack_imgUpload: function (info, xmlHttp) { + if (typeof this.functions.imageUploadHandler === 'function') { + this.functions.imageUploadHandler(xmlHttp, info, this); + } else { + const response = JSON.parse(xmlHttp.responseText); + if (response.errorMessage) { + this.plugins.image.error.call(this, response.errorMessage, response); + } else { + this.plugins.image.register.call(this, info, response); + } + } + }, + + register: function (info, response) { + const fileList = response.result; + + for (let i = 0, len = fileList.length, file; i < len; i++) { + file = { name: fileList[i].name, size: fileList[i].size }; + if (info.isUpdate) { + this.plugins.image.update_src.call(this, fileList[i].url, info.element, file); + break; + } else { + this.plugins.image.create_image.call(this, fileList[i].url, info.anchor, info.inputWidth, info.inputHeight, info.align, file); + } + } + + this.closeLoading(); + }, + + setup_reader: function (files, anchor, width, height, align, filesLen, isUpdate) { + try { + this.context.image.base64RenderIndex = filesLen; + const wFileReader = this._w.FileReader; + const filesStack = [filesLen]; + this.context.image.inputX.value = width; + this.context.image.inputY.value = height; + + for (let i = 0, reader, file; i < filesLen; i++) { + reader = new wFileReader(); + file = files[i]; + + reader.onload = function (reader, update, updateElement, file, index) { + filesStack[index] = { result: reader.result, file: file }; + + if (--this.context.image.base64RenderIndex === 0) { + this.plugins.image.onRender_imgBase64.call(this, update, filesStack, updateElement, anchor, width, height, align); + this.closeLoading(); + } + }.bind(this, reader, isUpdate, this.context.image._element, file, i); + + reader.readAsDataURL(file); + } + } catch (e) { + this.closeLoading(); + throw Error('[SUNEDITOR.image.setup_reader.fail] cause : "' + e.message + '"'); + } + }, + + onRender_imgBase64: function (update, filesStack, updateElement, anchor, width, height, align) { + const updateMethod = this.plugins.image.update_src; + const createMethod = this.plugins.image.create_image; + + for (let i = 0, len = filesStack.length; i < len; i++) { + if (update) { + this.context.image._element.setAttribute('data-file-name', filesStack[i].file.name); + this.context.image._element.setAttribute('data-file-size', filesStack[i].file.size); + updateMethod.call(this, filesStack[i].result, updateElement, filesStack[i].file); + } else { + createMethod.call(this, filesStack[i].result, anchor, width, height, align, filesStack[i].file); + } + } + }, + + onRender_imgUrl: function () { + const contextImage = this.context.image; + if (contextImage._v_src._linkValue.length === 0) return false; + + try { + const file = {name: contextImage._v_src._linkValue.split('/').pop(), size: 0}; + if (this.context.dialog.updateModal) this.plugins.image.update_src.call(this, contextImage._v_src._linkValue, contextImage._element, file); + else this.plugins.image.create_image.call(this, contextImage._v_src._linkValue, this.plugins.anchor.createAnchor.call(this, contextImage.anchorCtx, true), contextImage.inputX.value, contextImage.inputY.value, contextImage._align, file); + } catch (e) { + throw Error('[SUNEDITOR.image.URLRendering.fail] cause : "' + e.message + '"'); + } finally { + this.closeLoading(); + } + }, + + onRender_link: function (imgTag, anchor) { + if (anchor) { + anchor.setAttribute('data-image-link', 'image'); + imgTag.setAttribute('data-image-link', anchor.href); + anchor.appendChild(imgTag); + return anchor; + } + + return imgTag; + }, + + /** + * @Override resizing + * @param {String} xy 'x': width, 'y': height + * @param {KeyboardEvent} e Event object + */ + setInputSize: function (xy, e) { + if (e && e.keyCode === 32) { + e.preventDefault(); + return; + } + + this.plugins.resizing._module_setInputSize.call(this, this.context.image, xy); + }, + + /** + * @Override resizing + */ + setRatio: function () { + this.plugins.resizing._module_setRatio.call(this, this.context.image); + }, + + /** + * @Override fileManager + */ + checkFileInfo: function () { + const imagePlugin = this.plugins.image; + + const modifyHandler = function (tag) { + imagePlugin.onModifyMode.call(this, tag, null); + imagePlugin.openModify.call(this, true); + imagePlugin.update_image.call(this, true, false, true); + }.bind(this); + + this.plugins.fileManager.checkInfo.call(this, 'image', ['img'], this.functions.onImageUpload, modifyHandler, true); + }, + + /** + * @Override fileManager + */ + resetFileInfo: function () { + this.plugins.fileManager.resetInfo.call(this, 'image', this.functions.onImageUpload); + }, + + create_image: function (src, anchor, width, height, align, file) { + const imagePlugin = this.plugins.image; + const contextImage = this.context.image; + this.context.resizing._resize_plugin = 'image'; + + let oImg = this.util.createElement('IMG'); + oImg.src = src; + oImg.alt = contextImage._altText; + oImg.setAttribute('data-rotate', '0'); + anchor = imagePlugin.onRender_link.call(this, oImg, anchor); + + if (contextImage._resizing) { + oImg.setAttribute('data-proportion', contextImage._proportionChecked); + } + + const cover = this.plugins.component.set_cover.call(this, anchor); + const container = this.plugins.component.set_container.call(this, cover, 'se-image-container'); + + // caption + if (contextImage._captionChecked) { + contextImage._caption = this.plugins.component.create_caption.call(this); + contextImage._caption.setAttribute('contenteditable', false); + cover.appendChild(contextImage._caption); + } + + contextImage._element = oImg; + contextImage._cover = cover; + contextImage._container = container; + + // set size + imagePlugin.applySize.call(this, width, height); + + // align + imagePlugin.setAlign.call(this, align, oImg, cover, container); + + oImg.onload = imagePlugin._image_create_onload.bind(this, oImg, contextImage.svgDefaultSize, container); + if (this.insertComponent(container, true, true, true)) this.plugins.fileManager.setInfo.call(this, 'image', oImg, this.functions.onImageUpload, file, true); + this.context.resizing._resize_plugin = ''; + }, + + _image_create_onload: function (oImg, svgDefaultSize, container) { + // svg exception handling + if (oImg.offsetWidth === 0) this.plugins.image.applySize.call(this, svgDefaultSize, ''); + if (this.options.mediaAutoSelect) { + this.selectComponent(oImg, 'image'); + } else { + const line = this.appendFormatTag(container, null); + this.setRange(line, 0, line, 0); + } + }, + + update_image: function (init, openController, notHistoryPush) { + const contextImage = this.context.image; + let imageEl = contextImage._element; + let cover = contextImage._cover; + let container = contextImage._container; + let isNewContainer = false; + + if (cover === null) { + isNewContainer = true; + imageEl = contextImage._element.cloneNode(true); + cover = this.plugins.component.set_cover.call(this, imageEl); + } + + if (container === null) { + cover = cover.cloneNode(true); + imageEl = cover.querySelector('img'); + isNewContainer = true; + container = this.plugins.component.set_container.call(this, cover, 'se-image-container'); + } else if (isNewContainer) { + container.innerHTML = ''; + container.appendChild(cover); + contextImage._cover = cover; + contextImage._element = imageEl; + isNewContainer = false; + } + + // check size + let changeSize; + const x = this.util.isNumber(contextImage.inputX.value) ? contextImage.inputX.value + contextImage.sizeUnit : contextImage.inputX.value; + const y = this.util.isNumber(contextImage.inputY.value) ? contextImage.inputY.value + contextImage.sizeUnit : contextImage.inputY.value; + if (/%$/.test(imageEl.style.width)) { + changeSize = x !== container.style.width || y !== container.style.height; + } else { + changeSize = x !== imageEl.style.width || y !== imageEl.style.height; + } + + // alt + imageEl.alt = contextImage._altText; + + // caption + let modifiedCaption = false; + if (contextImage._captionChecked) { + if (!contextImage._caption) { + contextImage._caption = this.plugins.component.create_caption.call(this); + cover.appendChild(contextImage._caption); + modifiedCaption = true; + } + } else { + if (contextImage._caption) { + this.util.removeItem(contextImage._caption); + contextImage._caption = null; + modifiedCaption = true; + } + } + + // link + const anchor = this.plugins.anchor.createAnchor.call(this, contextImage.anchorCtx, true); + if (anchor) { + contextImage._linkElement = anchor; + cover.insertBefore(this.plugins.image.onRender_link.call(this, imageEl, anchor), contextImage._caption); + } else if (contextImage._linkElement !== null) { + const imageElement = imageEl; + + imageElement.setAttribute('data-image-link', ''); + const newEl = imageElement.cloneNode(true); + cover.removeChild(contextImage._linkElement); + cover.insertBefore(newEl, contextImage._caption); + imageEl = newEl; + } + + if (isNewContainer) { + const existElement = (this.util.isRangeFormatElement(contextImage._element.parentNode) || this.util.isWysiwygDiv(contextImage._element.parentNode)) ? + contextImage._element : + /^A$/i.test(contextImage._element.parentNode.nodeName) ? contextImage._element.parentNode : this.util.getFormatElement(contextImage._element) || contextImage._element; + + if (this.util.isFormatElement(existElement) && existElement.textContent.length > 0) { + existElement.parentNode.insertBefore(container, existElement.nextElementSibling); + this.util.removeItem(contextImage._element); + } else { + existElement.parentNode.replaceChild(container, existElement); + } + + imageEl = container.querySelector('img'); + + contextImage._element = imageEl; + contextImage._cover = cover; + contextImage._container = container; + } + + // transform + if (modifiedCaption || (!contextImage._onlyPercentage && changeSize)) { + if (!init && (/\d+/.test(imageEl.style.height) || (this.context.resizing._rotateVertical && contextImage._captionChecked))) { + if (/%$/.test(contextImage.inputX.value) || /%$/.test(contextImage.inputY.value)) { + this.plugins.resizing.resetTransform.call(this, imageEl); + } else { + this.plugins.resizing.setTransformSize.call(this, imageEl, this.util.getNumber(contextImage.inputX.value, 0), this.util.getNumber(contextImage.inputY.value, 0)); + } + } + } + + // size + let isPercent = false; + if (contextImage._resizing) { + imageEl.setAttribute('data-proportion', contextImage._proportionChecked); + if (changeSize) { + this.plugins.image.applySize.call(this); + } + } + + // align + if (!(isPercent && contextImage._align === 'center')) { + this.plugins.image.setAlign.call(this, null, imageEl, null, null); + } + + // set imagesInfo + if (init) { + this.plugins.fileManager.setInfo.call(this, 'image', imageEl, this.functions.onImageUpload, null, true); + } + + if (openController) { + this.selectComponent(imageEl, 'image'); + } + + // history stack + if (!notHistoryPush) this.history.push(false); + }, + + update_src: function (src, element, file) { + element.src = src; + this._w.setTimeout(this.plugins.fileManager.setInfo.bind(this, 'image', element, this.functions.onImageUpload, file, true)); + this.selectComponent(element, 'image'); + }, + + /** + * @Required @Override fileManager, resizing + */ + onModifyMode: function (element, size) { + if (!element) return; + + const contextImage = this.context.image; + contextImage._linkElement = contextImage.anchorCtx.linkAnchor = /^A$/i.test(element.parentNode.nodeName) ? element.parentNode : null; + contextImage._element = element; + contextImage._cover = this.util.getParentElement(element, 'FIGURE'); + contextImage._container = this.util.getParentElement(element, this.util.isMediaComponent); + contextImage._caption = this.util.getChildElement(contextImage._cover, 'FIGCAPTION'); + contextImage._align = element.style.float || element.getAttribute('data-align') || 'none'; + element.style.float = ''; + + if (size) { + contextImage._element_w = size.w; + contextImage._element_h = size.h; + contextImage._element_t = size.t; + contextImage._element_l = size.l; + } + + let userSize = contextImage._element.getAttribute('data-size') || contextImage._element.getAttribute('data-origin'); + if (userSize) { + userSize = userSize.split(','); + contextImage._origin_w = userSize[0]; + contextImage._origin_h = userSize[1]; + } else if (size) { + contextImage._origin_w = size.w; + contextImage._origin_h = size.h; + } + }, + + /** + * @Required @Override fileManager, resizing + */ + openModify: function (notOpen) { + const contextImage = this.context.image; + if (contextImage.imgUrlFile) { + contextImage._v_src._linkValue = contextImage.previewSrc.textContent = contextImage.imgUrlFile.value = contextImage._element.src; + } + contextImage._altText = contextImage.altText.value = contextImage._element.alt; + contextImage.modal.querySelector('input[name="suneditor_image_radio"][value="' + contextImage._align + '"]').checked = true; + contextImage._align = contextImage.modal.querySelector('input[name="suneditor_image_radio"]:checked').value; + contextImage._captionChecked = contextImage.captionCheckEl.checked = !!contextImage._caption; + + if (contextImage._resizing) { + this.plugins.resizing._module_setModifyInputSize.call(this, contextImage, this.plugins.image); + } + + if (!notOpen) this.plugins.dialog.open.call(this, 'image', true); + }, + + /** + * @Override fileManager + */ + applySize: function (w, h) { + const contextImage = this.context.image; + + if (!w) w = contextImage.inputX.value || this.options.imageWidth; + if (!h) h = contextImage.inputY.value || this.options.imageHeight; + + if ((contextImage._onlyPercentage && !!w) || /%$/.test(w)) { + this.plugins.image.setPercentSize.call(this, w, h); + return true; + } else if ((!w || w === 'auto') && (!h || h === 'auto')) { + this.plugins.image.setAutoSize.call(this); + } else { + this.plugins.image.setSize.call(this, w, h, false); + } + + return false; + }, + + /** + * @Override resizing + */ + sizeRevert: function () { + this.plugins.resizing._module_sizeRevert.call(this, this.context.image); + }, + + /** + * @Override resizing + */ + setSize: function (w, h, notResetPercentage, direction) { + const contextImage = this.context.image; + const onlyW = /^(rw|lw)$/.test(direction); + const onlyH = /^(th|bh)$/.test(direction); + + if (!onlyH) { + contextImage._element.style.width = this.util.isNumber(w) ? w + contextImage.sizeUnit : w; + this.plugins.image.cancelPercentAttr.call(this); + } + if (!onlyW) { + contextImage._element.style.height = this.util.isNumber(h) ? h + contextImage.sizeUnit : /%$/.test(h) ? '' : h; + } + + if (contextImage._align === 'center') this.plugins.image.setAlign.call(this, null, null, null, null); + if (!notResetPercentage) contextImage._element.removeAttribute('data-percentage'); + + // save current size + this.plugins.resizing._module_saveCurrentSize.call(this, contextImage); + }, + + /** + * @Override resizing + */ + setAutoSize: function () { + const contextImage = this.context.image; + + this.plugins.resizing.resetTransform.call(this, contextImage._element); + this.plugins.image.cancelPercentAttr.call(this); + + contextImage._element.style.maxWidth = ''; + contextImage._element.style.width = ''; + contextImage._element.style.height = ''; + contextImage._cover.style.width = ''; + contextImage._cover.style.height = ''; + + this.plugins.image.setAlign.call(this, null, null, null, null); + contextImage._element.setAttribute('data-percentage', 'auto,auto'); + + // save current size + this.plugins.resizing._module_saveCurrentSize.call(this, contextImage); + }, + + /** + * @Override resizing + */ + setOriginSize: function () { + const contextImage = this.context.image; + contextImage._element.removeAttribute('data-percentage'); + + this.plugins.resizing.resetTransform.call(this, contextImage._element); + this.plugins.image.cancelPercentAttr.call(this); + + const originSize = (contextImage._element.getAttribute('data-origin') || '').split(','); + const w = originSize[0]; + const h = originSize[1]; + + if (originSize) { + if (contextImage._onlyPercentage || (/%$/.test(w) && (/%$/.test(h) || !/\d/.test(h)))) { + this.plugins.image.setPercentSize.call(this, w, h); + } else { + this.plugins.image.setSize.call(this, w, h); + } + + // save current size + this.plugins.resizing._module_saveCurrentSize.call(this, contextImage); + } + }, + + /** + * @Override resizing + */ + setPercentSize: function (w, h) { + const contextImage = this.context.image; + h = !!h && !/%$/.test(h) && !this.util.getNumber(h, 0) ? this.util.isNumber(h) ? h + '%' : h : this.util.isNumber(h) ? h + contextImage.sizeUnit : (h || ''); + const heightPercentage = /%$/.test(h); + + contextImage._container.style.width = this.util.isNumber(w) ? w + '%' : w; + contextImage._container.style.height = ''; + contextImage._cover.style.width = '100%'; + contextImage._cover.style.height = !heightPercentage ? '' : h; + contextImage._element.style.width = '100%'; + contextImage._element.style.height = heightPercentage ? '' : h; + contextImage._element.style.maxWidth = ''; + + if (contextImage._align === 'center') this.plugins.image.setAlign.call(this, null, null, null, null); + + contextImage._element.setAttribute('data-percentage', w + ',' + h); + this.plugins.resizing.setCaptionPosition.call(this, contextImage._element); + + // save current size + this.plugins.resizing._module_saveCurrentSize.call(this, contextImage); + }, + + /** + * @Override resizing + */ + cancelPercentAttr: function () { + const contextImage = this.context.image; + + contextImage._cover.style.width = ''; + contextImage._cover.style.height = ''; + contextImage._container.style.width = ''; + contextImage._container.style.height = ''; + + this.util.removeClass(contextImage._container, this.context.image._floatClassRegExp); + this.util.addClass(contextImage._container, '__se__float-' + contextImage._align); + + if (contextImage._align === 'center') this.plugins.image.setAlign.call(this, null, null, null, null); + }, + + /** + * @Override resizing + */ + setAlign: function (align, element, cover, container) { + const contextImage = this.context.image; + + if (!align) align = contextImage._align; + if (!element) element = contextImage._element; + if (!cover) cover = contextImage._cover; + if (!container) container = contextImage._container; + + if (align && align !== 'none') { + cover.style.margin = 'auto'; + } else { + cover.style.margin = '0'; + } + + if (/%$/.test(element.style.width) && align === 'center') { + container.style.minWidth = '100%'; + cover.style.width = container.style.width; + } else { + container.style.minWidth = ''; + cover.style.width = this.context.resizing._rotateVertical ? (element.style.height || element.offsetHeight) : ((!element.style.width || element.style.width === 'auto') ? '' : element.style.width || '100%'); + } + + if (!this.util.hasClass(container, '__se__float-' + align)) { + this.util.removeClass(container, contextImage._floatClassRegExp); + this.util.addClass(container, '__se__float-' + align); + } + + element.setAttribute('data-align', align); + }, + + /** + * @Override dialog + */ + init: function () { + const contextImage = this.context.image; + if (contextImage.imgInputFile) contextImage.imgInputFile.value = ''; + if (contextImage.imgUrlFile) contextImage._v_src._linkValue = contextImage.previewSrc.textContent = contextImage.imgUrlFile.value = ''; + if (contextImage.imgInputFile && contextImage.imgUrlFile) { + contextImage.imgUrlFile.removeAttribute('disabled'); + contextImage.previewSrc.style.textDecoration = ''; + } + + contextImage.altText.value = ''; + contextImage.modal.querySelector('input[name="suneditor_image_radio"][value="none"]').checked = true; + contextImage.captionCheckEl.checked = false; + contextImage._element = null; + this.plugins.image.openTab.call(this, 'init'); + + if (contextImage._resizing) { + contextImage.inputX.value = this.options.imageWidth === contextImage._defaultSizeX ? '' : this.options.imageWidth; + contextImage.inputY.value = this.options.imageHeight === contextImage._defaultSizeY ? '' : this.options.imageHeight; + contextImage.proportion.checked = true; + contextImage._ratio = false; + contextImage._ratioX = 1; + contextImage._ratioY = 1; + } + + this.plugins.anchor.init.call(this, contextImage.anchorCtx); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/dialog/link.js": +/*!***********************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/dialog/link.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/dialog */ "./node_modules/suneditor/src/plugins/modules/dialog.js"); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_dialog__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _modules_anchor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/_anchor */ "./node_modules/suneditor/src/plugins/modules/_anchor.js"); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'link', + display: 'dialog', + add: function (core) { + core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_0___default.a, _modules_anchor__WEBPACK_IMPORTED_MODULE_1__["default"]]); + + const context = core.context; + const contextLink = context.link = { + focusElement: null, // @Override dialog // This element has focus when the dialog is opened. + _linkAnchor: null, + anchorCtx: null + }; + + /** link dialog */ + let link_dialog = this.setDialog(core); + contextLink.modal = link_dialog; + + /** link controller */ + let link_controller = this.setController_LinkButton(core); + contextLink.linkController = link_controller; + + link_dialog.querySelector('form').addEventListener('submit', this.submit.bind(core)); + link_controller.addEventListener('click', this.onClick_linkController.bind(core)); + + /** append html */ + context.dialog.modal.appendChild(link_dialog); + + /** append controller */ + context.element.relative.appendChild(link_controller); + + /** link event */ + core.plugins.anchor.initEvent.call(core, 'link', link_dialog); + contextLink.focusElement = context.anchor.caller.link.urlInput; + + /** empty memory */ + link_dialog = null, link_controller = null; + }, + + /** dialog */ + setDialog: function (core) { + const lang = core.lang; + const dialog = core.util.createElement('DIV'); + const icons = core.icons; + + dialog.className = 'se-dialog-content'; + dialog.style.display = 'none'; + let html = '' + + '
' + + '
' + + '' + + '' + lang.dialogBox.linkBox.title + '' + + '
' + + core.context.anchor.forms.innerHTML + + '' + + '
'; + + dialog.innerHTML = html; + return dialog; + }, + + /** modify controller button */ + setController_LinkButton: function (core) { + const lang = core.lang; + const icons = core.icons; + const link_btn = core.util.createElement('DIV'); + + link_btn.className = 'se-controller se-controller-link'; + link_btn.innerHTML = '' + + '
' + + ''; + + return link_btn; + }, + + /** + * @Override dialog + */ + open: function () { + this.plugins.dialog.open.call(this, 'link', 'link' === this.currentControllerName); + }, + + submit: function (e) { + this.showLoading(); + + e.preventDefault(); + e.stopPropagation(); + + try { + const oA = this.plugins.anchor.createAnchor.call(this, this.context.anchor.caller.link, false); + + if (!this.context.dialog.updateModal) { + const selectedFormats = this.getSelectedElements(); + if (selectedFormats.length > 1) { + const oFormat = this.util.createElement(selectedFormats[0].nodeName); + oFormat.appendChild(oA); + if (!this.insertNode(oFormat, null, true)) return; + } else { + if (!this.insertNode(oA, null, true)) return; + } + + this.setRange(oA.childNodes[0], 0, oA.childNodes[0], oA.textContent.length); + } else { + // set range + const textNode = this.context.link._linkAnchor.childNodes[0]; + this.setRange(textNode, 0, textNode, textNode.textContent.length); + } + } finally { + this.plugins.dialog.close.call(this); + this.closeLoading(); + // history stack + this.history.push(false); + } + + return false; + }, + + /** + * @Override core + */ + active: function (element) { + if (!element) { + if (this.controllerArray.indexOf(this.context.link.linkController) > -1) { + this.controllersOff(); + } + } else if (this.util.isAnchor(element) && element.getAttribute('data-image-link') === null) { + if (this.controllerArray.indexOf(this.context.link.linkController) < 0) { + this.plugins.link.call_controller.call(this, element); + } + return true; + } + + return false; + }, + + /** + * @Override dialog + */ + on: function (update) { + this.plugins.anchor.on.call(this, this.context.anchor.caller.link, update); + }, + + call_controller: function (selectionATag) { + this.editLink = this.context.link._linkAnchor = this.context.anchor.caller.link.linkAnchor = selectionATag; + const linkBtn = this.context.link.linkController; + const link = linkBtn.querySelector('a'); + + link.href = selectionATag.href; + link.title = selectionATag.textContent; + link.textContent = selectionATag.textContent; + + this.util.addClass(selectionATag, 'on'); + this.setControllerPosition(linkBtn, selectionATag, 'bottom', {left: 0, top: 0}); + this.controllersOn(linkBtn, selectionATag, 'link', this.util.removeClass.bind(this.util, this.context.link._linkAnchor, 'on')); + }, + + onClick_linkController: function (e) { + e.stopPropagation(); + + const command = e.target.getAttribute('data-command') || e.target.parentNode.getAttribute('data-command'); + if (!command) return; + + e.preventDefault(); + + if (/update/.test(command)) { + this.plugins.dialog.open.call(this, 'link', true); + } else if (/unlink/.test(command)) { + const sc = this.util.getChildElement(this.context.link._linkAnchor, function (current) { return current.childNodes.length === 0 || current.nodeType === 3; }, false); + const ec = this.util.getChildElement(this.context.link._linkAnchor, function (current) { return current.childNodes.length === 0 || current.nodeType === 3; }, true); + this.setRange(sc, 0, ec, ec.textContent.length); + this.nodeChange(null, null, ['A'], false); + } else { + /** delete */ + this.util.removeItem(this.context.link._linkAnchor); + this.context.anchor.caller.link.linkAnchor = null; + this.focus(); + + // history stack + this.history.push(false); + } + + this.controllersOff(); + }, + + /** + * @Override dialog + */ + init: function () { + this.context.link.linkController.style.display = 'none'; + this.plugins.anchor.init.call(this, this.context.anchor.caller.link); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/dialog/math.js": +/*!***********************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/dialog/math.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/dialog */ "./node_modules/suneditor/src/plugins/modules/dialog.js"); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_dialog__WEBPACK_IMPORTED_MODULE_0__); + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'math', + display: 'dialog', + add: function (core) { + core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_0___default.a]); + + const context = core.context; + context.math = { + focusElement: null, // @Override dialog // This element has focus when the dialog is opened. + previewElement: null, + fontSizeElement: null, + _mathExp: null + }; + + /** math dialog */ + let math_dialog = this.setDialog(core); + context.math.modal = math_dialog; + context.math.focusElement = math_dialog.querySelector('.se-math-exp'); + context.math.previewElement = math_dialog.querySelector('.se-math-preview'); + context.math.fontSizeElement = math_dialog.querySelector('.se-math-size'); + context.math.focusElement.addEventListener('keyup', this._renderMathExp.bind(core, context.math), false); + context.math.focusElement.addEventListener('change', this._renderMathExp.bind(core, context.math), false); + context.math.fontSizeElement.addEventListener('change', function (e) { this.fontSize = e.target.value; }.bind(context.math.previewElement.style), false); + + /** math controller */ + let math_controller = this.setController_MathButton(core); + context.math.mathController = math_controller; + context.math._mathExp = null; + + /** add event listeners */ + math_dialog.querySelector('form').addEventListener('submit', this.submit.bind(core), false); + math_controller.addEventListener('click', this.onClick_mathController.bind(core)); + + /** append html */ + context.dialog.modal.appendChild(math_dialog); + context.element.relative.appendChild(math_controller); + + /** empty memory */ + math_dialog = null, math_controller = null; + }, + + /** dialog */ + setDialog: function (core) { + const lang = core.lang; + const dialog = core.util.createElement('DIV'); + + dialog.className = 'se-dialog-content'; + dialog.style.display = 'none'; + dialog.innerHTML = '' + + '
' + + '
' + + '' + + '' + lang.dialogBox.mathBox.title + '' + + '
' + + '
' + + '
' + + '' + + '' + + '
' + + '
' + + '' + + '' + + '
' + + '
' + + '' + + '

' + + '
' + + '
' + + '' + + '
'; + + return dialog; + }, + + /** modify controller button */ + setController_MathButton: function (core) { + const lang = core.lang; + const math_btn = core.util.createElement('DIV'); + + math_btn.className = 'se-controller se-controller-link'; + math_btn.innerHTML = '' + + '
' + + '' + + ''; + + return math_btn; + }, + + /** + * @Required @Override dialog + */ + open: function () { + this.plugins.dialog.open.call(this, 'math', 'math' === this.currentControllerName); + }, + + /** + * @Override core - managedTagsInfo + */ + managedTags: function () { + return { + className: 'katex', + method: function (element) { + if (!element.getAttribute('data-exp')) return; + const dom = this._d.createRange().createContextualFragment(this.plugins.math._renderer.call(this, this.util.HTMLDecoder(element.getAttribute('data-exp')))); + element.innerHTML = dom.querySelector('.katex').innerHTML; + } + }; + }, + + _renderer: function (exp) { + const katex = this.options.katex; + return katex.src.renderToString(exp, katex.options); + }, + + _renderMathExp: function (contextMath, e) { + contextMath.previewElement.innerHTML = this.plugins.math._renderer.call(this, e.target.value); + }, + + submit: function (e) { + this.showLoading(); + + e.preventDefault(); + e.stopPropagation(); + + const submitAction = function () { + if (this.context.math.focusElement.value.trim().length === 0) return false; + + const contextMath = this.context.math; + const mathExp = contextMath.focusElement.value; + const katexEl = contextMath.previewElement.querySelector('.katex'); + + if (!katexEl) return false; + katexEl.className = '__se__katex ' + katexEl.className; + katexEl.setAttribute('contenteditable', false); + katexEl.setAttribute('data-exp', this.util.HTMLEncoder(mathExp)); + katexEl.setAttribute('data-font-size', contextMath.fontSizeElement.value); + katexEl.style.fontSize = contextMath.fontSizeElement.value; + + if (!this.context.dialog.updateModal) { + const selectedFormats = this.getSelectedElements(); + + if (selectedFormats.length > 1) { + const oFormat = this.util.createElement(selectedFormats[0].nodeName); + oFormat.appendChild(katexEl); + if (!this.insertNode(oFormat, null, true)) return false; + } else { + if (!this.insertNode(katexEl, null, true)) return false; + } + + const empty = this.util.createTextNode(this.util.zeroWidthSpace); + katexEl.parentNode.insertBefore(empty, katexEl.nextSibling); + this.setRange(katexEl, 0, katexEl, 1); + } else { + const containerEl = this.util.getParentElement(contextMath._mathExp, '.katex'); + containerEl.parentNode.replaceChild(katexEl, containerEl); + this.setRange(katexEl, 0, katexEl, 1); + } + + contextMath.focusElement.value = ''; + contextMath.fontSizeElement.value = '1em'; + contextMath.previewElement.style.fontSize = '1em'; + contextMath.previewElement.innerHTML = ''; + + return true; + }.bind(this); + + try { + if (submitAction()) { + this.plugins.dialog.close.call(this); + // history stack + this.history.push(false); + } + } catch (e) { + this.plugins.dialog.close.call(this); + } finally { + this.closeLoading(); + } + + return false; + }, + + active: function (element) { + if (!element) { + if (this.controllerArray.indexOf(this.context.math.mathController) > -1) { + this.controllersOff(); + } + } else if (element.getAttribute('data-exp')) { + if (this.controllerArray.indexOf(this.context.math.mathController) < 0) { + this.setRange(element, 0, element, 1); + this.plugins.math.call_controller.call(this, element); + } + return true; + } + + return false; + }, + + on: function (update) { + if (!update) { + this.plugins.math.init.call(this); + } else { + const contextMath = this.context.math; + if (contextMath._mathExp) { + const exp = this.util.HTMLDecoder(contextMath._mathExp.getAttribute('data-exp')); + const fontSize = contextMath._mathExp.getAttribute('data-font-size') || '1em'; + this.context.dialog.updateModal = true; + contextMath.focusElement.value = exp; + contextMath.fontSizeElement.value = fontSize; + contextMath.previewElement.innerHTML = this.plugins.math._renderer.call(this, exp); + contextMath.previewElement.style.fontSize = fontSize; + } + } + }, + + call_controller: function (mathTag) { + this.context.math._mathExp = mathTag; + const mathBtn = this.context.math.mathController; + + this.setControllerPosition(mathBtn, mathTag, 'bottom', {left: 0, top: 0}); + this.controllersOn(mathBtn, mathTag, 'math'); + }, + + onClick_mathController: function (e) { + e.stopPropagation(); + + const command = e.target.getAttribute('data-command') || e.target.parentNode.getAttribute('data-command'); + if (!command) return; + + e.preventDefault(); + + if (/update/.test(command)) { + this.context.math.focusElement.value = this.util.HTMLDecoder(this.context.math._mathExp.getAttribute('data-exp')); + this.plugins.dialog.open.call(this, 'math', true); + } else { + /** delete */ + this.util.removeItem(this.context.math._mathExp); + this.context.math._mathExp = null; + this.focus(); + + // history stack + this.history.push(false); + } + + this.controllersOff(); + }, + + init: function () { + const contextMath = this.context.math; + contextMath.mathController.style.display = 'none'; + contextMath._mathExp = null; + contextMath.focusElement.value = ''; + contextMath.previewElement.innerHTML = ''; + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/dialog/video.js": +/*!************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/dialog/video.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/dialog */ "./node_modules/suneditor/src/plugins/modules/dialog.js"); +/* harmony import */ var _modules_dialog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_dialog__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _modules_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/component */ "./node_modules/suneditor/src/plugins/modules/component.js"); +/* harmony import */ var _modules_component__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_modules_component__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _modules_resizing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/resizing */ "./node_modules/suneditor/src/plugins/modules/resizing.js"); +/* harmony import */ var _modules_resizing__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_modules_resizing__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _modules_fileManager__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/fileManager */ "./node_modules/suneditor/src/plugins/modules/fileManager.js"); +/* harmony import */ var _modules_fileManager__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_modules_fileManager__WEBPACK_IMPORTED_MODULE_3__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + + + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'video', + display: 'dialog', + add: function (core) { + core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_0___default.a, _modules_component__WEBPACK_IMPORTED_MODULE_1___default.a, _modules_resizing__WEBPACK_IMPORTED_MODULE_2___default.a, _modules_fileManager__WEBPACK_IMPORTED_MODULE_3___default.a]); + + const options = core.options; + const context = core.context; + const contextVideo = context.video = { + _infoList: [], // @Override fileManager + _infoIndex: 0, // @Override fileManager + _uploadFileLength: 0, // @Override fileManager + focusElement: null, // @Override dialog // This element has focus when the dialog is opened. + sizeUnit: options._videoSizeUnit, + _align: 'none', + _floatClassRegExp: '__se__float\\-[a-z]+', + _youtubeQuery: options.youtubeQuery, + _videoRatio: (options.videoRatio * 100) + '%', + _defaultRatio: (options.videoRatio * 100) + '%', + _linkValue: '', + // @require @Override component + _element: null, + _cover: null, + _container: null, + // @Override resizing properties + inputX: null, + inputY: null, + _element_w: 1, + _element_h: 1, + _element_l: 0, + _element_t: 0, + _defaultSizeX: '100%', + _defaultSizeY: (options.videoRatio * 100) + '%', + _origin_w: options.videoWidth === '100%' ? '' : options.videoWidth, + _origin_h: options.videoHeight === '56.25%' ? '' : options.videoHeight, + _proportionChecked: true, + _resizing: options.videoResizing, + _resizeDotHide: !options.videoHeightShow, + _rotation: options.videoRotation, + _onlyPercentage: options.videoSizeOnlyPercentage, + _ratio: false, + _ratioX: 1, + _ratioY: 1, + _captionShow: false + }; + + /** video dialog */ + let video_dialog = this.setDialog(core); + contextVideo.modal = video_dialog; + contextVideo.videoInputFile = video_dialog.querySelector('._se_video_file'); + contextVideo.videoUrlFile = video_dialog.querySelector('.se-input-url'); + contextVideo.focusElement = contextVideo.videoUrlFile || contextVideo.videoInputFile; + contextVideo.preview = video_dialog.querySelector('.se-link-preview'); + + /** add event listeners */ + video_dialog.querySelector('form').addEventListener('submit', this.submit.bind(core)); + if (contextVideo.videoInputFile) video_dialog.querySelector('.se-dialog-files-edge-button').addEventListener('click', this._removeSelectedFiles.bind(contextVideo.videoInputFile, contextVideo.videoUrlFile, contextVideo.preview)); + if (contextVideo.videoInputFile && contextVideo.videoUrlFile) contextVideo.videoInputFile.addEventListener('change', this._fileInputChange.bind(contextVideo)); + if (contextVideo.videoUrlFile) contextVideo.videoUrlFile.addEventListener('input', this._onLinkPreview.bind(contextVideo.preview, contextVideo, options.linkProtocol)); + + contextVideo.proportion = {}; + contextVideo.videoRatioOption = {}; + contextVideo.inputX = {}; + contextVideo.inputY = {}; + if (options.videoResizing) { + contextVideo.proportion = video_dialog.querySelector('._se_video_check_proportion'); + contextVideo.videoRatioOption = video_dialog.querySelector('.se-video-ratio'); + contextVideo.inputX = video_dialog.querySelector('._se_video_size_x'); + contextVideo.inputY = video_dialog.querySelector('._se_video_size_y'); + contextVideo.inputX.value = options.videoWidth; + contextVideo.inputY.value = options.videoHeight; + + contextVideo.inputX.addEventListener('keyup', this.setInputSize.bind(core, 'x')); + contextVideo.inputY.addEventListener('keyup', this.setInputSize.bind(core, 'y')); + + contextVideo.inputX.addEventListener('change', this.setRatio.bind(core)); + contextVideo.inputY.addEventListener('change', this.setRatio.bind(core)); + contextVideo.proportion.addEventListener('change', this.setRatio.bind(core)); + contextVideo.videoRatioOption.addEventListener('change', this.setVideoRatio.bind(core)); + + video_dialog.querySelector('.se-dialog-btn-revert').addEventListener('click', this.sizeRevert.bind(core)); + } + + /** append html */ + context.dialog.modal.appendChild(video_dialog); + + /** empty memory */ + video_dialog = null; + }, + + /** dialog */ + setDialog: function (core) { + const option = core.options; + const lang = core.lang; + const dialog = core.util.createElement('DIV'); + + dialog.className = 'se-dialog-content'; + dialog.style.display = 'none'; + let html = '' + + '
' + + '
' + + '' + + '' + lang.dialogBox.videoBox.title + '' + + '
' + + '
'; + + if (option.videoFileInput) { + html += '' + + '
' + + '' + + '
' + + '' + + '' + + '
' + + '
' ; + } + + if (option.videoUrlInput) { + html += '' + + '
' + + '' + + '' + + '' + + '
'; + } + + if (option.videoResizing) { + const ratioList = option.videoRatioList || [{name: '16:9', value: 0.5625}, {name: '4:3', value: 0.75}, {name: '21:9', value: 0.4285}]; + const ratio = option.videoRatio; + const onlyPercentage = option.videoSizeOnlyPercentage; + const onlyPercentDisplay = onlyPercentage ? ' style="display: none !important;"' : ''; + const heightDisplay = !option.videoHeightShow ? ' style="display: none !important;"' : ''; + const ratioDisplay = !option.videoRatioShow ? ' style="display: none !important;"' : ''; + const onlyWidthDisplay = !onlyPercentage && !option.videoHeightShow && !option.videoRatioShow ? ' style="display: none !important;"' : ''; + html += '' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '
' + + ''; + } + + html += '' + + '
' + + '' + + '
'; + + dialog.innerHTML = html; + + return dialog; + }, + + _fileInputChange: function () { + if (!this.videoInputFile.value) { + this.videoUrlFile.removeAttribute('disabled'); + this.preview.style.textDecoration = ''; + } else { + this.videoUrlFile.setAttribute('disabled', true); + this.preview.style.textDecoration = 'line-through'; + } + }, + + _removeSelectedFiles: function (urlInput, preview) { + this.value = ''; + if (urlInput) { + urlInput.removeAttribute('disabled'); + preview.style.textDecoration = ''; + } + }, + + _onLinkPreview: function (context, protocol, e) { + const value = e.target.value.trim(); + if (/^$/.test(value)) { + context._linkValue = value; + this.textContent = ''; + } else { + context._linkValue = this.textContent = !value ? '' : (protocol && value.indexOf('://') === -1 && value.indexOf('#') !== 0) ? protocol + value : value.indexOf('://') === -1 ? '/' + value : value; + } + }, + + _setTagAttrs: function (element) { + element.setAttribute('controls', true); + + const attrs = this.options.videoTagAttrs; + if (!attrs) return; + + for (let key in attrs) { + if (!this.util.hasOwn(attrs, key)) continue; + element.setAttribute(key, attrs[key]); + } + }, + + createVideoTag: function () { + const videoTag = this.util.createElement('VIDEO'); + this.plugins.video._setTagAttrs.call(this, videoTag); + return videoTag; + }, + + _setIframeAttrs: function (element) { + element.frameBorder = '0'; + element.allowFullscreen = true; + + const attrs = this.options.videoIframeAttrs; + if (!attrs) return; + + for (let key in attrs) { + if (!this.util.hasOwn(attrs, key)) continue; + element.setAttribute(key, attrs[key]); + } + }, + + createIframeTag: function () { + const iframeTag = this.util.createElement('IFRAME'); + this.plugins.video._setIframeAttrs.call(this, iframeTag); + return iframeTag; + }, + + /** + * @Override @Required fileManager + */ + fileTags: ['iframe', 'video'], + + /** + * @Override core, resizing, fileManager + * @description It is called from core.selectComponent. + * @param {Element} element Target element + */ + select: function (element) { + this.plugins.video.onModifyMode.call(this, element, this.plugins.resizing.call_controller_resize.call(this, element, 'video')); + }, + + /** + * @Override fileManager, resizing + */ + destroy: function (element) { + const frame = element || this.context.video._element; + const container = this.context.video._container; + const dataIndex = frame.getAttribute('data-index') * 1; + let focusEl = (container.previousElementSibling || container.nextElementSibling); + + const emptyDiv = container.parentNode; + this.util.removeItem(container); + this.plugins.video.init.call(this); + this.controllersOff(); + + if (emptyDiv !== this.context.element.wysiwyg) this.util.removeItemAllParents(emptyDiv, function (current) { return current.childNodes.length === 0; }, null); + + // focus + this.focusEdge(focusEl); + + // event + this.plugins.fileManager.deleteInfo.call(this, 'video', dataIndex, this.functions.onVideoUpload); + + // history stack + this.history.push(false); + }, + + /** + * @Required @Override dialog + */ + on: function (update) { + const contextVideo = this.context.video; + + if (!update) { + contextVideo.inputX.value = contextVideo._origin_w = this.options.videoWidth === contextVideo._defaultSizeX ? '' : this.options.videoWidth; + contextVideo.inputY.value = contextVideo._origin_h = this.options.videoHeight === contextVideo._defaultSizeY ? '' : this.options.videoHeight; + contextVideo.proportion.disabled = true; + if (contextVideo.videoInputFile && this.options.videoMultipleFile) contextVideo.videoInputFile.setAttribute('multiple', 'multiple'); + } else { + if (contextVideo.videoInputFile && this.options.videoMultipleFile) contextVideo.videoInputFile.removeAttribute('multiple'); + } + + if (contextVideo._resizing) { + this.plugins.video.setVideoRatioSelect.call(this, contextVideo._origin_h || contextVideo._defaultRatio); + } + }, + + /** + * @Required @Override dialog + */ + open: function () { + this.plugins.dialog.open.call(this, 'video', 'video' === this.currentControllerName); + }, + + setVideoRatio: function (e) { + const contextVideo = this.context.video; + const value = e.target.options[e.target.selectedIndex].value; + + contextVideo._defaultSizeY = contextVideo._videoRatio = !value ? contextVideo._defaultSizeY : (value * 100) + '%'; + contextVideo.inputY.placeholder = !value ? '' : (value * 100) + '%'; + contextVideo.inputY.value = ''; + }, + + /** + * @Override resizing + * @param {String} xy 'x': width, 'y': height + * @param {KeyboardEvent} e Event object + */ + setInputSize: function (xy, e) { + if (e && e.keyCode === 32) { + e.preventDefault(); + return; + } + + const contextVideo = this.context.video; + this.plugins.resizing._module_setInputSize.call(this, contextVideo, xy); + + if (xy === 'y') { + this.plugins.video.setVideoRatioSelect.call(this, e.target.value || contextVideo._defaultRatio); + } + }, + + /** + * @Override resizing + */ + setRatio: function () { + this.plugins.resizing._module_setRatio.call(this, this.context.video); + }, + + submit: function (e) { + const contextVideo = this.context.video; + const videoPlugin = this.plugins.video; + + e.preventDefault(); + e.stopPropagation(); + + contextVideo._align = contextVideo.modal.querySelector('input[name="suneditor_video_radio"]:checked').value; + + try { + if (contextVideo.videoInputFile && contextVideo.videoInputFile.files.length > 0) { + this.showLoading(); + videoPlugin.submitAction.call(this, this.context.video.videoInputFile.files); + } else if (contextVideo.videoUrlFile && contextVideo._linkValue.length > 0) { + this.showLoading(); + videoPlugin.setup_url.call(this); + } + } catch (error) { + this.closeLoading(); + throw Error('[SUNEDITOR.video.submit.fail] cause : "' + error.message + '"'); + } finally { + this.plugins.dialog.close.call(this); + } + + return false; + }, + + submitAction: function (fileList) { + if (fileList.length === 0) return; + + let fileSize = 0; + let files = []; + for (let i = 0, len = fileList.length; i < len; i++) { + if (/video/i.test(fileList[i].type)) { + files.push(fileList[i]); + fileSize += fileList[i].size; + } + } + + const limitSize = this.options.videoUploadSizeLimit; + if (limitSize > 0) { + let infoSize = 0; + const videosInfo = this.context.video._infoList; + for (let i = 0, len = videosInfo.length; i < len; i++) { + infoSize += videosInfo[i].size * 1; + } + + if ((fileSize + infoSize) > limitSize) { + this.closeLoading(); + const err = '[SUNEDITOR.videoUpload.fail] Size of uploadable total videos: ' + (limitSize/1000) + 'KB'; + if (typeof this.functions.onVideoUploadError !== 'function' || this.functions.onVideoUploadError(err, { 'limitSize': limitSize, 'currentSize': infoSize, 'uploadSize': fileSize }, this)) { + this.functions.noticeOpen(err); + } + return; + } + } + + const contextVideo = this.context.video; + contextVideo._uploadFileLength = files.length; + + const info = { + inputWidth: contextVideo.inputX.value, + inputHeight: contextVideo.inputY.value, + align: contextVideo._align, + isUpdate: this.context.dialog.updateModal, + element: contextVideo._element + }; + + if (typeof this.functions.onVideoUploadBefore === 'function') { + const result = this.functions.onVideoUploadBefore(files, info, this, function (data) { + if (data && this._w.Array.isArray(data.result)) { + this.plugins.video.register.call(this, info, data); + } else { + this.plugins.video.upload.call(this, info, data); + } + }.bind(this)); + + if (typeof result === 'undefined') return; + if (!result) { + this.closeLoading(); + return; + } + if (typeof result === 'object' && result.length > 0) files = result; + } + + this.plugins.video.upload.call(this, info, files); + }, + + error: function (message, response) { + this.closeLoading(); + if (typeof this.functions.onVideoUploadError !== 'function' || this.functions.onVideoUploadError(message, response, this)) { + this.functions.noticeOpen(message); + throw Error('[SUNEDITOR.plugin.video.error] response: ' + message); + } + }, + + upload: function (info, files) { + if (!files) { + this.closeLoading(); + return; + } + if (typeof files === 'string') { + this.plugins.video.error.call(this, files, null); + return; + } + + const videoUploadUrl = this.options.videoUploadUrl; + const filesLen = this.context.dialog.updateModal ? 1 : files.length; + + // server upload + if (typeof videoUploadUrl === 'string' && videoUploadUrl.length > 0) { + const formData = new FormData(); + for (let i = 0; i < filesLen; i++) { + formData.append('file-' + i, files[i]); + } + this.plugins.fileManager.upload.call(this, videoUploadUrl, this.options.videoUploadHeader, formData, this.plugins.video.callBack_videoUpload.bind(this, info), this.functions.onVideoUploadError); + } else { + throw Error('[SUNEDITOR.videoUpload.fail] cause : There is no "videoUploadUrl" option.'); + } + }, + + callBack_videoUpload: function (info, xmlHttp) { + if (typeof this.functions.videoUploadHandler === 'function') { + this.functions.videoUploadHandler(xmlHttp, info, this); + } else { + const response = JSON.parse(xmlHttp.responseText); + if (response.errorMessage) { + this.plugins.video.error.call(this, response.errorMessage, response); + } else { + this.plugins.video.register.call(this, info, response); + } + } + }, + + register: function (info, response) { + const fileList = response.result; + const videoTag = this.plugins.video.createVideoTag.call(this); + + for (let i = 0, len = fileList.length, file; i < len; i++) { + file = { name: fileList[i].name, size: fileList[i].size }; + this.plugins.video.create_video.call(this, (info.isUpdate ? info.element : videoTag.cloneNode(false)), fileList[i].url, info.inputWidth, info.inputHeight, info.align, file, info.isUpdate); + } + + this.closeLoading(); + }, + + setup_url: function () { + try { + const contextVideo = this.context.video; + let url = contextVideo._linkValue; + + if (url.length === 0) return false; + + /** iframe source */ + if (/^$/.test(url)) { + const oIframe = (new this._w.DOMParser()).parseFromString(url, 'text/html').querySelector('iframe'); + url = oIframe.src; + if (url.length === 0) return false; + } + + /** youtube */ + if (/youtu\.?be/.test(url)) { + if (!/^http/.test(url)) url = 'https://' + url; + url = url.replace('watch?v=', ''); + if (!/^\/\/.+\/embed\//.test(url)) { + url = url.replace(url.match(/\/\/.+\//)[0], '//www.youtube.com/embed/').replace('&', '?&'); + } + + if (contextVideo._youtubeQuery.length > 0) { + if (/\?/.test(url)) { + const splitUrl = url.split('?'); + url = splitUrl[0] + '?' + contextVideo._youtubeQuery + '&' + splitUrl[1]; + } else { + url += '?' + contextVideo._youtubeQuery; + } + } + } else if (/vimeo\.com/.test(url)) { + if (url.endsWith('/')) { + url = url.slice(0, -1); + } + url = 'https://player.vimeo.com/video/' + url.slice(url.lastIndexOf('/') + 1); + } + + this.plugins.video.create_video.call(this, this.plugins.video.createIframeTag.call(this), url, contextVideo.inputX.value, contextVideo.inputY.value, contextVideo._align, null, this.context.dialog.updateModal); + } catch (error) { + throw Error('[SUNEDITOR.video.upload.fail] cause : "' + error.message + '"'); + } finally { + this.closeLoading(); + } + }, + + create_video: function (oFrame, src, width, height, align, file, isUpdate) { + this.context.resizing._resize_plugin = 'video'; + const contextVideo = this.context.video; + + let cover = null; + let container = null; + let init = false; + + /** update */ + if (isUpdate) { + oFrame = contextVideo._element; + if (oFrame.src !== src) { + init = true; + const isYoutube = /youtu\.?be/.test(src); + const isVimeo = /vimeo\.com/.test(src); + if ((isYoutube || isVimeo) && !/^iframe$/i.test(oFrame.nodeName)) { + const newTag = this.plugins.video.createIframeTag.call(this); + newTag.src = src; + oFrame.parentNode.replaceChild(newTag, oFrame); + contextVideo._element = oFrame = newTag; + } else if (!isYoutube && !isVimeo && !/^videoo$/i.test(oFrame.nodeName)) { + const newTag = this.plugins.video.createVideoTag.call(this); + newTag.src = src; + oFrame.parentNode.replaceChild(newTag, oFrame); + contextVideo._element = oFrame = newTag; + } else { + oFrame.src = src; + } + } + container = contextVideo._container; + cover = this.util.getParentElement(oFrame, 'FIGURE'); + } + /** create */ + else { + init = true; + oFrame.src = src; + contextVideo._element = oFrame; + cover = this.plugins.component.set_cover.call(this, oFrame); + container = this.plugins.component.set_container.call(this, cover, 'se-video-container'); + } + + /** rendering */ + contextVideo._cover = cover; + contextVideo._container = container; + + const inputUpdate = (this.plugins.resizing._module_getSizeX.call(this, contextVideo) !== (width || contextVideo._defaultSizeX)) || (this.plugins.resizing._module_getSizeY.call(this, contextVideo) !== (height || contextVideo._videoRatio)); + const changeSize = !isUpdate || inputUpdate; + + if (contextVideo._resizing) { + this.context.video._proportionChecked = contextVideo.proportion.checked; + oFrame.setAttribute('data-proportion', contextVideo._proportionChecked); + } + + // size + let isPercent = false; + if (changeSize) { + isPercent = this.plugins.video.applySize.call(this); + } + + // align + if (!(isPercent && align === 'center')) { + this.plugins.video.setAlign.call(this, null, oFrame, cover, container); + } + + let changed = true; + if (!isUpdate) { + changed = this.insertComponent(container, false, true, !this.options.mediaAutoSelect); + if (!this.options.mediaAutoSelect) { + const line = this.appendFormatTag(container, null); + this.setRange(line, 0, line, 0); + } + } else if (contextVideo._resizing && this.context.resizing._rotateVertical && changeSize) { + this.plugins.resizing.setTransformSize.call(this, oFrame, null, null); + } + + if (changed) { + if (init) { + this.plugins.fileManager.setInfo.call(this, 'video', oFrame, this.functions.onVideoUpload, file, true); + } + if (isUpdate) { + this.selectComponent(oFrame, 'video'); + // history stack + this.history.push(false); + } + } + + this.context.resizing._resize_plugin = ''; + }, + + _update_videoCover: function (oFrame) { + if (!oFrame) return; + + const contextVideo = this.context.video; + + if (/^video$/i.test(oFrame.nodeName)) this.plugins.video._setTagAttrs.call(this, oFrame); + else this.plugins.video._setIframeAttrs.call(this, oFrame); + + const existElement = this.util.getParentElement(oFrame, this.util.isMediaComponent) || + this.util.getParentElement(oFrame, function (current) { + return this.isWysiwygDiv(current.parentNode); + }.bind(this.util)); + + contextVideo._element = oFrame = oFrame.cloneNode(true); + const cover = contextVideo._cover = this.plugins.component.set_cover.call(this, oFrame); + const container = contextVideo._container = this.plugins.component.set_container.call(this, cover, 'se-video-container'); + + const figcaption = existElement.querySelector('figcaption'); + let caption = null; + if (!!figcaption) { + caption = this.util.createElement('DIV'); + caption.innerHTML = figcaption.innerHTML; + this.util.removeItem(figcaption); + } + + const size = (oFrame.getAttribute('data-size') || oFrame.getAttribute('data-origin') || '').split(','); + this.plugins.video.applySize.call(this, size[0], size[1]); + + if (this.util.isFormatElement(existElement) && existElement.textContent.length > 0) { + existElement.parentNode.insertBefore(container, existElement.nextElementSibling); + this.util.removeItem(contextVideo._element); + contextVideo._element = oFrame; + } else { + existElement.parentNode.replaceChild(container, existElement); + } + + if (!!caption) existElement.parentNode.insertBefore(caption, container.nextElementSibling); + this.plugins.fileManager.setInfo.call(this, 'video', oFrame, this.functions.onVideoUpload, null, true); + }, + + /** + * @Required @Override fileManager, resizing + */ + onModifyMode: function (element, size) { + const contextVideo = this.context.video; + contextVideo._element = element; + contextVideo._cover = this.util.getParentElement(element, 'FIGURE'); + contextVideo._container = this.util.getParentElement(element, this.util.isMediaComponent); + contextVideo._align = element.style.float || element.getAttribute('data-align') || 'none'; + element.style.float = ''; + + if (size) { + contextVideo._element_w = size.w; + contextVideo._element_h = size.h; + contextVideo._element_t = size.t; + contextVideo._element_l = size.l; + } + + let origin = contextVideo._element.getAttribute('data-size') || contextVideo._element.getAttribute('data-origin'); + if (origin) { + origin = origin.split(','); + contextVideo._origin_w = origin[0]; + contextVideo._origin_h = origin[1]; + } else if (size) { + contextVideo._origin_w = size.w; + contextVideo._origin_h = size.h; + } + }, + + /** + * @Required @Override fileManager, resizing + */ + openModify: function (notOpen) { + const contextVideo = this.context.video; + + if (contextVideo.videoUrlFile) contextVideo._linkValue = contextVideo.preview.textContent = contextVideo.videoUrlFile.value = (contextVideo._element.src || (contextVideo._element.querySelector('source') || '').src || ''); + contextVideo.modal.querySelector('input[name="suneditor_video_radio"][value="' + contextVideo._align + '"]').checked = true; + + if (contextVideo._resizing) { + this.plugins.resizing._module_setModifyInputSize.call(this, contextVideo, this.plugins.video); + + const y = contextVideo._videoRatio = this.plugins.resizing._module_getSizeY.call(this, contextVideo); + const ratioSelected = this.plugins.video.setVideoRatioSelect.call(this, y); + if (!ratioSelected) contextVideo.inputY.value = contextVideo._onlyPercentage ? this.util.getNumber(y, 2) : y; + } + + if (!notOpen) this.plugins.dialog.open.call(this, 'video', true); + }, + + setVideoRatioSelect: function (value) { + let ratioSelected = false; + const contextVideo = this.context.video; + const ratioOptions = contextVideo.videoRatioOption.options; + + if (/%$/.test(value) || contextVideo._onlyPercentage) value = (this.util.getNumber(value, 2) / 100) + ''; + else if (!this.util.isNumber(value) || (value * 1) >= 1) value = ''; + + contextVideo.inputY.placeholder = ''; + for (let i = 0, len = ratioOptions.length; i < len; i++) { + if (ratioOptions[i].value === value) { + ratioSelected = ratioOptions[i].selected = true; + contextVideo.inputY.placeholder = !value ? '' : (value * 100) + '%'; + } + else ratioOptions[i].selected = false; + } + + return ratioSelected; + }, + + /** + * @Override fileManager + */ + checkFileInfo: function () { + this.plugins.fileManager.checkInfo.call(this, 'video', ['iframe', 'video'], this.functions.onVideoUpload, this.plugins.video._update_videoCover.bind(this), true); + }, + + /** + * @Override fileManager + */ + resetFileInfo: function () { + this.plugins.fileManager.resetInfo.call(this, 'video', this.functions.onVideoUpload); + }, + + /** + * @Override fileManager + */ + applySize: function (w, h) { + const contextVideo = this.context.video; + + if (!w) w = contextVideo.inputX.value || this.options.videoWidth; + if (!h) h = contextVideo.inputY.value || this.options.videoHeight; + + if (contextVideo._onlyPercentage || /%$/.test(w) || !w) { + this.plugins.video.setPercentSize.call(this, (w || '100%'), (h || (/%$/.test(contextVideo._videoRatio) ? contextVideo._videoRatio : contextVideo._defaultRatio))); + return true; + } else if ((!w || w === 'auto') && (!h || h === 'auto')) { + this.plugins.video.setAutoSize.call(this); + } else { + this.plugins.video.setSize.call(this, w, (h || contextVideo._videoRatio || contextVideo._defaultRatio), false); + } + + return false; + }, + + /** + * @Override resizing + */ + sizeRevert: function () { + this.plugins.resizing._module_sizeRevert.call(this, this.context.video); + }, + + /** + * @Override resizing + */ + setSize: function (w, h, notResetPercentage, direction) { + const contextVideo = this.context.video; + const onlyW = /^(rw|lw)$/.test(direction); + const onlyH = /^(th|bh)$/.test(direction); + + if (!onlyH) w = this.util.getNumber(w, 0); + if (!onlyW) h = this.util.isNumber(h) ? h + contextVideo.sizeUnit : !h ? '' : h; + + if (!onlyH) contextVideo._element.style.width = w ? w + contextVideo.sizeUnit : ''; + if (!onlyW) contextVideo._cover.style.paddingBottom = contextVideo._cover.style.height = h; + + if (!onlyH && !/%$/.test(w)) { + contextVideo._cover.style.width = ''; + contextVideo._container.style.width = ''; + } + + if (!onlyW && !/%$/.test(h)) { + contextVideo._element.style.height = h; + } else { + contextVideo._element.style.height = ''; + } + + if (!notResetPercentage) contextVideo._element.removeAttribute('data-percentage'); + + // save current size + this.plugins.resizing._module_saveCurrentSize.call(this, contextVideo); + }, + + /** + * @Override resizing + */ + setAutoSize: function () { + this.plugins.video.setPercentSize.call(this, 100, this.context.video._defaultRatio); + }, + + /** + * @Override resizing + */ + setOriginSize: function (dataSize) { + const contextVideo = this.context.video; + contextVideo._element.removeAttribute('data-percentage'); + + this.plugins.resizing.resetTransform.call(this, contextVideo._element); + this.plugins.video.cancelPercentAttr.call(this); + + const originSize = ((dataSize ? contextVideo._element.getAttribute('data-size') : '') || contextVideo._element.getAttribute('data-origin') || '').split(','); + + if (originSize) { + const w = originSize[0]; + const h = originSize[1]; + + if (contextVideo._onlyPercentage || (/%$/.test(w) && (/%$/.test(h) || !/\d/.test(h)))) { + this.plugins.video.setPercentSize.call(this, w, h); + } else { + this.plugins.video.setSize.call(this, w, h); + } + + // save current size + this.plugins.resizing._module_saveCurrentSize.call(this, contextVideo); + } + }, + + /** + * @Override resizing + */ + setPercentSize: function (w, h) { + const contextVideo = this.context.video; + h = !!h && !/%$/.test(h) && !this.util.getNumber(h, 0) ? this.util.isNumber(h) ? h + '%' : h : this.util.isNumber(h) ? h + contextVideo.sizeUnit : (h || contextVideo._defaultRatio); + + contextVideo._container.style.width = this.util.isNumber(w) ? w + '%' : w; + contextVideo._container.style.height = ''; + contextVideo._cover.style.width = '100%'; + contextVideo._cover.style.height = h; + contextVideo._cover.style.paddingBottom = h; + contextVideo._element.style.width = '100%'; + contextVideo._element.style.height = '100%'; + contextVideo._element.style.maxWidth = ''; + + if (contextVideo._align === 'center') this.plugins.video.setAlign.call(this, null, null, null, null); + contextVideo._element.setAttribute('data-percentage', w + ',' + h); + + // save current size + this.plugins.resizing._module_saveCurrentSize.call(this, contextVideo); + }, + + /** + * @Override resizing + */ + cancelPercentAttr: function () { + const contextVideo = this.context.video; + + contextVideo._cover.style.width = ''; + contextVideo._cover.style.height = ''; + contextVideo._cover.style.paddingBottom = ''; + contextVideo._container.style.width = ''; + contextVideo._container.style.height = ''; + + this.util.removeClass(contextVideo._container, this.context.video._floatClassRegExp); + this.util.addClass(contextVideo._container, '__se__float-' + contextVideo._align); + + if (contextVideo._align === 'center') this.plugins.video.setAlign.call(this, null, null, null, null); + }, + + /** + * @Override resizing + */ + setAlign: function (align, element, cover, container) { + const contextVideo = this.context.video; + + if (!align) align = contextVideo._align; + if (!element) element = contextVideo._element; + if (!cover) cover = contextVideo._cover; + if (!container) container = contextVideo._container; + + if (align && align !== 'none') { + cover.style.margin = 'auto'; + } else { + cover.style.margin = '0'; + } + + if (/%$/.test(element.style.width) && align === 'center') { + container.style.minWidth = '100%'; + cover.style.width = container.style.width; + cover.style.height = cover.style.height; + cover.style.paddingBottom = !/%$/.test(cover.style.height) ? cover.style.height : this.util.getNumber((this.util.getNumber(cover.style.height, 2) / 100) * this.util.getNumber(cover.style.width, 2), 2) + '%'; + } else { + container.style.minWidth = ''; + cover.style.width = this.context.resizing._rotateVertical ? (element.style.height || element.offsetHeight) : (element.style.width || '100%'); + cover.style.paddingBottom = cover.style.height; + } + + if (!this.util.hasClass(container, '__se__float-' + align)) { + this.util.removeClass(container, contextVideo._floatClassRegExp); + this.util.addClass(container, '__se__float-' + align); + } + + element.setAttribute('data-align', align); + }, + + /** + * @Override dialog + */ + init: function () { + const contextVideo = this.context.video; + if (contextVideo.videoInputFile) contextVideo.videoInputFile.value = ''; + if (contextVideo.videoUrlFile) contextVideo._linkValue = contextVideo.preview.textContent = contextVideo.videoUrlFile.value = ''; + if (contextVideo.videoInputFile && contextVideo.videoUrlFile) { + contextVideo.videoUrlFile.removeAttribute('disabled'); + contextVideo.preview.style.textDecoration = ''; + } + + contextVideo._origin_w = this.options.videoWidth; + contextVideo._origin_h = this.options.videoHeight; + contextVideo.modal.querySelector('input[name="suneditor_video_radio"][value="none"]').checked = true; + + if (contextVideo._resizing) { + contextVideo.inputX.value = this.options.videoWidth === contextVideo._defaultSizeX ? '' : this.options.videoWidth; + contextVideo.inputY.value = this.options.videoHeight === contextVideo._defaultSizeY ? '' : this.options.videoHeight; + contextVideo.proportion.checked = true; + contextVideo.proportion.disabled = true; + this.plugins.video.setVideoRatioSelect.call(this, contextVideo._defaultRatio); + } + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/fileBrowser/imageGallery.js": +/*!************************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/fileBrowser/imageGallery.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_fileBrowser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/fileBrowser */ "./node_modules/suneditor/src/plugins/modules/fileBrowser.js"); +/* harmony import */ var _modules_fileBrowser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_modules_fileBrowser__WEBPACK_IMPORTED_MODULE_0__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'imageGallery', + /** + * @description Constructor + * @param {Object} core Core object + */ + add: function (core) { + core.addModule([_modules_fileBrowser__WEBPACK_IMPORTED_MODULE_0___default.a]); + + const context = core.context; + context.imageGallery = { + title: core.lang.toolbar.imageGallery, // @Required @Override fileBrowser - File browser window title. + url: core.options.imageGalleryUrl, // @Required @Override fileBrowser - File server url. + listClass: 'se-image-list', // @Required @Override fileBrowser - Class name of list div. + itemTemplateHandler: this.drawItems, // @Required @Override fileBrowser - Function that defines the HTML of an file item. + selectorHandler: this.setImage.bind(core), // @Required @Override fileBrowser - Function that action when item click. + columnSize: 4 // @Option @Override fileBrowser - Number of "div.se-file-item-column" to be created (default: 4) + }; + }, + + /** + * @Required @Override fileBrowser + * @description Open a file browser. + * @param {Function|null} selectorHandler When the function comes as an argument value, it substitutes "context.selectorHandler". + */ + open: function (selectorHandler) { + this.plugins.fileBrowser.open.call(this, 'imageGallery', selectorHandler); + }, + + /** + * @Required @Override fileBrowser + * @description Define the HTML of the item to be put in "div.se-file-item-column". + * Format: [ + * { src: "image src", name: "name(@option)", alt: "image alt(@option)", tag: "tag name(@option)" } + * ] + * @param {Object} item Item of the response data's array + */ + drawItems: function (item) { + const srcName = item.src.split('/').pop(); + return '
' + (item.alt || srcName) + '' + + '
' + + '
' + (item.name || srcName) + '
' + + '
'; + }, + + setImage: function (target) { + this.callPlugin('image', function () { + const file = {name: target.parentNode.querySelector('.__se__img_name').textContent, size: 0}; + this.context.image._altText = target.alt; + this.plugins.image.create_image.call(this, target.src, null, this.context.image._origin_w, this.context.image._origin_h, 'none', file); + }.bind(this), null); + } +}); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/index.js": +/*!*****************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/index.js ***! + \*****************************************************/ +/*! exports provided: blockquote, align, font, fontSize, fontColor, hiliteColor, horizontalRule, list, table, formatBlock, lineHeight, template, paragraphStyle, textStyle, link, image, video, audio, math, imageGallery, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _command_blockquote__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./command/blockquote */ "./node_modules/suneditor/src/plugins/command/blockquote.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "blockquote", function() { return _command_blockquote__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + +/* harmony import */ var _submenu_align__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./submenu/align */ "./node_modules/suneditor/src/plugins/submenu/align.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "align", function() { return _submenu_align__WEBPACK_IMPORTED_MODULE_1__["default"]; }); + +/* harmony import */ var _submenu_font__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./submenu/font */ "./node_modules/suneditor/src/plugins/submenu/font.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "font", function() { return _submenu_font__WEBPACK_IMPORTED_MODULE_2__["default"]; }); + +/* harmony import */ var _submenu_fontSize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./submenu/fontSize */ "./node_modules/suneditor/src/plugins/submenu/fontSize.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fontSize", function() { return _submenu_fontSize__WEBPACK_IMPORTED_MODULE_3__["default"]; }); + +/* harmony import */ var _submenu_fontColor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./submenu/fontColor */ "./node_modules/suneditor/src/plugins/submenu/fontColor.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fontColor", function() { return _submenu_fontColor__WEBPACK_IMPORTED_MODULE_4__["default"]; }); + +/* harmony import */ var _submenu_hiliteColor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./submenu/hiliteColor */ "./node_modules/suneditor/src/plugins/submenu/hiliteColor.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hiliteColor", function() { return _submenu_hiliteColor__WEBPACK_IMPORTED_MODULE_5__["default"]; }); + +/* harmony import */ var _submenu_horizontalRule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./submenu/horizontalRule */ "./node_modules/suneditor/src/plugins/submenu/horizontalRule.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "horizontalRule", function() { return _submenu_horizontalRule__WEBPACK_IMPORTED_MODULE_6__["default"]; }); + +/* harmony import */ var _submenu_list__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./submenu/list */ "./node_modules/suneditor/src/plugins/submenu/list.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "list", function() { return _submenu_list__WEBPACK_IMPORTED_MODULE_7__["default"]; }); + +/* harmony import */ var _submenu_table__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./submenu/table */ "./node_modules/suneditor/src/plugins/submenu/table.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "table", function() { return _submenu_table__WEBPACK_IMPORTED_MODULE_8__["default"]; }); + +/* harmony import */ var _submenu_formatBlock__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./submenu/formatBlock */ "./node_modules/suneditor/src/plugins/submenu/formatBlock.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatBlock", function() { return _submenu_formatBlock__WEBPACK_IMPORTED_MODULE_9__["default"]; }); + +/* harmony import */ var _submenu_lineHeight__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./submenu/lineHeight */ "./node_modules/suneditor/src/plugins/submenu/lineHeight.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lineHeight", function() { return _submenu_lineHeight__WEBPACK_IMPORTED_MODULE_10__["default"]; }); + +/* harmony import */ var _submenu_template__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./submenu/template */ "./node_modules/suneditor/src/plugins/submenu/template.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "template", function() { return _submenu_template__WEBPACK_IMPORTED_MODULE_11__["default"]; }); + +/* harmony import */ var _submenu_paragraphStyle__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./submenu/paragraphStyle */ "./node_modules/suneditor/src/plugins/submenu/paragraphStyle.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "paragraphStyle", function() { return _submenu_paragraphStyle__WEBPACK_IMPORTED_MODULE_12__["default"]; }); + +/* harmony import */ var _submenu_textStyle__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./submenu/textStyle */ "./node_modules/suneditor/src/plugins/submenu/textStyle.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "textStyle", function() { return _submenu_textStyle__WEBPACK_IMPORTED_MODULE_13__["default"]; }); + +/* harmony import */ var _dialog_link__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./dialog/link */ "./node_modules/suneditor/src/plugins/dialog/link.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "link", function() { return _dialog_link__WEBPACK_IMPORTED_MODULE_14__["default"]; }); + +/* harmony import */ var _dialog_image__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./dialog/image */ "./node_modules/suneditor/src/plugins/dialog/image.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "image", function() { return _dialog_image__WEBPACK_IMPORTED_MODULE_15__["default"]; }); + +/* harmony import */ var _dialog_video__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./dialog/video */ "./node_modules/suneditor/src/plugins/dialog/video.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "video", function() { return _dialog_video__WEBPACK_IMPORTED_MODULE_16__["default"]; }); + +/* harmony import */ var _dialog_audio__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./dialog/audio */ "./node_modules/suneditor/src/plugins/dialog/audio.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audio", function() { return _dialog_audio__WEBPACK_IMPORTED_MODULE_17__["default"]; }); + +/* harmony import */ var _dialog_math__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./dialog/math */ "./node_modules/suneditor/src/plugins/dialog/math.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "math", function() { return _dialog_math__WEBPACK_IMPORTED_MODULE_18__["default"]; }); + +/* harmony import */ var _fileBrowser_imageGallery__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./fileBrowser/imageGallery */ "./node_modules/suneditor/src/plugins/fileBrowser/imageGallery.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imageGallery", function() { return _fileBrowser_imageGallery__WEBPACK_IMPORTED_MODULE_19__["default"]; }); + + + +// command + + +// submenu + + + + + + + + + + + + + + +// dialog + + + + + + +// file browser + + + +/* harmony default export */ __webpack_exports__["default"] = ({ blockquote: _command_blockquote__WEBPACK_IMPORTED_MODULE_0__["default"], align: _submenu_align__WEBPACK_IMPORTED_MODULE_1__["default"], font: _submenu_font__WEBPACK_IMPORTED_MODULE_2__["default"], fontSize: _submenu_fontSize__WEBPACK_IMPORTED_MODULE_3__["default"], fontColor: _submenu_fontColor__WEBPACK_IMPORTED_MODULE_4__["default"], hiliteColor: _submenu_hiliteColor__WEBPACK_IMPORTED_MODULE_5__["default"], horizontalRule: _submenu_horizontalRule__WEBPACK_IMPORTED_MODULE_6__["default"], list: _submenu_list__WEBPACK_IMPORTED_MODULE_7__["default"], table: _submenu_table__WEBPACK_IMPORTED_MODULE_8__["default"], formatBlock: _submenu_formatBlock__WEBPACK_IMPORTED_MODULE_9__["default"], lineHeight: _submenu_lineHeight__WEBPACK_IMPORTED_MODULE_10__["default"], template: _submenu_template__WEBPACK_IMPORTED_MODULE_11__["default"], paragraphStyle: _submenu_paragraphStyle__WEBPACK_IMPORTED_MODULE_12__["default"], textStyle: _submenu_textStyle__WEBPACK_IMPORTED_MODULE_13__["default"], link: _dialog_link__WEBPACK_IMPORTED_MODULE_14__["default"], image: _dialog_image__WEBPACK_IMPORTED_MODULE_15__["default"], video: _dialog_video__WEBPACK_IMPORTED_MODULE_16__["default"], audio: _dialog_audio__WEBPACK_IMPORTED_MODULE_17__["default"], math: _dialog_math__WEBPACK_IMPORTED_MODULE_18__["default"], imageGallery: _fileBrowser_imageGallery__WEBPACK_IMPORTED_MODULE_19__["default"] }); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/modules/_anchor.js": +/*!***************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/modules/_anchor.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'anchor', + add: function (core) { + core.context.anchor = { + caller: {}, + forms: this.setDialogForm(core), + host: core._w.location.origin + core._w.location.pathname + }; + }, + + /** dialog */ + setDialogForm: function (core) { + const lang = core.lang; + const relList = core.options.linkRel; + const defaultRel = (core.options.linkRelDefault.default || '').split(' '); + const icons = core.icons; + const forms = core.util.createElement('DIV'); + + let html = '
' + + '
' + + '' + + '
' + + '' + + '' + + '
' + + '
' + + '' + icons.bookmark + '' + + '' + icons.download + '' + + '' + + '
' + + '
' + + '
' + + '' + + '
' + + '
'; + + forms.innerHTML = html; + return forms; + }, + + initEvent: function (pluginName, forms) { + const anchorPlugin = this.plugins.anchor; + const context = this.context.anchor.caller[pluginName] = { + modal: forms, + urlInput: null, + linkDefaultRel: this.options.linkRelDefault, + defaultRel: this.options.linkRelDefault.default || '', + currentRel: [], + linkAnchor: null, + linkValue: '' + }; + + if (typeof context.linkDefaultRel.default === 'string') context.linkDefaultRel.default = context.linkDefaultRel.default.trim(); + if (typeof context.linkDefaultRel.check_new_window === 'string') context.linkDefaultRel.check_new_window = context.linkDefaultRel.check_new_window.trim(); + if (typeof context.linkDefaultRel.check_bookmark === 'string') context.linkDefaultRel.check_bookmark = context.linkDefaultRel.check_bookmark.trim(); + + context.urlInput = forms.querySelector('.se-input-url'); + context.anchorText = forms.querySelector('._se_anchor_text'); + context.newWindowCheck = forms.querySelector('._se_anchor_check'); + context.downloadCheck = forms.querySelector('._se_anchor_download'); + context.download = forms.querySelector('._se_anchor_download_icon'); + context.preview = forms.querySelector('.se-link-preview'); + context.bookmark = forms.querySelector('._se_anchor_bookmark_icon'); + context.bookmarkButton = forms.querySelector('._se_bookmark_button'); + + /** rel */ + if (this.options.linkRel.length > 0) { + context.relButton = forms.querySelector('.se-anchor-rel-btn'); + context.relList = forms.querySelector('.se-list-layer'); + context.relPreview = forms.querySelector('.se-anchor-rel-preview'); + context.relButton.addEventListener('click', anchorPlugin.onClick_relButton.bind(this, context)); + context.relList.addEventListener('click', anchorPlugin.onClick_relList.bind(this, context)); + } + + context.newWindowCheck.addEventListener('change', anchorPlugin.onChange_newWindowCheck.bind(this, context)); + context.downloadCheck.addEventListener('change', anchorPlugin.onChange_downloadCheck.bind(this, context)); + context.urlInput.addEventListener('input', anchorPlugin.setLinkPreview.bind(this, context, this.options.linkProtocol)); + context.bookmarkButton.addEventListener('click', anchorPlugin.onClick_bookmarkButton.bind(this, context)); + }, + + on: function (contextAnchor, update) { + if (!update) { + this.plugins.anchor.init.call(this, contextAnchor); + contextAnchor.anchorText.value = this.getSelection().toString(); + } else if (contextAnchor.linkAnchor) { + this.context.dialog.updateModal = true; + contextAnchor.linkValue = contextAnchor.preview.textContent = contextAnchor.urlInput.value = (contextAnchor.linkAnchor.id ? '#' + contextAnchor.linkAnchor.id : contextAnchor.linkAnchor.href); + contextAnchor.anchorText.value = contextAnchor.linkAnchor.getAttribute('alt') || contextAnchor.linkAnchor.textContent; + contextAnchor.newWindowCheck.checked = (/_blank/i.test(contextAnchor.linkAnchor.target) ? true : false); + contextAnchor.downloadCheck.checked = contextAnchor.linkAnchor.download; + } + + this.plugins.anchor.setRel.call(this, contextAnchor, (update && contextAnchor.linkAnchor) ? contextAnchor.linkAnchor.rel : contextAnchor.defaultRel); + this.plugins.anchor.setLinkPreview.call(this, contextAnchor, this.options.linkProtocol, contextAnchor.linkValue); + }, + + _closeRelMenu: null, + toggleRelList: function (contextAnchor, show) { + if (!show) { + if (this.plugins.anchor._closeRelMenu) this.plugins.anchor._closeRelMenu(); + } else { + const target = contextAnchor.relButton; + const relList = contextAnchor.relList; + this.util.addClass(target, 'active'); + relList.style.visibility = 'hidden'; + relList.style.display = 'block'; + if (!this.options.rtl) relList.style.left = (target.offsetLeft + target.offsetWidth + 1) + 'px'; + else relList.style.left = (target.offsetLeft - relList.offsetWidth - 1) + 'px'; + relList.style.top = (target.offsetTop + (target.offsetHeight / 2) - (relList.offsetHeight / 2)) + 'px'; + relList.style.visibility = ''; + + this.plugins.anchor._closeRelMenu = function (context, target, e) { + if (e && (context.relButton.contains(e.target) || context.relList.contains(e.target))) return; + this.util.removeClass(target, 'active'); + context.relList.style.display = 'none'; + this.modalForm.removeEventListener('click', this.plugins.anchor._closeRelMenu); + this.plugins.anchor._closeRelMenu = null; + }.bind(this, contextAnchor, target); + + this.modalForm.addEventListener('click', this.plugins.anchor._closeRelMenu); + } + }, + + onClick_relButton: function (contextAnchor, e) { + this.plugins.anchor.toggleRelList.call(this, contextAnchor, !this.util.hasClass(e.target, 'active')); + }, + + onClick_relList: function (contextAnchor, e) { + const target = e.target; + const cmd = target.getAttribute('data-command'); + if (!cmd) return; + + const current = contextAnchor.currentRel; + const checked = this.util.toggleClass(target, 'se-checked'); + const index = current.indexOf(cmd); + if (checked) { + if (index === -1) current.push(cmd); + } else { + if (index > -1) current.splice(index, 1); + } + + contextAnchor.relPreview.title = contextAnchor.relPreview.textContent = current.join(' '); + }, + + setRel: function (contextAnchor, relAttr) { + const relListEl = contextAnchor.relList; + const rels = contextAnchor.currentRel = !relAttr ? [] : relAttr.split(' '); + if (!relListEl) return; + + const checkedRel = relListEl.querySelectorAll('button'); + for (let i = 0, len = checkedRel.length, cmd; i < len; i++) { + cmd = checkedRel[i].getAttribute('data-command'); + if (rels.indexOf(cmd) > -1) { + this.util.addClass(checkedRel[i], 'se-checked'); + } else { + this.util.removeClass(checkedRel[i], 'se-checked'); + } + } + + contextAnchor.relPreview.title = contextAnchor.relPreview.textContent = rels.join(' '); + }, + + setLinkPreview: function (context, protocol, e) { + const preview = context.preview; + const value = typeof e === 'string' ? e : e.target.value.trim(); + const reservedProtocol = /^(mailto\:|https*\:\/\/)/.test(value); + const sameProtocol = !protocol ? false : this._w.RegExp('^' + value.substr(0, protocol.length)).test(protocol); + context.linkValue = preview.textContent = !value ? '' : (protocol && !reservedProtocol && !sameProtocol) ? protocol + value : reservedProtocol ? value : /^www\./.test(value) ? 'http://' + value : this.context.anchor.host + (/^\//.test(value) ? '' : '/') + value; + + if (value.indexOf('#') === 0) { + context.bookmark.style.display = 'block'; + this.util.addClass(context.bookmarkButton, 'active'); + } else { + context.bookmark.style.display = 'none'; + this.util.removeClass(context.bookmarkButton, 'active'); + } + + if (value.indexOf('#') === -1 && context.downloadCheck.checked) { + context.download.style.display = 'block'; + } else { + context.download.style.display = 'none'; + } + }, + + updateAnchor: function (anchor, url, alt, contextAnchor, notText) { + // bookmark + if (/^\#/.test(url)) { + anchor.id = url.substr(1); + } else { + anchor.removeAttribute('id'); + } + + // download + if (!/^\#/.test(url) && contextAnchor.downloadCheck.checked) { + anchor.setAttribute('download', alt || url); + } else { + anchor.removeAttribute('download'); + } + + // new window + if (contextAnchor.newWindowCheck.checked) anchor.target = '_blank'; + else anchor.removeAttribute('target'); + + // rel + const rel = contextAnchor.currentRel.join(' '); + if (!rel) anchor.removeAttribute('rel'); + else anchor.rel = rel; + + // est url, alt + anchor.href = url; + anchor.setAttribute('alt', alt); + anchor.textContent = notText ? '' : alt; + }, + + createAnchor: function (contextAnchor, notText) { + if (contextAnchor.linkValue.length === 0) return null; + + const url = contextAnchor.linkValue; + const anchor = contextAnchor.anchorText; + const anchorText = anchor.value.length === 0 ? url : anchor.value; + + const oA = contextAnchor.linkAnchor || this.util.createElement('A'); + this.plugins.anchor.updateAnchor(oA, url, anchorText, contextAnchor, notText); + + contextAnchor.linkValue = contextAnchor.preview.textContent = contextAnchor.urlInput.value = contextAnchor.anchorText.value = ''; + + return oA; + }, + + onClick_bookmarkButton: function (contextAnchor) { + let url = contextAnchor.urlInput.value; + if (/^\#/.test(url)) { + url = url.substr(1); + contextAnchor.bookmark.style.display = 'none'; + this.util.removeClass(contextAnchor.bookmarkButton, 'active'); + } else { + url = '#' + url; + contextAnchor.bookmark.style.display = 'block'; + this.util.addClass(contextAnchor.bookmarkButton, 'active'); + contextAnchor.downloadCheck.checked = false; + contextAnchor.download.style.display = 'none'; + } + + contextAnchor.linkValue = contextAnchor.preview.textContent = contextAnchor.urlInput.value = url; + contextAnchor.urlInput.focus(); + }, + + onChange_newWindowCheck: function (contextAnchor, e) { + if (typeof contextAnchor.linkDefaultRel.check_new_window !== 'string') return; + if (e.target.checked) { + this.plugins.anchor.setRel.call(this, contextAnchor, this.plugins.anchor._relMerge.call(this, contextAnchor, contextAnchor.linkDefaultRel.check_new_window)); + } else { + this.plugins.anchor.setRel.call(this, contextAnchor, this.plugins.anchor._relDelete.call(this, contextAnchor, contextAnchor.linkDefaultRel.check_new_window)); + } + }, + + onChange_downloadCheck: function (contextAnchor, e) { + if (e.target.checked) { + contextAnchor.download.style.display = 'block'; + contextAnchor.bookmark.style.display = 'none'; + this.util.removeClass(contextAnchor.bookmarkButton, 'active'); + contextAnchor.linkValue = contextAnchor.preview.textContent = contextAnchor.urlInput.value = contextAnchor.urlInput.value.replace(/^\#+/, ''); + if (typeof contextAnchor.linkDefaultRel.check_bookmark === 'string') { + this.plugins.anchor.setRel.call(this, contextAnchor, this.plugins.anchor._relMerge.call(this, contextAnchor, contextAnchor.linkDefaultRel.check_bookmark)); + } + } else { + contextAnchor.download.style.display = 'none'; + if (typeof contextAnchor.linkDefaultRel.check_bookmark === 'string') { + this.plugins.anchor.setRel.call(this, contextAnchor, this.plugins.anchor._relDelete.call(this, contextAnchor, contextAnchor.linkDefaultRel.check_bookmark)); + } + } + }, + + _relMerge: function (contextAnchor, relAttr) { + const current = contextAnchor.currentRel; + if (!relAttr) return current.join(' '); + + if (/^only\:/.test(relAttr)) { + relAttr = relAttr.replace(/^only\:/, '').trim(); + contextAnchor.currentRel = relAttr.split(' '); + return relAttr; + } + + const rels = relAttr.split(' '); + for (let i = 0, len = rels.length, index; i < len; i++) { + index = current.indexOf(rels[i]); + if (index === -1) current.push(rels[i]); + } + + return current.join(' '); + }, + + _relDelete: function (contextAnchor, relAttr) { + if (!relAttr) return contextAnchor.currentRel.join(' '); + if (/^only\:/.test(relAttr)) relAttr = relAttr.replace(/^only\:/, '').trim(); + + const rels = contextAnchor.currentRel.join(' ').replace(this._w.RegExp(relAttr + '\\s*'), ''); + contextAnchor.currentRel = rels.split(' '); + return rels; + }, + + init: function (contextAnchor) { + contextAnchor.linkAnchor = null; + contextAnchor.linkValue = contextAnchor.preview.textContent = contextAnchor.urlInput.value = ''; + contextAnchor.anchorText.value = ''; + contextAnchor.newWindowCheck.checked = false; + contextAnchor.downloadCheck.checked = false; + this.plugins.anchor.setRel.call(this, contextAnchor, contextAnchor.defaultRel); + if (contextAnchor.relList) { + this.plugins.anchor.toggleRelList.call(this, contextAnchor, false); + } + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/modules/_colorPicker.js": +/*!********************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/modules/_colorPicker.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2018 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'colorPicker', + /** + * @description Constructor + * @param {Object} core Core object + */ + add: function (core) { + const context = core.context; + context.colorPicker = { + colorListHTML: '', + _colorInput: '', + _defaultColor: '#000', + _styleProperty: 'color', + _currentColor: '', + _colorList: [] + }; + + /** set submenu */ + context.colorPicker.colorListHTML = this.createColorList(core, this._makeColorList); + }, + + /** + * @description Create color list + * @param {Object} core Core object + * @param {Function} makeColor this._makeColorList + * @returns {String} HTML string + */ + createColorList: function (core, makeColor) { + const option = core.options; + const lang = core.lang; + const colorList = !option.colorList || option.colorList.length === 0 ? + [ + '#ff0000', '#ff5e00', '#ffe400', '#abf200', '#00d8ff', '#0055ff', '#6600ff', '#ff00dd', '#000000', + '#ffd8d8', '#fae0d4', '#faf4c0', '#e4f7ba', '#d4f4fa', '#d9e5ff', '#e8d9ff', '#ffd9fa', '#f1f1f1', + '#ffa7a7', '#ffc19e', '#faed7d', '#cef279', '#b2ebf4', '#b2ccff', '#d1b2ff', '#ffb2f5', '#bdbdbd', + '#f15f5f', '#f29661', '#e5d85c', '#bce55c', '#5cd1e5', '#6699ff', '#a366ff', '#f261df', '#8c8c8c', + '#980000', '#993800', '#998a00', '#6b9900', '#008299', '#003399', '#3d0099', '#990085', '#353535', + '#670000', '#662500', '#665c00', '#476600', '#005766', '#002266', '#290066', '#660058', '#222222' + ] : option.colorList; + + let colorArr = []; + let list = '
'; + for (let i = 0, len = colorList.length, color; i < len; i++) { + color = colorList[i]; + if (!color) continue; + + if (typeof color === 'string') { + colorArr.push(color); + if (i < len - 1) continue; + } + if (colorArr.length > 0) { + list += '
' + makeColor(colorArr) + '
'; + colorArr = []; + } + if (typeof color === 'object') { + list += '
' + makeColor(color) + '
'; + } + } + list += '' + + '
' + + '' + + '' + + '' + + '
' + + '
'; + + return list; + }, + + /** + * @description Internal function used by this.createColorList + * @param {Array} colorList Color list + * @private + */ + _makeColorList: function (colorList) { + let list = ''; + + list += '
    '; + for (let i = 0, len = colorList.length, color; i < len; i++) { + color = colorList[i]; + if (typeof color === 'string') { + list += '
  • ' + + '' + + '
  • '; + } + } + list += '
'; + + return list; + }, + + /** + * @description Displays or resets the currently selected color at color list. + * @param {Node} node Current Selected node + * @param {String|null} color Color value + */ + init: function (node, color) { + const colorPicker = this.plugins.colorPicker; + let fillColor = color ? color : colorPicker.getColorInNode.call(this, node) || this.context.colorPicker._defaultColor; + fillColor = colorPicker.isHexColor(fillColor) ? fillColor : colorPicker.rgb2hex(fillColor) || fillColor; + + const colorList = this.context.colorPicker._colorList; + if (colorList) { + for (let i = 0, len = colorList.length; i < len; i++) { + if (fillColor.toLowerCase() === colorList[i].getAttribute('data-value').toLowerCase()) { + this.util.addClass(colorList[i], 'active'); + } else { + this.util.removeClass(colorList[i], 'active'); + } + } + } + + colorPicker.setInputText.call(this, colorPicker.colorName2hex.call(this, fillColor)); + }, + + /** + * @description Store color values + * @param {String} hexColorStr Hax color value + */ + setCurrentColor: function (hexColorStr) { + this.context.colorPicker._currentColor = hexColorStr; + this.context.colorPicker._colorInput.style.borderColor = hexColorStr; + }, + + /** + * @description Set color at input element + * @param {String} hexColorStr Hax color value + */ + setInputText: function (hexColorStr) { + hexColorStr = /^#/.test(hexColorStr) ? hexColorStr : '#' + hexColorStr; + this.context.colorPicker._colorInput.value = hexColorStr; + this.plugins.colorPicker.setCurrentColor.call(this, hexColorStr); + }, + + /** + * @description Gets color value at color property of node + * @param {Node} node Selected node + * @returns {String} + */ + getColorInNode: function (node) { + let findColor = ''; + const styleProperty = this.context.colorPicker._styleProperty; + + while (node && !this.util.isWysiwygDiv(node) && findColor.length === 0) { + if (node.nodeType === 1 && node.style[styleProperty]) findColor = node.style[styleProperty]; + node = node.parentNode; + } + + return findColor; + }, + + /** + * @description Function to check hex format color + * @param {String} str Color value + */ + isHexColor: function (str) { + return /^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test(str); + }, + + /** + * @description Function to convert hex format to a rgb color + * @param {String} rgb RGB color format + * @returns {String} + */ + rgb2hex: function (rgb) { + const rgbMatch = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i); + + return (rgbMatch && rgbMatch.length === 4) ? "#" + + ("0" + parseInt(rgbMatch[1],10).toString(16)).slice(-2) + + ("0" + parseInt(rgbMatch[2],10).toString(16)).slice(-2) + + ("0" + parseInt(rgbMatch[3],10).toString(16)).slice(-2) : ''; + }, + + /** + * @description Converts color values of other formats to hex color values and returns. + * @param {String} colorName Color value + * @returns {String} + */ + colorName2hex: function (colorName) { + if (/^#/.test(colorName)) return colorName; + var temp = this.util.createElement('div'); + temp.style.display = 'none'; + temp.style.color = colorName; + var colors = this._w.getComputedStyle(this._d.body.appendChild(temp)).color.match(/\d+/g).map(function (a) { return parseInt(a,10); }); + this.util.removeItem(temp); + return (colors.length >= 3) ? '#' + (((1 << 24) + (colors[0] << 16) + (colors[1] << 8) + colors[2]).toString(16).substr(1)) : false; + } +}); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/modules/_notice.js": +/*!***************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/modules/_notice.js ***! + \***************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'notice', + /** + * @description Constructor + * @param {Object} core Core object + */ + add: function (core) { + const context = core.context; + context.notice = {}; + + /** dialog */ + let notice_div = core.util.createElement('DIV'); + let notice_span = core.util.createElement('SPAN'); + let notice_button = core.util.createElement('BUTTON'); + + notice_div.className = 'se-notice'; + notice_button.className = 'close'; + notice_button.setAttribute('aria-label', 'Close'); + notice_button.setAttribute('title', core.lang.dialogBox.close); + notice_button.innerHTML = core.icons.cancel; + + notice_div.appendChild(notice_span); + notice_div.appendChild(notice_button); + + context.notice.modal = notice_div; + context.notice.message = notice_span; + + /** add event listeners */ + notice_button.addEventListener('click', this.onClick_cancel.bind(core)); + + /** append html */ + context.element.editorArea.appendChild(notice_div); + + /** empty memory */ + notice_div = null; + }, + + /** + * @description Event when clicking the cancel button + * @param {MouseEvent} e Event object + */ + onClick_cancel: function (e) { + e.preventDefault(); + e.stopPropagation(); + this.plugins.notice.close.call(this); + }, + + /** + * @description Open the notice panel + * @param {String} text Notice message + */ + open: function (text) { + this.context.notice.message.textContent = text; + this.context.notice.modal.style.display = 'block'; + }, + + /** + * @description Open the notice panel + */ + close: function () { + this.context.notice.modal.style.display = 'none'; + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/modules/component.js": +/*!*****************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/modules/component.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +(function (global, factory) { + if ( true && typeof module.exports === 'object') { + module.exports = global.document ? + factory(global, true) : + function (w) { + if (!w.document) { + throw new Error('SUNEDITOR_MODULES a window with a document'); + } + return factory(w); + }; + } else { + factory(global); + } +}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) { + const component = { + name: 'component', + /** + * @description Create a container for the resizing component and insert the element. + * @param {Element} cover Cover element (FIGURE) + * @param {String} className Class name of container (fixed: se-component) + * @returns {Element} Created container element + */ + set_container: function (cover, className) { + const container = this.util.createElement('DIV'); + container.className = 'se-component ' + className; + container.setAttribute('contenteditable', false); + container.appendChild(cover); + + return container; + }, + + /** + * @description Cover the target element with a FIGURE element. + * @param {Element} element Target element + */ + set_cover: function (element) { + const cover = this.util.createElement('FIGURE'); + cover.appendChild(element); + + return cover; + }, + + /** + * @description Return HTML string of caption(FIGCAPTION) element + * @returns {String} + */ + create_caption: function () { + const caption = this.util.createElement('FIGCAPTION'); + caption.setAttribute('contenteditable', true); + caption.innerHTML = '
' + this.lang.dialogBox.caption + '
'; + return caption; + } + }; + + if (typeof noGlobal === typeof undefined) { + if (!window.SUNEDITOR_MODULES) { + Object.defineProperty(window, 'SUNEDITOR_MODULES', { + enumerable: true, + writable: false, + configurable: false, + value: {} + }); + } + + Object.defineProperty(window.SUNEDITOR_MODULES, 'component', { + enumerable: true, + writable: false, + configurable: false, + value: component + }); + } + + return component; +})); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/modules/dialog.js": +/*!**************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/modules/dialog.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +(function (global, factory) { + if ( true && typeof module.exports === 'object') { + module.exports = global.document ? + factory(global, true) : + function (w) { + if (!w.document) { + throw new Error('SUNEDITOR_MODULES a window with a document'); + } + return factory(w); + }; + } else { + factory(global); + } +}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) { + const dialog = { + name: 'dialog', + /** + * @description Constructor + * @param {Object} core Core object + */ + add: function (core) { + const context = core.context; + context.dialog = { + kind: '', + updateModal: false, + _closeSignal: false + }; + + /** dialog */ + let dialog_div = core.util.createElement('DIV'); + dialog_div.className = 'se-dialog sun-editor-common'; + + let dialog_back = core.util.createElement('DIV'); + dialog_back.className = 'se-dialog-back'; + dialog_back.style.display = 'none'; + + let dialog_area = core.util.createElement('DIV'); + dialog_area.className = 'se-dialog-inner'; + dialog_area.style.display = 'none'; + + dialog_div.appendChild(dialog_back); + dialog_div.appendChild(dialog_area); + + context.dialog.modalArea = dialog_div; + context.dialog.back = dialog_back; + context.dialog.modal = dialog_area; + + /** add event listeners */ + context.dialog.modal.addEventListener('mousedown', this._onMouseDown_dialog.bind(core)); + context.dialog.modal.addEventListener('click', this._onClick_dialog.bind(core)); + + /** append html */ + context.element.relative.appendChild(dialog_div); + + /** empty memory */ + dialog_div = null, dialog_back = null, dialog_area = null; + }, + + /** + * @description Event to control the behavior of closing the dialog + * @param {MouseEvent} e Event object + * @private + */ + _onMouseDown_dialog: function (e) { + if (/se-dialog-inner/.test(e.target.className)) { + this.context.dialog._closeSignal = true; + } else { + this.context.dialog._closeSignal = false; + } + }, + + /** + * @description Event to close the window when the outside area of the dialog or close button is click + * @param {MouseEvent} e Event object + * @private + */ + _onClick_dialog: function (e) { + if (/close/.test(e.target.getAttribute('data-command')) || this.context.dialog._closeSignal) { + this.plugins.dialog.close.call(this); + } + }, + + /** + * @description Open a Dialog plugin + * @param {String} kind Dialog plugin name + * @param {Boolean} update Whether it will open for update ('image' === this.currentControllerName) + */ + open: function (kind, update) { + if (this.modalForm) return false; + if (this.plugins.dialog._bindClose) { + this._d.removeEventListener('keydown', this.plugins.dialog._bindClose); + this.plugins.dialog._bindClose = null; + } + + this.plugins.dialog._bindClose = function (e) { + if (!/27/.test(e.keyCode)) return; + this.plugins.dialog.close.call(this); + }.bind(this); + this._d.addEventListener('keydown', this.plugins.dialog._bindClose); + + this.context.dialog.updateModal = update; + + if (this.options.popupDisplay === 'full') { + this.context.dialog.modalArea.style.position = 'fixed'; + } else { + this.context.dialog.modalArea.style.position = 'absolute'; + } + + this.context.dialog.kind = kind; + this.modalForm = this.context[kind].modal; + const focusElement = this.context[kind].focusElement; + + if (typeof this.plugins[kind].on === 'function') this.plugins[kind].on.call(this, update); + + this.context.dialog.modalArea.style.display = 'block'; + this.context.dialog.back.style.display = 'block'; + // this.context.dialog.modal.style.display = 'flex'; @v3 + this.context.dialog.modal.style.display = 'block'; + this.modalForm.style.display = 'block'; + + if (focusElement) focusElement.focus(); + }, + + _bindClose: null, + + /** + * @description Close a Dialog plugin + * The plugin's "init" method is called. + */ + close: function () { + if (this.plugins.dialog._bindClose) { + this._d.removeEventListener('keydown', this.plugins.dialog._bindClose); + this.plugins.dialog._bindClose = null; + } + + const kind = this.context.dialog.kind; + this.modalForm.style.display = 'none'; + this.context.dialog.back.style.display = 'none'; + this.context.dialog.modalArea.style.display = 'none'; + this.context.dialog.updateModal = false; + if (typeof this.plugins[kind].init === 'function') this.plugins[kind].init.call(this); + this.context.dialog.kind = ''; + this.modalForm = null; + this.focus(); + } + }; + + if (typeof noGlobal === typeof undefined) { + if (!window.SUNEDITOR_MODULES) { + Object.defineProperty(window, 'SUNEDITOR_MODULES', { + enumerable: true, + writable: false, + configurable: false, + value: {} + }); + } + + Object.defineProperty(window.SUNEDITOR_MODULES, 'dialog', { + enumerable: true, + writable: false, + configurable: false, + value: dialog + }); + } + + return dialog; +})); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/modules/fileBrowser.js": +/*!*******************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/modules/fileBrowser.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +(function (global, factory) { + if ( true && typeof module.exports === 'object') { + module.exports = global.document ? + factory(global, true) : + function (w) { + if (!w.document) { + throw new Error('SUNEDITOR_MODULES a window with a document'); + } + return factory(w); + }; + } else { + factory(global); + } +}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) { + const fileBrowser = { + name: 'fileBrowser', + _xmlHttp: null, + _loading: null, + + /** + * @description Constructor + * @param {Object} core Core object + */ + add: function (core) { + const context = core.context; + context.fileBrowser = { + _closeSignal: false, + area: null, + header: null, + tagArea: null, + body: null, + list: null, + tagElements: null, + items: [], + selectedTags: [], + selectorHandler: null, + contextPlugin: '', + columnSize: 4 + }; + + /** fileBrowser */ + let browser_div = core.util.createElement('DIV'); + browser_div.className = 'se-file-browser sun-editor-common'; + + let back = core.util.createElement('DIV'); + back.className = 'se-file-browser-back'; + + let content = core.util.createElement('DIV'); + content.className = 'se-file-browser-inner'; + content.innerHTML = this.set_browser(core); + + browser_div.appendChild(back); + browser_div.appendChild(content); + this._loading = browser_div.querySelector('.se-loading-box'); + + context.fileBrowser.area = browser_div; + context.fileBrowser.header = content.querySelector('.se-file-browser-header'); + context.fileBrowser.titleArea = content.querySelector('.se-file-browser-title'); + context.fileBrowser.tagArea = content.querySelector('.se-file-browser-tags'); + context.fileBrowser.body = content.querySelector('.se-file-browser-body'); + context.fileBrowser.list = content.querySelector('.se-file-browser-list'); + + /** add event listeners */ + context.fileBrowser.tagArea.addEventListener('click', this.onClickTag.bind(core)); + context.fileBrowser.list.addEventListener('click', this.onClickFile.bind(core)); + content.addEventListener('mousedown', this._onMouseDown_browser.bind(core)); + content.addEventListener('click', this._onClick_browser.bind(core)); + + /** append html */ + context.element.relative.appendChild(browser_div); + + /** empty memory */ + browser_div = null, back = null, content = null; + }, + + set_browser: function (core) { + const lang = core.lang; + + return '
' + + '
' + + '' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
'; + }, + + /** + * @description Event to control the behavior of closing the browser + * @param {MouseEvent} e Event object + * @private + */ + _onMouseDown_browser: function (e) { + if (/se-file-browser-inner/.test(e.target.className)) { + this.context.fileBrowser._closeSignal = true; + } else { + this.context.fileBrowser._closeSignal = false; + } + }, + + /** + * @description Event to close the window when the outside area of the browser or close button is click + * @param {MouseEvent} e Event object + * @private + */ + _onClick_browser: function (e) { + e.stopPropagation(); + + if (/close/.test(e.target.getAttribute('data-command')) || this.context.fileBrowser._closeSignal) { + this.plugins.fileBrowser.close.call(this); + } + }, + + /** + * @description Open a file browser plugin + * @param {String} pluginName Plugin name using the file browser + * @param {Function|null} selectorHandler When the function comes as an argument value, it substitutes "context.selectorHandler". + */ + open: function (pluginName, selectorHandler) { + if (this.plugins.fileBrowser._bindClose) { + this._d.removeEventListener('keydown', this.plugins.fileBrowser._bindClose); + this.plugins.fileBrowser._bindClose = null; + } + + this.plugins.fileBrowser._bindClose = function (e) { + if (!/27/.test(e.keyCode)) return; + this.plugins.fileBrowser.close.call(this); + }.bind(this); + this._d.addEventListener('keydown', this.plugins.fileBrowser._bindClose); + + const fileBrowserContext = this.context.fileBrowser; + fileBrowserContext.contextPlugin = pluginName; + fileBrowserContext.selectorHandler = selectorHandler; + + const pluginContext = this.context[pluginName]; + const listClassName = pluginContext.listClass; + if (!this.util.hasClass(fileBrowserContext.list, listClassName)) { + fileBrowserContext.list.className = 'se-file-browser-list ' + listClassName; + } + + if (this.options.popupDisplay === 'full') { + fileBrowserContext.area.style.position = 'fixed'; + } else { + fileBrowserContext.area.style.position = 'absolute'; + } + + fileBrowserContext.titleArea.textContent = pluginContext.title; + fileBrowserContext.area.style.display = 'block'; + + this.plugins.fileBrowser._drawFileList.call(this, this.context[pluginName].url); + }, + + _bindClose: null, + + /** + * @description Close a fileBrowser plugin + * The plugin's "init" method is called. + */ + close: function () { + const fileBrowserPlugin = this.plugins.fileBrowser; + + if (fileBrowserPlugin._xmlHttp) { + fileBrowserPlugin._xmlHttp.abort(); + } + + if (fileBrowserPlugin._bindClose) { + this._d.removeEventListener('keydown', fileBrowserPlugin._bindClose); + fileBrowserPlugin._bindClose = null; + } + + const fileBrowserContext = this.context.fileBrowser; + fileBrowserContext.area.style.display = 'none'; + fileBrowserContext.selectorHandler = null; + fileBrowserContext.selectedTags = []; + fileBrowserContext.items = []; + fileBrowserContext.list.innerHTML = fileBrowserContext.tagArea.innerHTML = fileBrowserContext.titleArea.textContent = ''; + + if (typeof this.plugins[fileBrowserContext.contextPlugin].init === 'function') this.plugins[fileBrowserContext.contextPlugin].init.call(this); + fileBrowserContext.contextPlugin = ''; + }, + + /** + * @description Show file browser loading box + */ + showBrowserLoading: function () { + this._loading.style.display = 'block'; + }, + + /** + * @description Close file browser loading box + */ + closeBrowserLoading: function () { + this._loading.style.display = 'none'; + }, + + _drawFileList: function (url) { + const fileBrowserPlugin = this.plugins.fileBrowser; + + const xmlHttp = fileBrowserPlugin._xmlHttp = this.util.getXMLHttpRequest(); + xmlHttp.onreadystatechange = fileBrowserPlugin._callBackGet.bind(this, xmlHttp); + xmlHttp.open('get', url, true); + xmlHttp.send(null); + + this.plugins.fileBrowser.showBrowserLoading(); + }, + + _callBackGet: function (xmlHttp) { + if (xmlHttp.readyState === 4) { + this.plugins.fileBrowser._xmlHttp = null; + if (xmlHttp.status === 200) { + try { + this.plugins.fileBrowser._drawListItem.call(this, JSON.parse(xmlHttp.responseText).result, true); + } catch (e) { + throw Error('[SUNEDITOR.fileBrowser.drawList.fail] cause : "' + e.message + '"'); + } finally { + this.plugins.fileBrowser.closeBrowserLoading(); + this.context.fileBrowser.body.style.maxHeight = (this._w.innerHeight - this.context.fileBrowser.header.offsetHeight - 50) + 'px'; + } + } else { // exception + this.plugins.fileBrowser.closeBrowserLoading(); + if (xmlHttp.status !== 0) { + const res = !xmlHttp.responseText ? xmlHttp : JSON.parse(xmlHttp.responseText); + const err = '[SUNEDITOR.fileBrowser.get.serverException] status: ' + xmlHttp.status + ', response: ' + (res.errorMessage || xmlHttp.responseText); + throw Error(err); + } + } + } + }, + + _drawListItem: function (items, update) { + const fileBrowserContext = this.context.fileBrowser; + const pluginContext = this.context[fileBrowserContext.contextPlugin]; + + const _tags = []; + const len = items.length; + const columnSize = pluginContext.columnSize || fileBrowserContext.columnSize; + const splitSize = columnSize <= 1 ? 1 : (Math.round(len/columnSize) || 1); + const drawItemHandler = pluginContext.itemTemplateHandler; + + let tagsHTML = ''; + let listHTML = '
'; + let columns = 1; + for (let i = 0, item, tags; i < len; i++) { + item = items[i]; + tags = !item.tag ? [] : typeof item.tag === 'string' ? item.tag.split(',') : item.tag; + tags = item.tag = tags.map(function (v) { return v.trim(); }); + listHTML += drawItemHandler(item); + + if ((i + 1) % splitSize === 0 && columns < columnSize && (i + 1) < len) { + columns++; + listHTML += '
'; + } + + if (update && tags.length > 0) { + for (let t = 0, tLen = tags.length, tag; t < tLen; t++) { + tag = tags[t]; + if (tag && _tags.indexOf(tag) === -1) { + _tags.push(tag); + tagsHTML += '' + tag + ''; + } + } + } + } + listHTML += '
'; + + fileBrowserContext.list.innerHTML = listHTML; + + if (update) { + fileBrowserContext.items = items; + fileBrowserContext.tagArea.innerHTML = tagsHTML; + fileBrowserContext.tagElements = fileBrowserContext.tagArea.querySelectorAll('A'); + } + }, + + onClickTag: function (e) { + const target = e.target; + if (!this.util.isAnchor(target)) return; + + const tagName = target.textContent; + const fileBrowserPlugin = this.plugins.fileBrowser; + const fileBrowserContext = this.context.fileBrowser; + + const selectTag = fileBrowserContext.tagArea.querySelector('a[title="' + tagName + '"]'); + const selectedTags = fileBrowserContext.selectedTags; + const sTagIndex = selectedTags.indexOf(tagName); + + if (sTagIndex > -1){ + selectedTags.splice(sTagIndex, 1); + this.util.removeClass(selectTag, 'on'); + } else { + selectedTags.push(tagName); + this.util.addClass(selectTag, 'on'); + } + + fileBrowserPlugin._drawListItem.call(this, + selectedTags.length === 0 ? + fileBrowserContext.items : + fileBrowserContext.items.filter(function (item) { + return item.tag.some(function (tag) { + return selectedTags.indexOf(tag) > -1; + }); + }), false); + }, + + onClickFile: function (e) { + e.preventDefault(); + e.stopPropagation(); + + const fileBrowserContext = this.context.fileBrowser; + const listEl = fileBrowserContext.list; + let target = e.target; + let command = null; + + if (target === listEl) return; + + while (listEl !== target.parentNode) { + command = target.getAttribute('data-command'); + if (command) break; + target = target.parentNode; + } + + if (!command) return; + + const handler = (fileBrowserContext.selectorHandler || this.context[fileBrowserContext.contextPlugin].selectorHandler); + this.plugins.fileBrowser.close.call(this); + handler(target); + } + }; + + if (typeof noGlobal === typeof undefined) { + if (!window.SUNEDITOR_MODULES) { + Object.defineProperty(window, 'SUNEDITOR_MODULES', { + enumerable: true, + writable: false, + configurable: false, + value: {} + }); + } + + Object.defineProperty(window.SUNEDITOR_MODULES, 'fileBrowser', { + enumerable: true, + writable: false, + configurable: false, + value: fileBrowser + }); + } + + return fileBrowser; +})); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/modules/fileManager.js": +/*!*******************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/modules/fileManager.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +(function (global, factory) { + if ( true && typeof module.exports === 'object') { + module.exports = global.document ? + factory(global, true) : + function (w) { + if (!w.document) { + throw new Error('SUNEDITOR_MODULES a window with a document'); + } + return factory(w); + }; + } else { + factory(global); + } +}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) { + const fileManager = { + name: 'fileManager', + _xmlHttp: null, + + _checkMediaComponent: function (tag) { + if (/IMG/i.test(tag)) { + return !/FIGURE/i.test(tag.parentElement.nodeName) || !/FIGURE/i.test(tag.parentElement.parentElement.nodeName); + } else if (/VIDEO/i.test(tag)) { + return !/FIGURE/i.test(tag.parentElement.nodeName); + } + return true; + }, + + /** + * @description Upload the file to the server. + * @param {String} uploadUrl Upload server url + * @param {Object|null} uploadHeader Request header + * @param {FormData} formData FormData in body + * @param {Function|null} callBack Success call back function + * @param {Function|null} errorCallBack Error call back function + * @example this.plugins.fileManager.upload.call(this, imageUploadUrl, this.options.imageUploadHeader, formData, this.plugins.image.callBack_imgUpload.bind(this, info), this.functions.onImageUploadError); + */ + upload: function (uploadUrl, uploadHeader, formData, callBack, errorCallBack) { + this.showLoading(); + const filePlugin = this.plugins.fileManager; + const xmlHttp = filePlugin._xmlHttp = this.util.getXMLHttpRequest(); + + xmlHttp.onreadystatechange = filePlugin._callBackUpload.bind(this, xmlHttp, callBack, errorCallBack); + xmlHttp.open('post', uploadUrl, true); + if(uploadHeader !== null && typeof uploadHeader === 'object' && this._w.Object.keys(uploadHeader).length > 0){ + for(let key in uploadHeader){ + xmlHttp.setRequestHeader(key, uploadHeader[key]); + } + } + xmlHttp.send(formData); + }, + + _callBackUpload: function (xmlHttp, callBack, errorCallBack) { + if (xmlHttp.readyState === 4) { + if (xmlHttp.status === 200) { + try { + callBack(xmlHttp); + } catch (e) { + throw Error('[SUNEDITOR.fileManager.upload.callBack.fail] cause : "' + e.message + '"'); + } finally { + this.closeLoading(); + } + } else { // exception + this.closeLoading(); + const res = !xmlHttp.responseText ? xmlHttp : JSON.parse(xmlHttp.responseText); + if (typeof errorCallBack !== 'function' || errorCallBack('', res, this)) { + const err = '[SUNEDITOR.fileManager.upload.serverException] status: ' + xmlHttp.status + ', response: ' + (res.errorMessage || xmlHttp.responseText); + this.functions.noticeOpen(err); + throw Error(err); + } + } + } + }, + + /** + * @description Checke the file's information and modify the tag that does not fit the format. + * @param {String} pluginName Plugin name + * @param {Array} tagNames Tag array to check + * @param {Function|null} uploadEventHandler Event handler to process updated file info after checking (used in "setInfo") + * @param {Function} modifyHandler A function to modify a tag that does not fit the format (Argument value: Tag element) + * @param {Boolean} resizing True if the plugin is using a resizing module + * @example + * const modifyHandler = function (tag) { + * imagePlugin.onModifyMode.call(this, tag, null); + * imagePlugin.openModify.call(this, true); + * imagePlugin.update_image.call(this, true, false, true); + * }.bind(this); + * this.plugins.fileManager.checkInfo.call(this, 'image', ['img'], this.functions.onImageUpload, modifyHandler, true); + */ + checkInfo: function (pluginName, tagNames, uploadEventHandler, modifyHandler, resizing) { + let tags = []; + for (let i = 0, len = tagNames.length; i < len; i++) { + tags = tags.concat([].slice.call(this.context.element.wysiwyg.getElementsByTagName(tagNames[i]))); + } + + const fileManagerPlugin = this.plugins.fileManager; + const context = this.context[pluginName]; + const infoList = context._infoList; + const setFileInfo = fileManagerPlugin.setInfo.bind(this); + + if (tags.length === infoList.length) { + // reset + if (this._componentsInfoReset) { + for (let i = 0, len = tags.length; i < len; i++) { + setFileInfo(pluginName, tags[i], uploadEventHandler, null, resizing); + } + return ; + } else { + let infoUpdate = false; + for (let i = 0, len = infoList.length, info; i < len; i++) { + info = infoList[i]; + if (tags.filter(function (t) { return info.src === t.src && info.index.toString() === t.getAttribute('data-index'); }).length === 0) { + infoUpdate = true; + break; + } + } + // pass + if (!infoUpdate) return; + } + } + + // check + const _resize_plugin = resizing ? this.context.resizing._resize_plugin : ''; + if (resizing) this.context.resizing._resize_plugin = pluginName; + const currentTags = []; + const infoIndex = []; + for (let i = 0, len = infoList.length; i < len; i++) { + infoIndex[i] = infoList[i].index; + } + + for (let i = 0, len = tags.length, tag; i < len; i++) { + tag = tags[i]; + if (!this.util.getParentElement(tag, this.util.isMediaComponent) || !fileManagerPlugin._checkMediaComponent(tag)) { + currentTags.push(context._infoIndex); + modifyHandler(tag); + } else if (!tag.getAttribute('data-index') || infoIndex.indexOf(tag.getAttribute('data-index') * 1) < 0) { + currentTags.push(context._infoIndex); + tag.removeAttribute('data-index'); + setFileInfo(pluginName, tag, uploadEventHandler, null, resizing); + } else { + currentTags.push(tag.getAttribute('data-index') * 1); + } + } + + for (let i = 0, dataIndex; i < infoList.length; i++) { + dataIndex = infoList[i].index; + if (currentTags.indexOf(dataIndex) > -1) continue; + + infoList.splice(i, 1); + if (typeof uploadEventHandler === 'function') uploadEventHandler(null, dataIndex, 'delete', null, 0, this); + i--; + } + + if (resizing) this.context.resizing._resize_plugin = _resize_plugin; + }, + + /** + * @description Create info object of file and add it to "_infoList" (this.context[pluginName]._infoList[]) + * @param {String} pluginName Plugin name + * @param {Element} element + * @param {Function|null} uploadEventHandler Event handler to process updated file info (created in setInfo) + * @param {Object|null} file + * @param {Boolean} resizing True if the plugin is using a resizing module + * @example + * uploadCallBack {.. file = { name: fileList[i].name, size: fileList[i].size }; + * this.plugins.fileManager.setInfo.call(this, 'image', oImg, this.functions.onImageUpload, file, true); + */ + setInfo: function (pluginName, element, uploadEventHandler, file, resizing) { + const _resize_plugin = resizing ? this.context.resizing._resize_plugin : ''; + if (resizing) this.context.resizing._resize_plugin = pluginName; + + const plguin = this.plugins[pluginName]; + const context = this.context[pluginName]; + const infoList = context._infoList; + let dataIndex = element.getAttribute('data-index'); + let info = null; + let state = ''; + + if (!file) { + file = { + 'name': element.getAttribute('data-file-name') || (typeof element.src === 'string' ? element.src.split('/').pop() : ''), + 'size': element.getAttribute('data-file-size') || 0 + }; + } + + // create + if (!dataIndex || this._componentsInfoInit) { + state = 'create'; + dataIndex = context._infoIndex++; + + element.setAttribute('data-index', dataIndex); + element.setAttribute('data-file-name', file.name); + element.setAttribute('data-file-size', file.size); + + info = { + src: element.src, + index: dataIndex * 1, + name: file.name, + size: file.size + }; + + infoList.push(info); + } else { // update + state = 'update'; + dataIndex *= 1; + + for (let i = 0, len = infoList.length; i < len; i++) { + if (dataIndex === infoList[i].index) { + info = infoList[i]; + break; + } + } + + if (!info) { + dataIndex = context._infoIndex++; + info = { index: dataIndex }; + infoList.push(info); + } + + info.src = element.src; + info.name = element.getAttribute("data-file-name"); + info.size = element.getAttribute("data-file-size") * 1; + } + + // method bind + info.element = element; + info.delete = plguin.destroy.bind(this, element); + info.select = function (element) { + element.scrollIntoView(true); + this._w.setTimeout(plguin.select.bind(this, element)); + }.bind(this, element); + + if (resizing) { + if (!element.getAttribute('origin-size') && element.naturalWidth) { + element.setAttribute('origin-size', element.naturalWidth + ',' + element.naturalHeight); + } + + if (!element.getAttribute('data-origin')) { + const container = this.util.getParentElement(element, this.util.isMediaComponent); + const cover = this.util.getParentElement(element, 'FIGURE'); + + const w = this.plugins.resizing._module_getSizeX.call(this, context, element, cover, container); + const h = this.plugins.resizing._module_getSizeY.call(this, context, element, cover, container); + element.setAttribute('data-origin', w + ',' + h); + element.setAttribute('data-size', w + ',' + h); + } + + if (!element.style.width) { + const size = (element.getAttribute('data-size') || element.getAttribute('data-origin') || '').split(','); + plguin.onModifyMode.call(this, element, null); + plguin.applySize.call(this, size[0], size[1]); + } + + this.context.resizing._resize_plugin = _resize_plugin; + } + + if (typeof uploadEventHandler === 'function') uploadEventHandler(element, dataIndex, state, info, --context._uploadFileLength < 0 ? 0 : context._uploadFileLength, this); + }, + + /** + * @description Delete info object at "_infoList" + * @param {String} pluginName Plugin name + * @param {Number} index index of info object (this.context[pluginName]._infoList[].index) + * @param {Function|null} uploadEventHandler Event handler to process updated file info (created in setInfo) + */ + deleteInfo: function (pluginName, index, uploadEventHandler) { + if (index >= 0) { + const infoList = this.context[pluginName]._infoList; + + for (let i = 0, len = infoList.length; i < len; i++) { + if (index === infoList[i].index) { + infoList.splice(i, 1); + if (typeof uploadEventHandler === 'function') uploadEventHandler(null, index, 'delete', null, 0, this); + return; + } + } + } + }, + + /** + * @description Reset info object and "_infoList = []", "_infoIndex = 0" + * @param {String} pluginName Plugin name + * @param {Function|null} uploadEventHandler Event handler to process updated file info (created in setInfo) + */ + resetInfo: function (pluginName, uploadEventHandler) { + const context = this.context[pluginName]; + + if (typeof uploadEventHandler === 'function') { + const infoList = context._infoList; + for (let i = 0, len = infoList.length; i < len; i++) { + uploadEventHandler(null, infoList[i].index, 'delete', null, 0, this); + } + } + + context._infoList = []; + context._infoIndex = 0; + } + }; + + if (typeof noGlobal === typeof undefined) { + if (!window.SUNEDITOR_MODULES) { + Object.defineProperty(window, 'SUNEDITOR_MODULES', { + enumerable: true, + writable: false, + configurable: false, + value: {} + }); + } + + Object.defineProperty(window.SUNEDITOR_MODULES, 'fileManager', { + enumerable: true, + writable: false, + configurable: false, + value: fileManager + }); + } + + return fileManager; +})); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/modules/resizing.js": +/*!****************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/modules/resizing.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +(function (global, factory) { + if ( true && typeof module.exports === 'object') { + module.exports = global.document ? + factory(global, true) : + function (w) { + if (!w.document) { + throw new Error('SUNEDITOR_MODULES a window with a document'); + } + return factory(w); + }; + } else { + factory(global); + } +}(typeof window !== 'undefined' ? window : this, function (window, noGlobal) { + const resizing = { + name: 'resizing', + /** + * @description Constructor + * Require context properties when resizing module + inputX: Element, + inputY: Element, + _container: null, + _cover: null, + _element: null, + _element_w: 1, + _element_h: 1, + _element_l: 0, + _element_t: 0, + _defaultSizeX: 'auto', + _defaultSizeY: 'auto', + _origin_w: core.options.imageWidth === 'auto' ? '' : core.options.imageWidth, + _origin_h: core.options.imageHeight === 'auto' ? '' : core.options.imageHeight, + _proportionChecked: true, + // -- select function -- + _resizing: core.options.imageResizing, + _resizeDotHide: !core.options.imageHeightShow, + _rotation: core.options.imageRotation, + _onlyPercentage: core.options.imageSizeOnlyPercentage, + _ratio: false, + _ratioX: 1, + _ratioY: 1 + _captionShow: true, + // -- when used caption (_captionShow: true) -- + _caption: null, + _captionChecked: false, + captionCheckEl: null, + * @param {Object} core Core object + */ + add: function (core) { + const icons = core.icons; + const context = core.context; + context.resizing = { + _resizeClientX: 0, + _resizeClientY: 0, + _resize_plugin: '', + _resize_w: 0, + _resize_h: 0, + _origin_w: 0, + _origin_h: 0, + _rotateVertical: false, + _resize_direction: '', + _move_path: null, + _isChange: false, + alignIcons: { + basic: icons.align_justify, + left: icons.align_left, + right: icons.align_right, + center: icons.align_center + } + }; + + /** resize controller, button */ + let resize_div_container = this.setController_resize(core); + context.resizing.resizeContainer = resize_div_container; + + context.resizing.resizeDiv = resize_div_container.querySelector('.se-modal-resize'); + context.resizing.resizeDot = resize_div_container.querySelector('.se-resize-dot'); + context.resizing.resizeDisplay = resize_div_container.querySelector('.se-resize-display'); + + let resize_button = this.setController_button(core); + context.resizing.resizeButton = resize_button; + + let resize_handles = context.resizing.resizeHandles = context.resizing.resizeDot.querySelectorAll('span'); + context.resizing.resizeButtonGroup = resize_button.querySelector('._se_resizing_btn_group'); + context.resizing.rotationButtons = resize_button.querySelectorAll('._se_resizing_btn_group ._se_rotation'); + context.resizing.percentageButtons = resize_button.querySelectorAll('._se_resizing_btn_group ._se_percentage'); + + context.resizing.alignMenu = resize_button.querySelector('.se-resizing-align-list'); + context.resizing.alignMenuList = context.resizing.alignMenu.querySelectorAll('button'); + + context.resizing.alignButton = resize_button.querySelector('._se_resizing_align_button'); + context.resizing.autoSizeButton = resize_button.querySelector('._se_resizing_btn_group ._se_auto_size'); + context.resizing.captionButton = resize_button.querySelector('._se_resizing_caption_button'); + + /** add event listeners */ + resize_div_container.addEventListener('mousedown', function (e) { e.preventDefault(); }); + resize_handles[0].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core)); + resize_handles[1].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core)); + resize_handles[2].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core)); + resize_handles[3].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core)); + resize_handles[4].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core)); + resize_handles[5].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core)); + resize_handles[6].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core)); + resize_handles[7].addEventListener('mousedown', this.onMouseDown_resize_handle.bind(core)); + resize_button.addEventListener('click', this.onClick_resizeButton.bind(core)); + + /** append html */ + context.element.relative.appendChild(resize_div_container); + context.element.relative.appendChild(resize_button); + + /** empty memory */ + resize_div_container = null, resize_button = null, resize_handles = null; + }, + + /** resize controller, button (image, iframe, video) */ + setController_resize: function (core) { + const resize_container = core.util.createElement('DIV'); + + resize_container.className = 'se-controller se-resizing-container'; + resize_container.style.display = 'none'; + resize_container.innerHTML = '' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '
'; + + return resize_container; + }, + + setController_button: function (core) { + const lang = core.lang; + const icons = core.icons; + const resize_button = core.util.createElement("DIV"); + + resize_button.className = "se-controller se-controller-resizing"; + resize_button.innerHTML = '' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '
' + + '' + + '' + + '' + + '
' + + '
' + + '
    ' + + '
  • ' + + '
  • ' + + '
  • ' + + '
  • ' + + '
' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '
'; + + return resize_button; + }, + + /** + * @description Gets the width size + * @param {Object} contextPlugin context object of plugin (core.context[plugin]) + * @param {Element} element Target element + * @param {Element} cover Cover element (FIGURE) + * @param {Element} container Container element (DIV.se-component) + * @returns {String} + */ + _module_getSizeX: function (contextPlugin, element, cover, container) { + if (!element) element = contextPlugin._element; + if (!cover) cover = contextPlugin._cover; + if (!container) container = contextPlugin._container; + + if (!element) return ''; + + return !/%$/.test(element.style.width) ? element.style.width : ((container && this.util.getNumber(container.style.width, 2)) || 100) + '%'; + }, + + /** + * @description Gets the height size + * @param {Object} contextPlugin context object of plugin (core.context[plugin]) + * @param {Element} element Target element + * @param {Element} cover Cover element (FIGURE) + * @param {Element} container Container element (DIV.se-component) + * @returns {String} + */ + _module_getSizeY: function (contextPlugin, element, cover, container) { + if (!element) element = contextPlugin._element; + if (!cover) cover = contextPlugin._cover; + if (!container) container = contextPlugin._container; + + if (!container || !cover) return (element && element.style.height) || ''; + + return this.util.getNumber(cover.style.paddingBottom, 0) > 0 && !this.context.resizing._rotateVertical ? cover.style.height : (!/%$/.test(element.style.height) || !/%$/.test(element.style.width) ? element.style.height : ((container && this.util.getNumber(container.style.height, 2)) || 100) + '%'); + }, + + /** + * @description Called at the "openModify" to put the size of the current target into the size input element. + * @param {Object} contextPlugin context object of plugin (core.context[plugin]) + * @param {Object} pluginObj Plugin object + */ + _module_setModifyInputSize: function (contextPlugin, pluginObj) { + const percentageRotation = contextPlugin._onlyPercentage && this.context.resizing._rotateVertical; + contextPlugin.proportion.checked = contextPlugin._proportionChecked = contextPlugin._element.getAttribute('data-proportion') !== 'false'; + + let x = percentageRotation ? '' : this.plugins.resizing._module_getSizeX.call(this, contextPlugin); + if (x === contextPlugin._defaultSizeX) x = ''; + if (contextPlugin._onlyPercentage) x = this.util.getNumber(x, 2); + contextPlugin.inputX.value = x; + pluginObj.setInputSize.call(this, 'x'); + + if (!contextPlugin._onlyPercentage) { + let y = percentageRotation ? '' : this.plugins.resizing._module_getSizeY.call(this, contextPlugin); + if (y === contextPlugin._defaultSizeY) y = ''; + if (contextPlugin._onlyPercentage) y = this.util.getNumber(y, 2); + contextPlugin.inputY.value = y; + } + + contextPlugin.inputX.disabled = percentageRotation ? true : false; + contextPlugin.inputY.disabled = percentageRotation ? true : false; + contextPlugin.proportion.disabled = percentageRotation ? true : false; + + pluginObj.setRatio.call(this); + }, + + /** + * @description It is called in "setInputSize" (input tag keyupEvent), + * checks the value entered in the input tag, + * calculates the ratio, and sets the calculated value in the input tag of the opposite size. + * @param {Object} contextPlugin context object of plugin (core.context[plugin]) + * @param {String} xy 'x': width, 'y': height + */ + _module_setInputSize: function (contextPlugin, xy) { + if (contextPlugin._onlyPercentage) { + if (xy === 'x' && contextPlugin.inputX.value > 100) contextPlugin.inputX.value = 100; + return; + } + + if (contextPlugin.proportion.checked && contextPlugin._ratio && /\d/.test(contextPlugin.inputX.value) && /\d/.test(contextPlugin.inputY.value)) { + const xUnit = contextPlugin.inputX.value.replace(/\d+|\./g, '') || contextPlugin.sizeUnit; + const yUnit = contextPlugin.inputY.value.replace(/\d+|\./g, '') || contextPlugin.sizeUnit; + + if (xUnit !== yUnit) return; + + const dec = xUnit === '%' ? 2 : 0; + + if (xy === 'x') { + contextPlugin.inputY.value = this.util.getNumber(contextPlugin._ratioY * this.util.getNumber(contextPlugin.inputX.value, dec), dec) + yUnit; + } else { + contextPlugin.inputX.value = this.util.getNumber(contextPlugin._ratioX * this.util.getNumber(contextPlugin.inputY.value, dec), dec) + xUnit; + } + } + }, + + /** + * @description It is called in "setRatio" (input and proportionCheck tags changeEvent), + * checks the value of the input tag, calculates the ratio, and resets it in the input tag. + * @param {Object} contextPlugin context object of plugin (core.context[plugin]) + */ + _module_setRatio: function (contextPlugin) { + const xValue = contextPlugin.inputX.value; + const yValue = contextPlugin.inputY.value; + + if (contextPlugin.proportion.checked && /\d+/.test(xValue) && /\d+/.test(yValue)) { + const xUnit = xValue.replace(/\d+|\./g, '') || contextPlugin.sizeUnit; + const yUnit = yValue.replace(/\d+|\./g, '') || contextPlugin.sizeUnit; + + if (xUnit !== yUnit) { + contextPlugin._ratio = false; + } else if (!contextPlugin._ratio) { + const x = this.util.getNumber(xValue, 0); + const y = this.util.getNumber(yValue, 0); + + contextPlugin._ratio = true; + contextPlugin._ratioX = x / y; + contextPlugin._ratioY = y / x; + } + } else { + contextPlugin._ratio = false; + } + }, + + /** + * @description Revert size of element to origin size (plugin._origin_w, plugin._origin_h) + * @param {Object} contextPlugin context object of plugin (core.context[plugin]) + */ + _module_sizeRevert: function (contextPlugin) { + if (contextPlugin._onlyPercentage) { + contextPlugin.inputX.value = contextPlugin._origin_w > 100 ? 100 : contextPlugin._origin_w; + } else { + contextPlugin.inputX.value = contextPlugin._origin_w; + contextPlugin.inputY.value = contextPlugin._origin_h; + } + }, + + /** + * @description Save the size data (element.setAttribute("data-size")) + * Used at the "setSize" method + * @param {Object} contextPlugin context object of plugin (core.context[plugin]) + */ + _module_saveCurrentSize: function (contextPlugin) { + const x = this.plugins.resizing._module_getSizeX.call(this, contextPlugin); + const y = this.plugins.resizing._module_getSizeY.call(this, contextPlugin); + contextPlugin._element.setAttribute('data-size', x + ',' + y); + if (!!contextPlugin._videoRatio) contextPlugin._videoRatio = y; + }, + + /** + * @description Call the resizing module + * @param {Element} targetElement Resizing target element + * @param {string} plugin Plugin name + * @returns {Object} Size of resizing div {w, h, t, l} + */ + call_controller_resize: function (targetElement, plugin) { + const contextResizing = this.context.resizing; + const contextPlugin = this.context[plugin]; + contextResizing._resize_plugin = plugin; + + const resizeContainer = contextResizing.resizeContainer; + const resizeDiv = contextResizing.resizeDiv; + const offset = this.util.getOffset(targetElement, this.context.element.wysiwygFrame); + + const isVertical = contextResizing._rotateVertical = /^(90|270)$/.test(Math.abs(targetElement.getAttribute('data-rotate')).toString()); + + const w = isVertical ? targetElement.offsetHeight : targetElement.offsetWidth; + const h = isVertical ? targetElement.offsetWidth : targetElement.offsetHeight; + const t = offset.top; + const l = offset.left - this.context.element.wysiwygFrame.scrollLeft; + + resizeContainer.style.top = t + 'px'; + resizeContainer.style.left = l + 'px'; + resizeContainer.style.width = w + 'px'; + resizeContainer.style.height = h + 'px'; + + resizeDiv.style.top = '0px'; + resizeDiv.style.left = '0px'; + resizeDiv.style.width = w + 'px'; + resizeDiv.style.height = h + 'px'; + + let align = targetElement.getAttribute('data-align') || 'basic'; + align = align === 'none' ? 'basic' : align; + + // text + const container = this.util.getParentElement(targetElement, this.util.isComponent); + const cover = this.util.getParentElement(targetElement, 'FIGURE'); + const displayX = this.plugins.resizing._module_getSizeX.call(this, contextPlugin, targetElement, cover, container) || 'auto'; + const displayY = contextPlugin._onlyPercentage && plugin === 'image' ? '' : ', ' + (this.plugins.resizing._module_getSizeY.call(this, contextPlugin, targetElement, cover, container) || 'auto'); + this.util.changeTxt(contextResizing.resizeDisplay, this.lang.dialogBox[align] + ' (' + displayX + displayY + ')'); + + // resizing display + contextResizing.resizeButtonGroup.style.display = contextPlugin._resizing ? '' : 'none'; + const resizeDotShow = contextPlugin._resizing && !contextPlugin._resizeDotHide && !contextPlugin._onlyPercentage ? 'flex' : 'none'; + const resizeHandles = contextResizing.resizeHandles; + for (let i = 0, len = resizeHandles.length; i < len; i++) { + resizeHandles[i].style.display = resizeDotShow; + } + + if (contextPlugin._resizing) { + const rotations = contextResizing.rotationButtons; + rotations[0].style.display = rotations[1].style.display = contextPlugin._rotation ? '' : 'none'; + } + + // align icon + const alignList = contextResizing.alignMenuList; + this.util.changeElement(contextResizing.alignButton.firstElementChild, contextResizing.alignIcons[align]); + for (let i = 0, len = alignList.length; i < len; i++) { + if (alignList[i].getAttribute('data-value') === align) this.util.addClass(alignList[i], 'on'); + else this.util.removeClass(alignList[i], 'on'); + } + + // percentage active + const pButtons = contextResizing.percentageButtons; + const value = /%$/.test(targetElement.style.width) && /%$/.test(container.style.width) ? (this.util.getNumber(container.style.width, 0) / 100) + '' : '' ; + for (let i = 0, len = pButtons.length; i < len; i++) { + if (pButtons[i].getAttribute('data-value') === value) { + this.util.addClass(pButtons[i], 'active'); + } else { + this.util.removeClass(pButtons[i], 'active'); + } + } + + // caption display, active + if (!contextPlugin._captionShow) { + contextResizing.captionButton.style.display = 'none'; + } else { + contextResizing.captionButton.style.display = ''; + if (this.util.getChildElement(targetElement.parentNode, 'figcaption')) { + this.util.addClass(contextResizing.captionButton, 'active'); + contextPlugin._captionChecked = true; + } else { + this.util.removeClass(contextResizing.captionButton, 'active'); + contextPlugin._captionChecked = false; + } + } + + resizeContainer.style.display = 'block'; + + const addOffset = {left: 0, top: 50}; + if (this.options.iframe) { + addOffset.left -= this.context.element.wysiwygFrame.parentElement.offsetLeft; + addOffset.top -= this.context.element.wysiwygFrame.parentElement.offsetTop; + } + + this.setControllerPosition(contextResizing.resizeButton, resizeContainer, 'bottom', addOffset); + this.controllersOn(resizeContainer, contextResizing.resizeButton, this.util.setDisabledButtons.bind(this, false, this.resizingDisabledButtons), targetElement, plugin); + this.util.setDisabledButtons(true, this.resizingDisabledButtons); + + contextResizing._resize_w = w; + contextResizing._resize_h = h; + + const originSize = (targetElement.getAttribute('origin-size') || '').split(','); + contextResizing._origin_w = originSize[0] || targetElement.naturalWidth; + contextResizing._origin_h = originSize[1] || targetElement.naturalHeight; + + return { + w: w, + h: h, + t: t, + l: l + }; + }, + + _closeAlignMenu: null, + + /** + * @description Open align submenu of module + */ + openAlignMenu: function () { + const alignButton = this.context.resizing.alignButton; + this.util.addClass(alignButton, 'on'); + this.context.resizing.alignMenu.style.top = (alignButton.offsetTop + alignButton.offsetHeight) + 'px'; + this.context.resizing.alignMenu.style.left = (alignButton.offsetLeft - alignButton.offsetWidth / 2) + 'px'; + this.context.resizing.alignMenu.style.display = 'block'; + + this.plugins.resizing._closeAlignMenu = function () { + this.util.removeClass(this.context.resizing.alignButton, 'on'); + this.context.resizing.alignMenu.style.display = 'none'; + this.removeDocEvent('click', this.plugins.resizing._closeAlignMenu); + this.plugins.resizing._closeAlignMenu = null; + }.bind(this); + + this.addDocEvent('click', this.plugins.resizing._closeAlignMenu); + }, + + /** + * @description Click event of resizing toolbar + * Performs the action of the clicked toolbar button. + * @param {MouseEvent} e Event object + */ + onClick_resizeButton: function (e) { + e.stopPropagation(); + + const target = e.target; + const command = target.getAttribute('data-command') || target.parentNode.getAttribute('data-command'); + + if (!command) return; + + const value = target.getAttribute('data-value') || target.parentNode.getAttribute('data-value'); + + const pluginName = this.context.resizing._resize_plugin; + const currentContext = this.context[pluginName]; + const contextEl = currentContext._element; + const currentModule = this.plugins[pluginName]; + + e.preventDefault(); + + if (typeof this.plugins.resizing._closeAlignMenu === 'function') { + this.plugins.resizing._closeAlignMenu(); + if (command === 'onalign') return; + } + + switch (command) { + case 'auto': + this.plugins.resizing.resetTransform.call(this, contextEl); + currentModule.setAutoSize.call(this); + this.selectComponent(contextEl, pluginName); + break; + case 'percent': + let percentY = this.plugins.resizing._module_getSizeY.call(this, currentContext); + if (this.context.resizing._rotateVertical) { + const percentage = contextEl.getAttribute('data-percentage'); + if (percentage) percentY = percentage.split(',')[1]; + } + + this.plugins.resizing.resetTransform.call(this, contextEl); + currentModule.setPercentSize.call(this, (value * 100), (this.util.getNumber(percentY, 0) === null || !/%$/.test(percentY)) ? '' : percentY); + this.selectComponent(contextEl, pluginName); + break; + case 'mirror': + const r = contextEl.getAttribute('data-rotate') || '0'; + let x = contextEl.getAttribute('data-rotateX') || ''; + let y = contextEl.getAttribute('data-rotateY') || ''; + + if ((value === 'h' && !this.context.resizing._rotateVertical) || (value === 'v' && this.context.resizing._rotateVertical)) { + y = y ? '' : '180'; + } else { + x = x ? '' : '180'; + } + + contextEl.setAttribute('data-rotateX', x); + contextEl.setAttribute('data-rotateY', y); + + this.plugins.resizing._setTransForm(contextEl, r, x, y); + break; + case 'rotate': + const contextResizing = this.context.resizing; + const slope = (contextEl.getAttribute('data-rotate') * 1) + (value * 1); + const deg = this._w.Math.abs(slope) >= 360 ? 0 : slope; + + contextEl.setAttribute('data-rotate', deg); + contextResizing._rotateVertical = /^(90|270)$/.test(this._w.Math.abs(deg).toString()); + this.plugins.resizing.setTransformSize.call(this, contextEl, null, null); + + this.selectComponent(contextEl, pluginName); + break; + case 'onalign': + this.plugins.resizing.openAlignMenu.call(this); + return; + case 'align': + const alignValue = value === 'basic' ? 'none' : value; + currentModule.setAlign.call(this, alignValue, null, null, null); + this.selectComponent(contextEl, pluginName); + break; + case 'caption': + const caption = !currentContext._captionChecked; + currentModule.openModify.call(this, true); + currentContext._captionChecked = currentContext.captionCheckEl.checked = caption; + + currentModule.update_image.call(this, false, false, false); + + if (caption) { + const captionText = this.util.getChildElement(currentContext._caption, function (current) { + return current.nodeType === 3; + }); + + if (!captionText) { + currentContext._caption.focus(); + } else { + this.setRange(captionText, 0, captionText, captionText.textContent.length); + } + + this.controllersOff(); + } else { + this.selectComponent(contextEl, pluginName); + currentModule.openModify.call(this, true); + } + + break; + case 'revert': + currentModule.setOriginSize.call(this); + this.selectComponent(contextEl, pluginName); + break; + case 'update': + currentModule.openModify.call(this); + this.controllersOff(); + break; + case 'delete': + currentModule.destroy.call(this); + break; + } + + // history stack + this.history.push(false); + }, + + /** + * @description Initialize the transform style (rotation) of the element. + * @param {Element} element Target element + */ + resetTransform: function (element) { + const size = (element.getAttribute('data-size') || element.getAttribute('data-origin') || '').split(','); + this.context.resizing._rotateVertical = false; + + element.style.maxWidth = ''; + element.style.transform = ''; + element.style.transformOrigin = ''; + element.setAttribute('data-rotate', ''); + element.setAttribute('data-rotateX', ''); + element.setAttribute('data-rotateY', ''); + + this.plugins[this.context.resizing._resize_plugin].setSize.call(this, size[0] ? size[0] : 'auto', size[1] ? size[1] : '', true); + }, + + /** + * @description Set the transform style (rotation) of the element. + * @param {Element} element Target element + * @param {Number|null} width Element's width size + * @param {Number|null} height Element's height size + */ + setTransformSize: function (element, width, height) { + let percentage = element.getAttribute('data-percentage'); + const isVertical = this.context.resizing._rotateVertical; + const deg = element.getAttribute('data-rotate') * 1; + let transOrigin = ''; + + if (percentage && !isVertical) { + percentage = percentage.split(','); + if (percentage[0] === 'auto' && percentage[1] === 'auto') { + this.plugins[this.context.resizing._resize_plugin].setAutoSize.call(this); + } else { + this.plugins[this.context.resizing._resize_plugin].setPercentSize.call(this, percentage[0], percentage[1]); + } + } else { + const cover = this.util.getParentElement(element, 'FIGURE'); + + const offsetW = width || element.offsetWidth; + const offsetH = height || element.offsetHeight; + const w = (isVertical ? offsetH : offsetW) + 'px'; + const h = (isVertical ? offsetW : offsetH) + 'px'; + + this.plugins[this.context.resizing._resize_plugin].cancelPercentAttr.call(this); + this.plugins[this.context.resizing._resize_plugin].setSize.call(this, offsetW + 'px', offsetH + 'px', true); + + cover.style.width = w; + cover.style.height = (!!this.context[this.context.resizing._resize_plugin]._caption ? '' : h); + + if (isVertical) { + let transW = (offsetW/2) + 'px ' + (offsetW/2) + 'px 0'; + let transH = (offsetH/2) + 'px ' + (offsetH/2) + 'px 0'; + transOrigin = deg === 90 || deg === -270 ? transH : transW; + } + } + + element.style.transformOrigin = transOrigin; + this.plugins.resizing._setTransForm(element, deg.toString(), element.getAttribute('data-rotateX') || '', element.getAttribute('data-rotateY') || ''); + + if (isVertical) element.style.maxWidth = 'none'; + else element.style.maxWidth = ''; + + this.plugins.resizing.setCaptionPosition.call(this, element); + }, + + _setTransForm: function (element, r, x, y) { + let width = (element.offsetWidth - element.offsetHeight) * (/-/.test(r) ? 1 : -1); + let translate = ''; + + if (/[1-9]/.test(r) && (x || y)) { + translate = x ? 'Y' : 'X'; + + switch (r) { + case '90': + translate = x && y ? 'X' : y ? translate : ''; + break; + case '270': + width *= -1; + translate = x && y ? 'Y' : x ? translate : ''; + break; + case '-90': + translate = x && y ? 'Y' : x ? translate : ''; + break; + case '-270': + width *= -1; + translate = x && y ? 'X' : y ? translate : ''; + break; + default: + translate = ''; + } + } + + if (r % 180 === 0) { + element.style.maxWidth = ''; + } + + element.style.transform = 'rotate(' + r + 'deg)' + (x ? ' rotateX(' + x + 'deg)' : '') + (y ? ' rotateY(' + y + 'deg)' : '') + (translate ? ' translate' + translate + '(' + width + 'px)' : ''); + }, + + /** + * @description The position of the caption is set automatically. + * @param {Element} element Target element (not caption element) + */ + setCaptionPosition: function (element) { + const figcaption = this.util.getChildElement(this.util.getParentElement(element, 'FIGURE'), 'FIGCAPTION'); + if (figcaption) { + figcaption.style.marginTop = (this.context.resizing._rotateVertical ? element.offsetWidth - element.offsetHeight : 0) + 'px'; + } + }, + + /** + * @description Mouse down event of resize handles + * @param {MouseEvent} e Event object + */ + onMouseDown_resize_handle: function (e) { + e.stopPropagation(); + e.preventDefault(); + + const contextResizing = this.context.resizing; + const direction = contextResizing._resize_direction = e.target.classList[0]; + + contextResizing._resizeClientX = e.clientX; + contextResizing._resizeClientY = e.clientY; + this.context.element.resizeBackground.style.display = 'block'; + contextResizing.resizeButton.style.display = 'none'; + contextResizing.resizeDiv.style.float = /l/.test(direction) ? 'right' : /r/.test(direction) ? 'left' : 'none'; + + const closureFunc_bind = function closureFunc(e) { + if (e.type === 'keydown' && e.keyCode !== 27) return; + + const change = contextResizing._isChange; + contextResizing._isChange = false; + + this.removeDocEvent('mousemove', resizing_element_bind); + this.removeDocEvent('mouseup', closureFunc_bind); + this.removeDocEvent('keydown', closureFunc_bind); + + if (e.type === 'keydown') { + this.controllersOff(); + this.context.element.resizeBackground.style.display = 'none'; + this.plugins[this.context.resizing._resize_plugin].init.call(this); + } else { + // element resize + this.plugins.resizing.cancel_controller_resize.call(this, direction); + // history stack + if (change) this.history.push(false); + } + }.bind(this); + + const resizing_element_bind = this.plugins.resizing.resizing_element.bind(this, contextResizing, direction, this.context[contextResizing._resize_plugin]); + this.addDocEvent('mousemove', resizing_element_bind); + this.addDocEvent('mouseup', closureFunc_bind); + this.addDocEvent('keydown', closureFunc_bind); + }, + + /** + * @description Mouse move event after call "onMouseDown_resize_handle" of resize handles + * The size of the module's "div" is adjusted according to the mouse move event. + * @param {Object} contextResizing "core.context.resizing" object (binding argument) + * @param {String} direction Direction ("tl", "tr", "bl", "br", "lw", "th", "rw", "bh") (binding argument) + * @param {Object} plugin "core.context[currentPlugin]" object (binding argument) + * @param {MouseEvent} e Event object + */ + resizing_element: function (contextResizing, direction, plugin, e) { + const clientX = e.clientX; + const clientY = e.clientY; + + let resultW = plugin._element_w; + let resultH = plugin._element_h; + + const w = plugin._element_w + (/r/.test(direction) ? clientX - contextResizing._resizeClientX : contextResizing._resizeClientX - clientX); + const h = plugin._element_h + (/b/.test(direction) ? clientY - contextResizing._resizeClientY : contextResizing._resizeClientY - clientY); + const wh = ((plugin._element_h / plugin._element_w) * w); + + if (/t/.test(direction)) contextResizing.resizeDiv.style.top = (plugin._element_h - (/h/.test(direction) ? h : wh)) + 'px'; + if (/l/.test(direction)) contextResizing.resizeDiv.style.left = (plugin._element_w - w) + 'px'; + + if (/r|l/.test(direction)) { + contextResizing.resizeDiv.style.width = w + 'px'; + resultW = w; + } + + if (/^(t|b)[^h]$/.test(direction)) { + contextResizing.resizeDiv.style.height = wh + 'px'; + resultH = wh; + } + else if (/^(t|b)h$/.test(direction)) { + contextResizing.resizeDiv.style.height = h + 'px'; + resultH = h; + } + + contextResizing._resize_w = resultW; + contextResizing._resize_h = resultH; + this.util.changeTxt(contextResizing.resizeDisplay, this._w.Math.round(resultW) + ' x ' + this._w.Math.round(resultH)); + contextResizing._isChange = true; + }, + + /** + * @description Resize the element to the size of the "div" adjusted in the "resizing_element" method. + * Called at the mouse-up event registered in "onMouseDown_resize_handle". + * @param {String} direction Direction ("tl", "tr", "bl", "br", "lw", "th", "rw", "bh") + */ + cancel_controller_resize: function (direction) { + const isVertical = this.context.resizing._rotateVertical; + this.controllersOff(); + this.context.element.resizeBackground.style.display = 'none'; + + let w = this._w.Math.round(isVertical ? this.context.resizing._resize_h : this.context.resizing._resize_w); + let h = this._w.Math.round(isVertical ? this.context.resizing._resize_w : this.context.resizing._resize_h); + + if (!isVertical && !/%$/.test(w)) { + const padding = 16; + const limit = this.context.element.wysiwygFrame.clientWidth - (padding * 2) - 2; + + if (this.util.getNumber(w, 0) > limit) { + h = this._w.Math.round((h / w) * limit); + w = limit; + } + } + + const pluginName = this.context.resizing._resize_plugin; + this.plugins[pluginName].setSize.call(this, w, h, false, direction); + if (isVertical) this.plugins.resizing.setTransformSize.call(this, this.context[this.context.resizing._resize_plugin]._element, w, h); + + this.selectComponent(this.context[pluginName]._element, pluginName); + } + }; + + if (typeof noGlobal === typeof undefined) { + if (!window.SUNEDITOR_MODULES) { + Object.defineProperty(window, 'SUNEDITOR_MODULES', { + enumerable: true, + writable: false, + configurable: false, + value: {} + }); + } + + Object.defineProperty(window.SUNEDITOR_MODULES, 'resizing', { + enumerable: true, + writable: false, + configurable: false, + value: resizing + }); + } + + return resizing; +})); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/align.js": +/*!*************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/align.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'align', + display: 'submenu', + add: function (core, targetElement) { + const icons = core.icons; + const context = core.context; + context.align = { + targetButton: targetElement, + _alignList: null, + currentAlign: '', + defaultDir: core.options.rtl ? 'right' : 'left', + icons: { + justify: icons.align_justify, + left: icons.align_left, + right: icons.align_right, + center: icons.align_center + } + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + let listUl = listDiv.querySelector('ul'); + + /** add event listeners */ + listUl.addEventListener('click', this.pickup.bind(core)); + context.align._alignList = listUl.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null, listUl = null; + }, + + setSubmenu: function (core) { + const lang = core.lang; + const icons = core.icons; + const listDiv = core.util.createElement('DIV'); + const leftDir = core.context.align.defaultDir === 'left'; + + const leftMenu = '
  • ' + + '' + + '
  • '; + + const rightMenu = '
  • ' + + '' + + '
  • '; + + listDiv.className = 'se-submenu se-list-layer se-list-align'; + listDiv.innerHTML = '' + + '
    ' + + '
      ' + + (leftDir ? leftMenu : rightMenu) + + '
    • ' + + '' + + '
    • ' + + (leftDir? rightMenu : leftMenu) + + '
    • ' + + '' + + '
    • ' + + '
    ' + + '
    '; + + return listDiv; + }, + + /** + * @Override core + */ + active: function (element) { + const alignContext = this.context.align; + const targetButton = alignContext.targetButton; + const target = targetButton.firstElementChild; + + if (!element) { + this.util.changeElement(target, alignContext.icons[alignContext.defaultDir]); + targetButton.removeAttribute('data-focus'); + } else if (this.util.isFormatElement(element)) { + const textAlign = element.style.textAlign; + if (textAlign) { + this.util.changeElement(target, alignContext.icons[textAlign] || alignContext.icons[alignContext.defaultDir]); + targetButton.setAttribute('data-focus', textAlign); + return true; + } + } + + return false; + }, + + /** + * @Override submenu + */ + on: function () { + const alignContext = this.context.align; + const alignList = alignContext._alignList; + const currentAlign = alignContext.targetButton.getAttribute('data-focus') || alignContext.defaultDir; + + if (currentAlign !== alignContext.currentAlign) { + for (let i = 0, len = alignList.length; i < len; i++) { + if (currentAlign === alignList[i].getAttribute('data-value')) { + this.util.addClass(alignList[i], 'active'); + } else { + this.util.removeClass(alignList[i], 'active'); + } + } + + alignContext.currentAlign = currentAlign; + } + }, + + pickup: function (e) { + e.preventDefault(); + e.stopPropagation(); + + let target = e.target; + let value = null; + + while (!value && !/UL/i.test(target.tagName)) { + value = target.getAttribute('data-value'); + target = target.parentNode; + } + + if (!value) return; + + const defaultDir = this.context.align.defaultDir; + const selectedFormsts = this.getSelectedElements(); + for (let i = 0, len = selectedFormsts.length; i < len; i++) { + this.util.setStyle(selectedFormsts[i], 'textAlign', (value === defaultDir ? '' : value)); + } + + this.effectNode = null; + this.submenuOff(); + this.focus(); + + // history stack + this.history.push(false); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/font.js": +/*!************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/font.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'font', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + context.font = { + targetText: targetElement.querySelector('.txt'), + targetTooltip: targetElement.parentNode.querySelector('.se-tooltip-text'), + _fontList: null, + currentFont: '' + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + + /** add event listeners */ + listDiv.querySelector('.se-list-inner').addEventListener('click', this.pickup.bind(core)); + + context.font._fontList = listDiv.querySelectorAll('ul li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null; + }, + + setSubmenu: function (core) { + const option = core.options; + const lang = core.lang; + const listDiv = core.util.createElement('DIV'); + + listDiv.className = 'se-submenu se-list-layer se-list-font-family'; + + let font, text, i, len; + let fontList = !option.font ? + [ + 'Arial', + 'Comic Sans MS', + 'Courier New', + 'Impact', + 'Georgia', + 'tahoma', + 'Trebuchet MS', + 'Verdana' + ] : option.font; + + let list = '
    ' + + '
      ' + + '
    • '; + for (i = 0, len = fontList.length; i < len; i++) { + font = fontList[i]; + text = font.split(',')[0]; + list += '
    • '; + } + list += '
    '; + listDiv.innerHTML = list; + + return listDiv; + }, + + /** + * @Override core + */ + active: function (element) { + const target = this.context.font.targetText; + const tooltip = this.context.font.targetTooltip; + + if (!element) { + const font = this.lang.toolbar.font; + this.util.changeTxt(target, font); + this.util.changeTxt(tooltip, font); + } else if (element.style && element.style.fontFamily.length > 0) { + const selectFont = element.style.fontFamily.replace(/["']/g,''); + this.util.changeTxt(target, selectFont); + this.util.changeTxt(tooltip, selectFont); + return true; + } + + return false; + }, + + /** + * @Override submenu + */ + on: function () { + const fontContext = this.context.font; + const fontList = fontContext._fontList; + const currentFont = fontContext.targetText.textContent; + + if (currentFont !== fontContext.currentFont) { + for (let i = 0, len = fontList.length; i < len; i++) { + if (currentFont === fontList[i].getAttribute('data-value')) { + this.util.addClass(fontList[i], 'active'); + } else { + this.util.removeClass(fontList[i], 'active'); + } + } + + fontContext.currentFont = currentFont; + } + }, + + pickup: function (e) { + if (!/^BUTTON$/i.test(e.target.tagName)) return false; + + e.preventDefault(); + e.stopPropagation(); + + const value = e.target.getAttribute('data-value'); + + if (value) { + const newNode = this.util.createElement('SPAN'); + newNode.style.fontFamily = value; + this.nodeChange(newNode, ['font-family'], null, null); + } else { + this.nodeChange(null, ['font-family'], ['span'], true); + } + + this.submenuOff(); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/fontColor.js": +/*!*****************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/fontColor.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_colorPicker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/_colorPicker */ "./node_modules/suneditor/src/plugins/modules/_colorPicker.js"); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'fontColor', + display: 'submenu', + add: function (core, targetElement) { + core.addModule([_modules_colorPicker__WEBPACK_IMPORTED_MODULE_0__["default"]]); + + const context = core.context; + context.fontColor = { + previewEl: null, + colorInput: null, + colorList: null + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + context.fontColor.colorInput = listDiv.querySelector('._se_color_picker_input'); + + /** add event listeners */ + context.fontColor.colorInput.addEventListener('keyup', this.onChangeInput.bind(core)); + listDiv.querySelector('._se_color_picker_submit').addEventListener('click', this.submit.bind(core)); + listDiv.querySelector('._se_color_picker_remove').addEventListener('click', this.remove.bind(core)); + listDiv.addEventListener('click', this.pickup.bind(core)); + context.fontColor.colorList = listDiv.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null; + }, + + setSubmenu: function (core) { + const colorArea = core.context.colorPicker.colorListHTML; + const listDiv = core.util.createElement('DIV'); + + listDiv.className = 'se-submenu se-list-layer'; + listDiv.innerHTML = colorArea; + + return listDiv; + }, + + /** + * @Override submenu + */ + on: function () { + const contextPicker = this.context.colorPicker; + const contextFontColor = this.context.fontColor; + + contextPicker._colorInput = contextFontColor.colorInput; + contextPicker._defaultColor = '#333333'; + contextPicker._styleProperty = 'color'; + contextPicker._colorList = contextFontColor.colorList; + + this.plugins.colorPicker.init.call(this, this.getSelectionNode(), null); + }, + + /** + * @Override _colorPicker + */ + onChangeInput: function (e) { + this.plugins.colorPicker.setCurrentColor.call(this, e.target.value); + }, + + submit: function () { + this.plugins.fontColor.applyColor.call(this, this.context.colorPicker._currentColor); + }, + + pickup: function (e) { + e.preventDefault(); + e.stopPropagation(); + + this.plugins.fontColor.applyColor.call(this, e.target.getAttribute('data-value')); + }, + + remove: function () { + this.nodeChange(null, ['color'], ['span'], true); + this.submenuOff(); + }, + + applyColor: function (color) { + if (!color) return; + + const newNode = this.util.createElement('SPAN'); + newNode.style.color = color; + this.nodeChange(newNode, ['color'], null, null); + + this.submenuOff(); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/fontSize.js": +/*!****************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/fontSize.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'fontSize', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + context.fontSize = { + targetText: targetElement.querySelector('.txt'), + _sizeList: null, + currentSize: '' + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + let listUl = listDiv.querySelector('ul'); + + /** add event listeners */ + listUl.addEventListener('click', this.pickup.bind(core)); + context.fontSize._sizeList = listUl.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null, listUl = null; + }, + + setSubmenu: function (core) { + const option = core.options; + const lang = core.lang; + const listDiv = core.util.createElement('DIV'); + + listDiv.className = 'se-submenu se-list-layer se-list-font-size'; + + const sizeList = !option.fontSize ? [8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72] : option.fontSize; + + let list = '
    ' + + '
      ' + + '
    • '; + for (let i = 0, unit = option.fontSizeUnit, len = sizeList.length, size; i < len; i++) { + size = sizeList[i]; + list += '
    • '; + } + list += '
    '; + + listDiv.innerHTML = list; + + return listDiv; + }, + + /** + * @Override core + */ + active: function (element) { + if (!element) { + this.util.changeTxt(this.context.fontSize.targetText, this.lang.toolbar.fontSize); + } else if (element.style && element.style.fontSize.length > 0) { + this.util.changeTxt(this.context.fontSize.targetText, element.style.fontSize); + return true; + } + + return false; + }, + + /** + * @Override submenu + */ + on: function () { + const fontSizeContext = this.context.fontSize; + const sizeList = fontSizeContext._sizeList; + const currentSize = fontSizeContext.targetText.textContent; + + if (currentSize !== fontSizeContext.currentSize) { + for (let i = 0, len = sizeList.length; i < len; i++) { + if (currentSize === sizeList[i].getAttribute('data-value')) { + this.util.addClass(sizeList[i], 'active'); + } else { + this.util.removeClass(sizeList[i], 'active'); + } + } + + fontSizeContext.currentSize = currentSize; + } + }, + + pickup: function (e) { + if (!/^BUTTON$/i.test(e.target.tagName)) return false; + + e.preventDefault(); + e.stopPropagation(); + + const value = e.target.getAttribute('data-value'); + + if (value) { + const newNode = this.util.createElement('SPAN'); + newNode.style.fontSize = value; + this.nodeChange(newNode, ['font-size'], null, null); + } else { + this.nodeChange(null, ['font-size'], ['span'], true); + } + + this.submenuOff(); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/formatBlock.js": +/*!*******************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/formatBlock.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'formatBlock', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + context.formatBlock = { + targetText: targetElement.querySelector('.txt'), + targetTooltip: targetElement.parentNode.querySelector('.se-tooltip-text'), + _formatList: null, + currentFormat: '' + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + + /** add event listeners */ + listDiv.querySelector('ul').addEventListener('click', this.pickUp.bind(core)); + context.formatBlock._formatList = listDiv.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null; + }, + + setSubmenu: function (core) { + const option = core.options; + const lang_toolbar = core.lang.toolbar; + const listDiv = core.util.createElement('DIV'); + listDiv.className = 'se-submenu se-list-layer se-list-format'; + + const defaultFormats = ['p', 'div', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + const formatList = !option.formats || option.formats.length === 0 ? defaultFormats : option.formats; + + let list = '
      '; + for (let i = 0, len = formatList.length, format, tagName, command, name, h, attrs, className; i < len; i++) { + format = formatList[i]; + + if (typeof format === 'string' && defaultFormats.indexOf(format) > -1) { + tagName = format.toLowerCase(); + command = tagName === 'blockquote' ? 'range' : tagName === 'pre' ? 'free' : 'replace'; + h = /^h/.test(tagName) ? tagName.match(/\d+/)[0] : ''; + name = lang_toolbar['tag_' + (h ? 'h' : tagName)] + h; + className = ''; + attrs = ''; + } else { + tagName = format.tag.toLowerCase(); + command = format.command; + name = format.name || tagName; + className = format.class; + attrs = className ? ' class="' + className + '"' : ''; + } + + list += '
    • ' + + '
    • '; + } + list += '
    '; + + listDiv.innerHTML = list; + + return listDiv; + }, + + /** + * @Override core + */ + active: function (element) { + let formatTitle = this.lang.toolbar.formats; + const target = this.context.formatBlock.targetText; + const tooltip = this.context.formatBlock.targetTooltip; + + if (!element) { + this.util.changeTxt(target, formatTitle); + this.util.changeTxt(tooltip, formatTitle); + } else if (this.util.isFormatElement(element)) { + const formatContext = this.context.formatBlock; + const formatList = formatContext._formatList; + const nodeName = element.nodeName.toLowerCase(); + const className = (element.className.match(/(\s|^)__se__format__[^\s]+/) || [''])[0].trim(); + + for (let i = 0, len = formatList.length, f; i < len; i++) { + f = formatList[i]; + if (nodeName === f.getAttribute('data-value') && className === f.getAttribute('data-class')) { + formatTitle = f.title; + break; + } + } + + this.util.changeTxt(target, formatTitle); + this.util.changeTxt(tooltip, formatTitle); + target.setAttribute('data-value', nodeName); + target.setAttribute('data-class', className); + + return true; + } + + return false; + }, + + /** + * @Override submenu + */ + on: function () { + const formatContext = this.context.formatBlock; + const formatList = formatContext._formatList; + const target = formatContext.targetText; + const currentFormat = (target.getAttribute('data-value') || '') + (target.getAttribute('data-class') || ''); + + if (currentFormat !== formatContext.currentFormat) { + for (let i = 0, len = formatList.length, f; i < len; i++) { + f = formatList[i]; + if (currentFormat === f.getAttribute('data-value') + f.getAttribute('data-class')) { + this.util.addClass(f, 'active'); + } else { + this.util.removeClass(f, 'active'); + } + } + + formatContext.currentFormat = currentFormat; + } + }, + + pickUp: function (e) { + e.preventDefault(); + e.stopPropagation(); + + let target = e.target; + let command = null, value = null, tag = null, className = ''; + + while (!command && !/UL/i.test(target.tagName)) { + command = target.getAttribute('data-command'); + value = target.getAttribute('data-value'); + className = target.getAttribute('data-class'); + if (command) { + tag = target.firstChild; + break; + } + target = target.parentNode; + } + + if (!command) return; + + // blockquote + if (command === 'range') { + const rangeElement = tag.cloneNode(false); + this.applyRangeFormatElement(rangeElement); + } + // free, replace + else { + let range = this.getRange(); + let selectedFormsts = this.getSelectedElementsAndComponents(false); + + if (selectedFormsts.length === 0) { + range = this.getRange_addLine(range, null); + selectedFormsts = this.getSelectedElementsAndComponents(false); + if (selectedFormsts.length === 0) return; + } + + const startOffset = range.startOffset; + const endOffset = range.endOffset; + + const util = this.util; + let first = selectedFormsts[0]; + let last = selectedFormsts[selectedFormsts.length - 1]; + const firstPath = util.getNodePath(range.startContainer, first, null, null); + const lastPath = util.getNodePath(range.endContainer, last, null, null); + + // remove selected list + const rlist = this.detachList(selectedFormsts, false); + if (rlist.sc) first = rlist.sc; + if (rlist.ec) last = rlist.ec; + + // change format tag + this.setRange(util.getNodeFromPath(firstPath, first), startOffset, util.getNodeFromPath(lastPath, last), endOffset); + const modifiedFormsts = this.getSelectedElementsAndComponents(false); + + // free format + if (command === 'free') { + const len = modifiedFormsts.length - 1; + let parentNode = modifiedFormsts[len].parentNode; + let freeElement = tag.cloneNode(false); + const focusElement = freeElement; + + for (let i = len, f, html, before, next, inner, isComp, first = true; i >= 0; i--) { + f = modifiedFormsts[i]; + if (f === (!modifiedFormsts[i + 1] ? null : modifiedFormsts[i + 1].parentNode)) continue; + + isComp = util.isComponent(f); + html = isComp ? '' : f.innerHTML.replace(/(?!>)\s+(?=<)|\n/g, ' '); + before = util.getParentElement(f, function (current) { + return current.parentNode === parentNode; + }); + + if (parentNode !== f.parentNode || isComp) { + if (util.isFormatElement(parentNode)) { + parentNode.parentNode.insertBefore(freeElement, parentNode.nextSibling); + parentNode = parentNode.parentNode; + } else { + parentNode.insertBefore(freeElement, before ? before.nextSibling : null); + parentNode = f.parentNode; + } + + next = freeElement.nextSibling; + if (next && freeElement.nodeName === next.nodeName && util.isSameAttributes(freeElement, next)) { + freeElement.innerHTML += '
    ' + next.innerHTML; + util.removeItem(next); + } + + freeElement = tag.cloneNode(false); + first = true; + } + + inner = freeElement.innerHTML; + freeElement.innerHTML = ((first || !html || !inner || /
    $/i.test(html)) ? html : html + '
    ') + inner; + + if (i === 0) { + parentNode.insertBefore(freeElement, f); + next = f.nextSibling; + if (next && freeElement.nodeName === next.nodeName && util.isSameAttributes(freeElement, next)) { + freeElement.innerHTML += '
    ' + next.innerHTML; + util.removeItem(next); + } + + const prev = freeElement.previousSibling; + if (prev && freeElement.nodeName === prev.nodeName && util.isSameAttributes(freeElement, prev)) { + prev.innerHTML += '
    ' + freeElement.innerHTML; + util.removeItem(freeElement); + } + } + + if (!isComp) util.removeItem(f); + if (!!html) first = false; + } + + this.setRange(focusElement, 0, focusElement, 0); + } + // replace format + else { + for (let i = 0, len = modifiedFormsts.length, node, newFormat; i < len; i++) { + node = modifiedFormsts[i]; + + if ((node.nodeName.toLowerCase() !== value.toLowerCase() || (node.className.match(/(\s|^)__se__format__[^\s]+/) || [''])[0].trim() !== className) && !util.isComponent(node)) { + newFormat = tag.cloneNode(false); + util.copyFormatAttributes(newFormat, node); + newFormat.innerHTML = node.innerHTML; + + node.parentNode.replaceChild(newFormat, node); + } + + if (i === 0) first = newFormat || node; + if (i === len - 1) last = newFormat || node; + newFormat = null; + } + + this.setRange(util.getNodeFromPath(firstPath, first), startOffset, util.getNodeFromPath(lastPath, last), endOffset); + } + + // history stack + this.history.push(false); + } + + this.submenuOff(); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/hiliteColor.js": +/*!*******************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/hiliteColor.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _modules_colorPicker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/_colorPicker */ "./node_modules/suneditor/src/plugins/modules/_colorPicker.js"); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'hiliteColor', + display: 'submenu', + add: function (core, targetElement) { + core.addModule([_modules_colorPicker__WEBPACK_IMPORTED_MODULE_0__["default"]]); + + const context = core.context; + context.hiliteColor = { + previewEl: null, + colorInput: null, + colorList: null + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + context.hiliteColor.colorInput = listDiv.querySelector('._se_color_picker_input'); + + /** add event listeners */ + context.hiliteColor.colorInput.addEventListener('keyup', this.onChangeInput.bind(core)); + listDiv.querySelector('._se_color_picker_submit').addEventListener('click', this.submit.bind(core)); + listDiv.querySelector('._se_color_picker_remove').addEventListener('click', this.remove.bind(core)); + listDiv.addEventListener('click', this.pickup.bind(core)); + + context.hiliteColor.colorList = listDiv.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null; + }, + + setSubmenu: function (core) { + const colorArea = core.context.colorPicker.colorListHTML; + const listDiv = core.util.createElement('DIV'); + + listDiv.className = 'se-submenu se-list-layer'; + listDiv.innerHTML = colorArea; + + return listDiv; + }, + + /** + * @Override submenu + */ + on: function () { + const contextPicker = this.context.colorPicker; + const contextHiliteColor = this.context.hiliteColor; + + contextPicker._colorInput = contextHiliteColor.colorInput; + contextPicker._defaultColor = '#FFFFFF'; + contextPicker._styleProperty = 'backgroundColor'; + contextPicker._colorList = contextHiliteColor.colorList; + + this.plugins.colorPicker.init.call(this, this.getSelectionNode(), null); + }, + + /** + * @Override _colorPicker + */ + onChangeInput: function (e) { + this.plugins.colorPicker.setCurrentColor.call(this, e.target.value); + }, + + submit: function () { + this.plugins.hiliteColor.applyColor.call(this, this.context.colorPicker._currentColor); + }, + + pickup: function (e) { + e.preventDefault(); + e.stopPropagation(); + + this.plugins.hiliteColor.applyColor.call(this, e.target.getAttribute('data-value')); + }, + + remove: function () { + this.nodeChange(null, ['background-color'], ['span'], true); + this.submenuOff(); + }, + + applyColor: function (color) { + if (!color) return; + + const newNode = this.util.createElement('SPAN'); + newNode.style.backgroundColor = color; + this.nodeChange(newNode, ['background-color'], null, null); + + this.submenuOff(); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/horizontalRule.js": +/*!**********************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/horizontalRule.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'horizontalRule', + display: 'submenu', + add: function (core, targetElement) { + /** set submenu */ + let listDiv = this.setSubmenu(core); + + /** add event listeners */ + listDiv.querySelector('ul').addEventListener('click', this.horizontalRulePick.bind(core)); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null; + }, + + setSubmenu: function (core) { + const lang = core.lang; + const listDiv = core.util.createElement('DIV'); + + listDiv.className = 'se-submenu se-list-layer se-list-line'; + listDiv.innerHTML = '' + + '
    ' + + '
      ' + + '
    • ' + + '' + + '
    • ' + + '
    • ' + + '' + + '
    • ' + + '
    • ' + + '' + + '
    • ' + + '
    ' + + '
    '; + + return listDiv; + }, + + appendHr: function (className) { + const oHr = this.util.createElement('HR'); + oHr.className = className; + this.focus(); + return this.insertComponent(oHr, false, true, false); + }, + + horizontalRulePick: function (e) { + e.preventDefault(); + e.stopPropagation(); + + let target = e.target; + let value = null; + + while (!value && !/UL/i.test(target.tagName)) { + value = target.getAttribute('data-value'); + target = target.parentNode; + } + + if (!value) return; + + const oNode = this.plugins.horizontalRule.appendHr.call(this, '__se__' + value); + if (oNode) { + this.setRange(oNode, 0, oNode, 0); + this.submenuOff(); + } + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/lineHeight.js": +/*!******************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/lineHeight.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 20197 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'lineHeight', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + context.lineHeight = { + _sizeList: null, + currentSize: -1 + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + let listUl = listDiv.querySelector('ul'); + + /** add event listeners */ + listUl.addEventListener('click', this.pickup.bind(core)); + + context.lineHeight._sizeList = listUl.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null, listUl = null; + }, + + setSubmenu: function (core) { + const option = core.options; + const lang = core.lang; + const listDiv = core.util.createElement('DIV'); + + listDiv.className = 'se-submenu se-list-layer'; + + const sizeList = !option.lineHeights ? [ + {text: '1', value: 1}, + {text: '1.15', value: 1.15}, + {text: '1.5', value: 1.5}, + {text: '2', value: 2} + ] : option.lineHeights; + + let list = '
    ' + + '
      ' + + '
    • '; + for (let i = 0, len = sizeList.length, text, size; i < len; i++) { + size = sizeList[i]; + list += '
    • '; + } + list += '
    '; + + listDiv.innerHTML = list; + + return listDiv; + }, + + /** + * @Override submenu + */ + on: function () { + const lineHeightContext = this.context.lineHeight; + const sizeList = lineHeightContext._sizeList; + const format = this.util.getFormatElement(this.getSelectionNode()); + const currentSize = !format ? '' : format.style.lineHeight + ''; + + if (currentSize !== lineHeightContext.currentSize) { + for (let i = 0, len = sizeList.length; i < len; i++) { + if (currentSize === sizeList[i].getAttribute('data-value')) { + this.util.addClass(sizeList[i], 'active'); + } else { + this.util.removeClass(sizeList[i], 'active'); + } + } + + lineHeightContext.currentSize = currentSize; + } + }, + + pickup: function (e) { + if (!/^BUTTON$/i.test(e.target.tagName)) return false; + + e.preventDefault(); + e.stopPropagation(); + + const value = e.target.getAttribute('data-value') || ''; + const formats = this.getSelectedElements(); + + for (let i = 0, len = formats.length; i < len; i++) { + formats[i].style.lineHeight = value; + } + + this.submenuOff(); + + // history stack + this.history.push(false); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/list.js": +/*!************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/list.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'list', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + context.list = { + targetButton: targetElement, + _list: null, + currentList: '', + icons: { + bullets: core.icons.list_bullets, + number: core.icons.list_number + } + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + let listUl = listDiv.querySelector('ul'); + + /** add event listeners */ + listUl.addEventListener('click', this.pickup.bind(core)); + context.list._list = listUl.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null, listUl = null; + }, + + setSubmenu: function (core) { + const lang = core.lang; + const listDiv = core.util.createElement('DIV'); + + listDiv.className = 'se-submenu se-list-layer'; + listDiv.innerHTML = '' + + '
    ' + + '
      ' + + '
    • ' + + '
    • ' + + '
    ' + + '
    '; + + return listDiv; + }, + + /** + * @Override core + */ + active: function (element) { + const button = this.context.list.targetButton; + const icon = button.firstElementChild; + const util = this.util; + + if (!element) { + button.removeAttribute('data-focus'); + util.changeElement(icon, this.context.list.icons.number); + util.removeClass(button, 'active'); + } else if (util.isList(element)) { + const nodeName = element.nodeName; + button.setAttribute('data-focus', nodeName); + util.addClass(button, 'active'); + if (/UL/i.test(nodeName)) { + util.changeElement(icon, this.context.list.icons.bullets); + } else { + util.changeElement(icon, this.context.list.icons.number); + } + + return true; + } + + return false; + }, + + /** + * @Override submenu + */ + on: function () { + const listContext = this.context.list; + const list = listContext._list; + const currentList = listContext.targetButton.getAttribute('data-focus') || ''; + + if (currentList !== listContext.currentList) { + for (let i = 0, len = list.length; i < len; i++) { + if (currentList === list[i].getAttribute('data-command')) { + this.util.addClass(list[i], 'active'); + } else { + this.util.removeClass(list[i], 'active'); + } + } + + listContext.currentList = currentList; + } + }, + + editList: function (command, selectedCells, detach) { + let range = this.getRange(); + let selectedFormats = !selectedCells ? this.getSelectedElementsAndComponents(false) : selectedCells; + + if (selectedFormats.length === 0) { + if (selectedCells) return; + range = this.getRange_addLine(range, null); + selectedFormats = this.getSelectedElementsAndComponents(false); + if (selectedFormats.length === 0) return; + } + + const util = this.util; + util.sortByDepth(selectedFormats, true); + + // merge + let firstSel = selectedFormats[0]; + let lastSel = selectedFormats[selectedFormats.length - 1]; + let topEl = (util.isListCell(firstSel) || util.isComponent(firstSel)) && !firstSel.previousElementSibling ? firstSel.parentNode.previousElementSibling : firstSel.previousElementSibling; + let bottomEl = (util.isListCell(lastSel) || util.isComponent(lastSel)) && !lastSel.nextElementSibling ? lastSel.parentNode.nextElementSibling : lastSel.nextElementSibling; + + const originRange = { + sc: range.startContainer, + so: range.startOffset, + ec: range.endContainer, + eo: range.endOffset + }; + + let isRemove = true; + + for (let i = 0, len = selectedFormats.length; i < len; i++) { + if (!util.isList(util.getRangeFormatElement(selectedFormats[i], function (current) { + return this.getRangeFormatElement(current) && current !== selectedFormats[i]; + }.bind(util)))) { + isRemove = false; + break; + } + } + + if (isRemove && (!topEl || (firstSel.tagName !== topEl.tagName || command !== topEl.tagName.toUpperCase())) && (!bottomEl || (lastSel.tagName !== bottomEl.tagName || command !== bottomEl.tagName.toUpperCase()))) { + if (detach) { + for (let i = 0, len = selectedFormats.length; i < len; i++) { + for (let j = i - 1; j >= 0; j--) { + if (selectedFormats[j].contains(selectedFormats[i])) { + selectedFormats.splice(i, 1); + i--; len--; + break; + } + } + } + } + + const currentFormat = util.getRangeFormatElement(firstSel); + const cancel = currentFormat && currentFormat.tagName === command; + let rangeArr, tempList; + const passComponent = function (current) { + return !this.isComponent(current); + }.bind(util); + + if (!cancel) tempList = util.createElement(command); + + for (let i = 0, len = selectedFormats.length, r, o; i < len; i++) { + o = util.getRangeFormatElement(selectedFormats[i], passComponent); + if (!o || !util.isList(o)) continue; + + if (!r) { + r = o; + rangeArr = {r: r, f: [util.getParentElement(selectedFormats[i], 'LI')]}; + } else { + if (r !== o) { + if (detach && util.isListCell(o.parentNode)) { + this.plugins.list._detachNested.call(this, rangeArr.f); + } else { + this.detachRangeFormatElement(rangeArr.f[0].parentNode, rangeArr.f, tempList, false, true); + } + + o = selectedFormats[i].parentNode; + if (!cancel) tempList = util.createElement(command); + + r = o; + rangeArr = {r: r, f: [util.getParentElement(selectedFormats[i], 'LI')]}; + } else { + rangeArr.f.push(util.getParentElement(selectedFormats[i], 'LI')); + } + } + + if (i === len - 1) { + if (detach && util.isListCell(o.parentNode)) { + this.plugins.list._detachNested.call(this, rangeArr.f); + } else { + this.detachRangeFormatElement(rangeArr.f[0].parentNode, rangeArr.f, tempList, false, true); + } + } + } + } else { + const topElParent = topEl ? topEl.parentNode : topEl; + const bottomElParent = bottomEl ? bottomEl.parentNode : bottomEl; + topEl = topElParent && !util.isWysiwygDiv(topElParent) && topElParent.nodeName === command ? topElParent : topEl; + bottomEl = bottomElParent && !util.isWysiwygDiv(bottomElParent) && bottomElParent.nodeName === command ? bottomElParent : bottomEl; + + const mergeTop = topEl && topEl.tagName === command; + const mergeBottom = bottomEl && bottomEl.tagName === command; + + let list = mergeTop ? topEl : util.createElement(command); + let firstList = null; + let lastList = null; + let topNumber = null; + let bottomNumber = null; + + const passComponent = function (current) { + return !this.isComponent(current) && !this.isList(current); + }.bind(util); + + for (let i = 0, len = selectedFormats.length, newCell, fTag, isCell, next, originParent, nextParent, parentTag, siblingTag, rangeTag; i < len; i++) { + fTag = selectedFormats[i]; + if (fTag.childNodes.length === 0 && !util._isIgnoreNodeChange(fTag)) { + util.removeItem(fTag); + continue; + } + next = selectedFormats[i + 1]; + originParent = fTag.parentNode; + nextParent = next ? next.parentNode : null; + isCell = util.isListCell(fTag); + rangeTag = util.isRangeFormatElement(originParent) ? originParent : null; + parentTag = isCell && !util.isWysiwygDiv(originParent) ? originParent.parentNode : originParent; + siblingTag = isCell && !util.isWysiwygDiv(originParent) ? (!next || util.isListCell(parentTag)) ? originParent : originParent.nextSibling : fTag.nextSibling; + + newCell = util.createElement('LI'); + util.copyFormatAttributes(newCell, fTag); + if (util.isComponent(fTag)) { + const isHR = /^HR$/i.test(fTag.nodeName); + if (!isHR) newCell.innerHTML = '
    '; + newCell.innerHTML += fTag.outerHTML; + if (isHR) newCell.innerHTML += '
    '; + } else { + const fChildren = fTag.childNodes; + while (fChildren[0]) { + newCell.appendChild(fChildren[0]); + } + } + list.appendChild(newCell); + + if (!next) lastList = list; + if (!next || parentTag !== nextParent || util.isRangeFormatElement(siblingTag)) { + if (!firstList) firstList = list; + if ((!mergeTop || !next || parentTag !== nextParent) && !(next && util.isList(nextParent) && nextParent === originParent)) { + if (list.parentNode !== parentTag) parentTag.insertBefore(list, siblingTag); + } + } + + util.removeItem(fTag); + if (mergeTop && topNumber === null) topNumber = list.children.length - 1; + if (next && (util.getRangeFormatElement(nextParent, passComponent) !== util.getRangeFormatElement(originParent, passComponent) || (util.isList(nextParent) && util.isList(originParent) && util.getElementDepth(nextParent) !== util.getElementDepth(originParent)))) { + list = util.createElement(command); + } + + if (rangeTag && rangeTag.children.length === 0) util.removeItem(rangeTag); + } + + if (topNumber) { + firstList = firstList.children[topNumber]; + } + + if (mergeBottom) { + bottomNumber = list.children.length - 1; + list.innerHTML += bottomEl.innerHTML; + lastList = list.children[bottomNumber]; + util.removeItem(bottomEl); + } + } + + this.effectNode = null; + return originRange; + }, + + _detachNested: function (cells) { + const first = cells[0]; + const last = cells[cells.length - 1]; + const next = last.nextElementSibling; + const originList = first.parentNode; + const sibling = originList.parentNode.nextElementSibling; + const parentNode = originList.parentNode.parentNode; + + for (let c = 0, cLen = cells.length; c < cLen; c++) { + parentNode.insertBefore(cells[c], sibling); + } + + if (next && originList.children.length > 0) { + const newList = originList.cloneNode(false); + const children = originList.childNodes; + const index = this.util.getPositionIndex(next); + while (children[index]) { + newList.appendChild(children[index]); + } + last.appendChild(newList); + } + + if (originList.children.length === 0) this.util.removeItem(originList); + this.util.mergeSameTags(parentNode); + + const edge = this.util.getEdgeChildNodes(first, last); + + return { + cc: first.parentNode, + sc: edge.sc, + ec: edge.ec + }; + }, + + editInsideList: function (remove, selectedCells) { + selectedCells = !selectedCells ? this.getSelectedElements().filter(function (el) { return this.isListCell(el); }.bind(this.util)) : selectedCells; + const cellsLen = selectedCells.length; + if (cellsLen === 0 || (!remove && (!this.util.isListCell(selectedCells[0].previousElementSibling) && !this.util.isListCell(selectedCells[cellsLen - 1].nextElementSibling)))) { + return { + sc: selectedCells[0], + so: 0, + ec: selectedCells[cellsLen - 1], + eo: 1 + }; + } + + let originList = selectedCells[0].parentNode; + let lastCell = selectedCells[cellsLen - 1]; + let range = null; + + if (remove) { + if (originList !== lastCell.parentNode && this.util.isList(lastCell.parentNode.parentNode) && lastCell.nextElementSibling) { + lastCell = lastCell.nextElementSibling; + while (lastCell) { + selectedCells.push(lastCell); + lastCell = lastCell.nextElementSibling; + } + } + range = this.plugins.list.editList.call(this, originList.nodeName.toUpperCase(), selectedCells, true); + } else { + let innerList = this.util.createElement(originList.nodeName); + let prev = selectedCells[0].previousElementSibling; + let next = lastCell.nextElementSibling; + const nodePath = { s: null, e: null, sl: originList, el: originList }; + + for (let i = 0, len = cellsLen, c; i < len; i++) { + c = selectedCells[i]; + if (c.parentNode !== originList) { + this.plugins.list._insiedList.call(this, originList, innerList, prev, next, nodePath); + originList = c.parentNode; + innerList = this.util.createElement(originList.nodeName); + } + + prev = c.previousElementSibling; + next = c.nextElementSibling; + innerList.appendChild(c); + } + + this.plugins.list._insiedList.call(this, originList, innerList, prev, next, nodePath); + + const sc = this.util.getNodeFromPath(nodePath.s, nodePath.sl); + const ec = this.util.getNodeFromPath(nodePath.e, nodePath.el); + range = { + sc: sc, + so: 0, + ec: ec, + eo: ec.textContent.length + }; + } + + return range; + }, + + _insiedList: function (originList, innerList, prev, next, nodePath) { + let insertPrev = false; + + if (prev && innerList.tagName === prev.tagName) { + const children = innerList.children; + while (children[0]) { + prev.appendChild(children[0]); + } + + innerList = prev; + insertPrev = true; + } + + if (next && innerList.tagName === next.tagName) { + const children = next.children; + while (children[0]) { + innerList.appendChild(children[0]); + } + + const temp = next.nextElementSibling; + next.parentNode.removeChild(next); + next = temp; + } + + if (!insertPrev) { + if (this.util.isListCell(prev)) { + originList = prev; + next = null; + } + + originList.insertBefore(innerList, next); + + if (!nodePath.s) { + nodePath.s = this.util.getNodePath(innerList.firstElementChild.firstChild, originList, null); + nodePath.sl = originList; + } + + const slPath = originList.contains(nodePath.sl) ? this.util.getNodePath(nodePath.sl, originList) : null; + nodePath.e = this.util.getNodePath(innerList.lastElementChild.firstChild, originList, null); + nodePath.el = originList; + + this.util.mergeSameTags(originList, [nodePath.s, nodePath.e, slPath], false); + this.util.mergeNestedTags(originList); + if (slPath) nodePath.sl = this.util.getNodeFromPath(slPath, originList); + } + + return innerList; + }, + + pickup: function (e) { + e.preventDefault(); + e.stopPropagation(); + + let target = e.target; + let command = ''; + + while (!command && !/^UL$/i.test(target.tagName)) { + command = target.getAttribute('data-command'); + target = target.parentNode; + } + + if (!command) return; + + const range = this.plugins.list.editList.call(this, command, null, false); + if (range) this.setRange(range.sc, range.so, range.ec, range.eo); + + this.submenuOff(); + + // history stack + this.history.push(false); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/paragraphStyle.js": +/*!**********************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/paragraphStyle.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'paragraphStyle', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + context.paragraphStyle = { + _classList: null + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + + /** add event listeners */ + listDiv.querySelector('ul').addEventListener('click', this.pickUp.bind(core)); + + context.paragraphStyle._classList = listDiv.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null; + }, + + setSubmenu: function (core) { + const option = core.options; + const listDiv = core.util.createElement('DIV'); + listDiv.className = 'se-submenu se-list-layer se-list-format'; + + const menuLang = core.lang.menu; + const defaultList = { + spaced: { + name: menuLang.spaced, + class: '__se__p-spaced', + _class: '' + }, + bordered: { + name: menuLang.bordered, + class: '__se__p-bordered', + _class: '' + }, + neon: { + name: menuLang.neon, + class: '__se__p-neon', + _class: '' + } + }; + const paragraphStyles = !option.paragraphStyles || option.paragraphStyles.length === 0 ? ['spaced', 'bordered', 'neon'] : option.paragraphStyles; + + let list = '
      '; + for (let i = 0, len = paragraphStyles.length, p, name, attrs, _class; i < len; i++) { + p = paragraphStyles[i]; + + if (typeof p === 'string') { + const defaultStyle = defaultList[p.toLowerCase()]; + if (!defaultStyle) continue; + p = defaultStyle; + } + + name = p.name; + attrs = p.class ? ' class="' + p.class + '"' : ''; + _class = p._class; + + list += '
    • ' + + '
    ' + + ''; + } + list += ''; + + listDiv.innerHTML = list; + + return listDiv; + }, + + /** + * @Override submenu + */ + on: function () { + const paragraphContext = this.context.paragraphStyle; + const paragraphList = paragraphContext._classList; + const currentFormat = this.util.getFormatElement(this.getSelectionNode()); + + for (let i = 0, len = paragraphList.length; i < len; i++) { + if (this.util.hasClass(currentFormat, paragraphList[i].getAttribute('data-value'))) { + this.util.addClass(paragraphList[i], 'active'); + } else { + this.util.removeClass(paragraphList[i], 'active'); + } + } + }, + + pickUp: function (e) { + e.preventDefault(); + e.stopPropagation(); + + let target = e.target; + let value = null; + + while (!/^UL$/i.test(target.tagName)) { + value = target.getAttribute('data-value'); + if (value) break; + target = target.parentNode; + } + + if (!value) return; + + let selectedFormsts = this.getSelectedElements(); + if (selectedFormsts.length === 0) { + this.getRange_addLine(this.getRange(), null); + selectedFormsts = this.getSelectedElements(); + if (selectedFormsts.length === 0) return; + } + + // change format class + const toggleClass = this.util.hasClass(target, 'active') ? this.util.removeClass.bind(this.util) : this.util.addClass.bind(this.util); + for (let i = 0, len = selectedFormsts.length; i < len; i++) { + toggleClass(selectedFormsts[i], value); + } + + this.submenuOff(); + + // history stack + this.history.push(false); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/table.js": +/*!*************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/table.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'table', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + let contextTable = context.table = { + _element: null, + _tdElement: null, + _trElement: null, + _trElements: null, + _tableXY: [], + _maxWidth: true, + _fixedColumn: false, + _rtl: core.options.rtl, + cellControllerTop: core.options.tableCellControllerPosition === 'top', + resizeText: null, + headerButton: null, + mergeButton: null, + splitButton: null, + splitMenu: null, + maxText: core.lang.controller.maxSize, + minText: core.lang.controller.minSize, + _physical_cellCnt: 0, + _logical_cellCnt: 0, + _rowCnt: 0, + _rowIndex: 0, + _physical_cellIndex: 0, + _logical_cellIndex: 0, + _current_colSpan: 0, + _current_rowSpan: 0, + icons: { + expansion: core.icons.expansion, + reduction: core.icons.reduction + } + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + let tablePicker = listDiv.querySelector('.se-controller-table-picker'); + + contextTable.tableHighlight = listDiv.querySelector('.se-table-size-highlighted'); + contextTable.tableUnHighlight = listDiv.querySelector('.se-table-size-unhighlighted'); + contextTable.tableDisplay = listDiv.querySelector('.se-table-size-display'); + if (core.options.rtl) contextTable.tableHighlight.style.left = (10 * 18 - 13) + 'px'; + + /** set table controller */ + let tableController = this.setController_table(core); + contextTable.tableController = tableController; + contextTable.resizeButton = tableController.querySelector('._se_table_resize'); + contextTable.resizeText = tableController.querySelector('._se_table_resize > span > span'); + contextTable.columnFixedButton = tableController.querySelector('._se_table_fixed_column'); + contextTable.headerButton = tableController.querySelector('._se_table_header'); + + /** set resizing */ + let resizeDiv = this.setController_tableEditor(core, contextTable.cellControllerTop); + contextTable.resizeDiv = resizeDiv; + contextTable.splitMenu = resizeDiv.querySelector('.se-btn-group-sub'); + contextTable.mergeButton = resizeDiv.querySelector('._se_table_merge_button'); + contextTable.splitButton = resizeDiv.querySelector('._se_table_split_button'); + contextTable.insertRowAboveButton = resizeDiv.querySelector('._se_table_insert_row_a'); + contextTable.insertRowBelowButton = resizeDiv.querySelector('._se_table_insert_row_b'); + + /** add event listeners */ + tablePicker.addEventListener('mousemove', this.onMouseMove_tablePicker.bind(core, contextTable)); + tablePicker.addEventListener('click', this.appendTable.bind(core)); + resizeDiv.addEventListener('click', this.onClick_tableController.bind(core)); + tableController.addEventListener('click', this.onClick_tableController.bind(core)); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** append controller */ + context.element.relative.appendChild(resizeDiv); + context.element.relative.appendChild(tableController); + + /** empty memory */ + listDiv = null, tablePicker = null, resizeDiv = null, tableController = null, contextTable = null; + }, + + setSubmenu: function (core) { + const listDiv = core.util.createElement('DIV'); + listDiv.className = 'se-submenu se-selector-table'; + listDiv.innerHTML = '' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    1 x 1
    '; + + return listDiv; + }, + + setController_table: function (core) { + const lang = core.lang; + const icons = core.icons; + const tableResize = core.util.createElement('DIV'); + + tableResize.className = 'se-controller se-controller-table'; + tableResize.innerHTML = '' + + '
    ' + + '
    ' + + '' + + '' + + '' + + '' + + '
    ' + + '
    '; + + return tableResize; + }, + + setController_tableEditor: function (core, cellControllerTop) { + const lang = core.lang; + const icons = core.icons; + const tableResize = core.util.createElement('DIV'); + + tableResize.className = 'se-controller se-controller-table-cell'; + tableResize.innerHTML = (cellControllerTop ? '' : '
    ') + + '
    ' + + '' + + '' + + '' + + '' + + '
    ' + + '
    ' + + '' + + '' + + '' + + '' + + '
    ' + + '
    ' + + '
      ' + + '
    • ' + + lang.controller.VerticalSplit + '
    • ' + + '
    • ' + + lang.controller.HorizontalSplit + '
    • ' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + + return tableResize; + }, + + appendTable: function () { + const oTable = this.util.createElement('TABLE'); + const createCells = this.plugins.table.createCells; + + const x = this.context.table._tableXY[0]; + let y = this.context.table._tableXY[1]; + let tableHTML = ''; + while (y > 0) { + tableHTML += '' + createCells.call(this, 'td', x) + ''; + --y; + } + tableHTML += ''; + oTable.innerHTML = tableHTML; + + const changed = this.insertComponent(oTable, false, true, false); + + if (changed) { + const firstTd = oTable.querySelector('td div'); + this.setRange(firstTd, 0, firstTd, 0); + this.plugins.table.reset_table_picker.call(this); + } + }, + + createCells: function (nodeName, cnt, returnElement) { + nodeName = nodeName.toLowerCase(); + + if (!returnElement) { + let cellsHTML = ''; + while (cnt > 0) { + cellsHTML += '<' +nodeName + '>

    '; + cnt--; + } + return cellsHTML; + } else { + const cell = this.util.createElement(nodeName); + cell.innerHTML = '

    '; + return cell; + } + }, + + onMouseMove_tablePicker: function (contextTable, e) { + e.stopPropagation(); + + let x = this._w.Math.ceil(e.offsetX / 18); + let y = this._w.Math.ceil(e.offsetY / 18); + x = x < 1 ? 1 : x; + y = y < 1 ? 1 : y; + + if (contextTable._rtl) { + contextTable.tableHighlight.style.left = (x * 18 - 13) + 'px'; + x = 11 - x; + } + + contextTable.tableHighlight.style.width = x + 'em'; + contextTable.tableHighlight.style.height = y + 'em'; + + // let x_u = x < 5 ? 5 : (x > 9 ? 10 : x + 1); + // let y_u = y < 5 ? 5 : (y > 9 ? 10 : y + 1); + // contextTable.tableUnHighlight.style.width = x_u + 'em'; + // contextTable.tableUnHighlight.style.height = y_u + 'em'; + + this.util.changeTxt(contextTable.tableDisplay, x + ' x ' + y); + contextTable._tableXY = [x, y]; + }, + + reset_table_picker: function () { + if (!this.context.table.tableHighlight) return; + + const highlight = this.context.table.tableHighlight.style; + const unHighlight = this.context.table.tableUnHighlight.style; + + highlight.width = '1em'; + highlight.height = '1em'; + unHighlight.width = '10em'; + unHighlight.height = '10em'; + + this.util.changeTxt(this.context.table.tableDisplay, '1 x 1'); + this.submenuOff(); + }, + + init: function () { + const contextTable = this.context.table; + const tablePlugin = this.plugins.table; + + tablePlugin._removeEvents.call(this); + + if (tablePlugin._selectedTable) { + const selectedCells = tablePlugin._selectedTable.querySelectorAll('.se-table-selected-cell'); + for (let i = 0, len = selectedCells.length; i < len; i++) { + this.util.removeClass(selectedCells[i], 'se-table-selected-cell'); + } + } + + tablePlugin._toggleEditor.call(this, true); + + contextTable._element = null; + contextTable._tdElement = null; + contextTable._trElement = null; + contextTable._trElements = null; + contextTable._tableXY = []; + contextTable._maxWidth = true; + contextTable._fixedColumn = false; + contextTable._physical_cellCnt = 0; + contextTable._logical_cellCnt = 0; + contextTable._rowCnt = 0; + contextTable._rowIndex = 0; + contextTable._physical_cellIndex = 0; + contextTable._logical_cellIndex = 0; + contextTable._current_colSpan = 0; + contextTable._current_rowSpan = 0; + + tablePlugin._shift = false; + tablePlugin._selectedCells = null; + tablePlugin._selectedTable = null; + tablePlugin._ref = null; + + tablePlugin._fixedCell = null; + tablePlugin._selectedCell = null; + tablePlugin._fixedCellName = null; + }, + + /** table edit controller */ + call_controller_tableEdit: function (tdElement) { + const tablePlugin = this.plugins.table; + const contextTable = this.context.table; + + if (!this.getSelection().isCollapsed && !tablePlugin._selectedCell) { + this.controllersOff(); + this.util.removeClass(tdElement, 'se-table-selected-cell'); + return; + } + + const tableElement = contextTable._element || this.plugins.table._selectedTable || this.util.getParentElement(tdElement, 'TABLE'); + contextTable._maxWidth = this.util.hasClass(tableElement, 'se-table-size-100') || tableElement.style.width === '100%' || (!tableElement.style.width && !this.util.hasClass(tableElement, 'se-table-size-auto')); + contextTable._fixedColumn = this.util.hasClass(tableElement, 'se-table-layout-fixed') || tableElement.style.tableLayout === 'fixed'; + tablePlugin.setTableStyle.call(this, contextTable._maxWidth ? 'width|column' : 'width'); + + tablePlugin.setPositionControllerTop.call(this, tableElement); + tablePlugin.setPositionControllerDiv.call(this, tdElement, tablePlugin._shift); + + if (!tablePlugin._shift) this.controllersOn(contextTable.resizeDiv, contextTable.tableController, tablePlugin.init.bind(this), tdElement, 'table'); + }, + + setPositionControllerTop: function (tableElement) { + this.setControllerPosition(this.context.table.tableController, tableElement, 'top', {left: 0, top: 0}); + }, + + setPositionControllerDiv: function (tdElement, reset) { + const contextTable = this.context.table; + const resizeDiv = contextTable.resizeDiv; + + this.plugins.table.setCellInfo.call(this, tdElement, reset); + + if (contextTable.cellControllerTop) { + this.setControllerPosition(resizeDiv, contextTable._element, 'top', {left: contextTable.tableController.offsetWidth, top: 0}); + } else { + this.setControllerPosition(resizeDiv, tdElement, 'bottom', {left: 0, top: 0}); + } + }, + + setCellInfo: function (tdElement, reset) { + const contextTable = this.context.table; + const table = contextTable._element = this.plugins.table._selectedTable || this.util.getParentElement(tdElement, 'TABLE'); + + if (/THEAD/i.test(table.firstElementChild.nodeName)) { + this.util.addClass(contextTable.headerButton, 'active'); + } else { + this.util.removeClass(contextTable.headerButton, 'active'); + } + + if (reset || contextTable._physical_cellCnt === 0) { + if (contextTable._tdElement !== tdElement) { + contextTable._tdElement = tdElement; + contextTable._trElement = tdElement.parentNode; + } + + const rows = contextTable._trElements = table.rows; + const cellIndex = tdElement.cellIndex; + + let cellCnt = 0; + for (let i = 0, cells = rows[0].cells, len = rows[0].cells.length; i < len; i++) { + cellCnt += cells[i].colSpan; + } + + // row cnt, row index + const rowIndex = contextTable._rowIndex = contextTable._trElement.rowIndex; + contextTable._rowCnt = rows.length; + + // cell cnt, physical cell index + contextTable._physical_cellCnt = contextTable._trElement.cells.length; + contextTable._logical_cellCnt = cellCnt; + contextTable._physical_cellIndex = cellIndex; + + // span + contextTable._current_colSpan = contextTable._tdElement.colSpan - 1; + contextTable._current_rowSpan - contextTable._trElement.cells[cellIndex].rowSpan - 1; + + // find logcal cell index + let rowSpanArr = []; + let spanIndex = []; + for (let i = 0, cells, colSpan; i <= rowIndex; i++) { + cells = rows[i].cells; + colSpan = 0; + for (let c = 0, cLen = cells.length, cell, cs, rs, logcalIndex; c < cLen; c++) { + cell = cells[c]; + cs = cell.colSpan - 1; + rs = cell.rowSpan - 1; + logcalIndex = c + colSpan; + + if (spanIndex.length > 0) { + for (let r = 0, arr; r < spanIndex.length; r++) { + arr = spanIndex[r]; + if (arr.row > i) continue; + if (logcalIndex >= arr.index) { + colSpan += arr.cs; + logcalIndex += arr.cs; + arr.rs -= 1; + arr.row = i + 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } else if (c === cLen - 1) { + arr.rs -= 1; + arr.row = i + 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } + } + } + + // logcal cell index + if (i === rowIndex && c === cellIndex) { + contextTable._logical_cellIndex = logcalIndex; + break; + } + + if (rs > 0) { + rowSpanArr.push({ + index: logcalIndex, + cs: cs + 1, + rs: rs, + row: -1 + }); + } + + colSpan += cs; + } + + spanIndex = spanIndex.concat(rowSpanArr).sort(function (a, b) {return a.index - b.index;}); + rowSpanArr = []; + } + + rowSpanArr = null; + spanIndex = null; + } + }, + + editTable: function (type, option) { + const tablePlugin = this.plugins.table; + const contextTable = this.context.table; + const table = contextTable._element; + const isRow = type === 'row'; + + if (isRow) { + const tableAttr = contextTable._trElement.parentNode; + if (/^THEAD$/i.test(tableAttr.nodeName)) { + if (option === 'up') { + return; + } else if (!tableAttr.nextElementSibling || !/^TBODY$/i.test(tableAttr.nextElementSibling.nodeName)) { + table.innerHTML += '' + tablePlugin.createCells.call(this, 'td', contextTable._logical_cellCnt, false) + ''; + return; + } + } + } + + // multi + if (tablePlugin._ref) { + const positionCell = contextTable._tdElement; + const selectedCells = tablePlugin._selectedCells; + // multi - row + if (isRow) { + // remove row + if (!option) { + let row = selectedCells[0].parentNode; + const removeCells = [selectedCells[0]]; + + for (let i = 1, len = selectedCells.length, cell; i < len; i++) { + cell = selectedCells[i]; + if (row !== cell.parentNode) { + removeCells.push(cell); + row = cell.parentNode; + } + } + + for (let i = 0, len = removeCells.length; i < len; i++) { + tablePlugin.setCellInfo.call(this, removeCells[i], true); + tablePlugin.editRow.call(this, option); + } + } else { // edit row + tablePlugin.setCellInfo.call(this, option === 'up' ? selectedCells[0] : selectedCells[selectedCells.length - 1], true); + tablePlugin.editRow.call(this, option, positionCell); + } + } else { // multi - cell + const firstRow = selectedCells[0].parentNode; + // remove cell + if (!option) { + const removeCells = [selectedCells[0]]; + + for (let i = 1, len = selectedCells.length, cell; i < len; i++) { + cell = selectedCells[i]; + if (firstRow === cell.parentNode) { + removeCells.push(cell); + } else { + break; + } + } + + for (let i = 0, len = removeCells.length; i < len; i++) { + tablePlugin.setCellInfo.call(this, removeCells[i], true); + tablePlugin.editCell.call(this, option); + } + } else { // edit cell + let rightCell = null; + + for (let i = 0, len = selectedCells.length - 1; i < len; i++) { + if (firstRow !== selectedCells[i + 1].parentNode) { + rightCell = selectedCells[i]; + break; + } + } + + tablePlugin.setCellInfo.call(this, option === 'left' ? selectedCells[0] : rightCell || selectedCells[0], true); + tablePlugin.editCell.call(this, option, positionCell); + } + } + + if (!option) tablePlugin.init.call(this); + } // one + else { + tablePlugin[isRow ? 'editRow' : 'editCell'].call(this, option); + } + + // after remove + if (!option) { + const children = table.children; + for (let i = 0; i < children.length; i++) { + if (children[i].children.length === 0) { + this.util.removeItem(children[i]); + i--; + } + } + + if (table.children.length === 0) this.util.removeItem(table); + } + }, + + editRow: function (option, positionResetElement) { + const contextTable = this.context.table; + const remove = !option; + + const up = option === 'up'; + const originRowIndex = contextTable._rowIndex; + const rowIndex = remove || up ? originRowIndex : originRowIndex + contextTable._current_rowSpan + 1; + const sign = remove ? -1 : 1; + + const rows = contextTable._trElements; + let cellCnt = contextTable._logical_cellCnt; + + for (let i = 0, len = originRowIndex + (remove ? -1 : 0), cell; i <= len; i++) { + cell = rows[i].cells; + if (cell.length === 0) return; + + for (let c = 0, cLen = cell.length, rs, cs; c < cLen; c++) { + rs = cell[c].rowSpan; + cs = cell[c].colSpan; + if (rs < 2 && cs < 2) continue; + + if (rs + i > rowIndex && rowIndex > i) { + cell[c].rowSpan = rs + sign; + cellCnt -= cs; + } + } + } + + if (remove) { + const next = rows[originRowIndex + 1]; + if (next) { + const spanCells = []; + let cells = rows[originRowIndex].cells; + let colSpan = 0; + + for (let i = 0, len = cells.length, cell, logcalIndex; i < len; i++) { + cell = cells[i]; + logcalIndex = i + colSpan; + colSpan += cell.colSpan - 1; + + if (cell.rowSpan > 1) { + cell.rowSpan -= 1; + spanCells.push({cell: cell.cloneNode(false), index: logcalIndex}); + } + } + + if (spanCells.length > 0) { + let spanCell = spanCells.shift(); + cells = next.cells; + colSpan = 0; + + for (let i = 0, len = cells.length, cell, logcalIndex; i < len; i++) { + cell = cells[i]; + logcalIndex = i + colSpan; + colSpan += cell.colSpan - 1; + + if (logcalIndex >= spanCell.index) { + i--, colSpan--; + colSpan += spanCell.cell.colSpan - 1; + next.insertBefore(spanCell.cell, cell); + spanCell = spanCells.shift(); + if (!spanCell) break; + } + } + + if (spanCell) { + next.appendChild(spanCell.cell); + for (let i = 0, len = spanCells.length; i < len; i++) { + next.appendChild(spanCells[i].cell); + } + } + } + } + + contextTable._element.deleteRow(rowIndex); + } else { + const newRow = contextTable._element.insertRow(rowIndex); + newRow.innerHTML = this.plugins.table.createCells.call(this, 'td', cellCnt, false); + } + + if (!remove) { + this.plugins.table.setPositionControllerDiv.call(this, positionResetElement || contextTable._tdElement, true); + } else { + this.controllersOff(); + } + }, + + editCell: function (option, positionResetElement) { + const contextTable = this.context.table; + const util = this.util; + const remove = !option; + + const left = option === 'left'; + const colSpan = contextTable._current_colSpan; + const cellIndex = remove || left ? contextTable._logical_cellIndex : contextTable._logical_cellIndex + colSpan + 1; + + const rows = contextTable._trElements; + let rowSpanArr = []; + let spanIndex = []; + let passCell = 0; + const removeCell = []; + const removeSpanArr = []; + + for (let i = 0, len = contextTable._rowCnt, row, insertIndex, cells, newCell, applySpan, cellColSpan; i < len; i++) { + row = rows[i]; + insertIndex = cellIndex; + applySpan = false; + cells = row.cells; + cellColSpan = 0; + + for (let c = 0, cell, cLen = cells.length, rs, cs, removeIndex; c < cLen; c++) { + cell = cells[c]; + if (!cell) break; + + rs = cell.rowSpan - 1; + cs = cell.colSpan - 1; + + if (!remove) { + if (c >= insertIndex) break; + if (cs > 0) { + if (passCell < 1 && cs + c >= insertIndex) { + cell.colSpan += 1; + insertIndex = null; + passCell = rs + 1; + break; + } + + insertIndex -= cs; + } + + if (!applySpan) { + for (let r = 0, arr; r < spanIndex.length; r++) { + arr = spanIndex[r]; + insertIndex -= arr.cs; + arr.rs -= 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } + applySpan = true; + } + } else { + removeIndex = c + cellColSpan; + + if (spanIndex.length > 0) { + const lastCell = !cells[c + 1]; + for (let r = 0, arr; r < spanIndex.length; r++) { + arr = spanIndex[r]; + if (arr.row > i) continue; + + if (removeIndex >= arr.index) { + cellColSpan += arr.cs; + removeIndex = c + cellColSpan; + arr.rs -= 1; + arr.row = i + 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } else if (lastCell) { + arr.rs -= 1; + arr.row = i + 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } + } + } + + if (rs > 0) { + rowSpanArr.push({ + rs: rs, + cs: cs + 1, + index: removeIndex, + row: -1 + }); + } + + if (removeIndex >= insertIndex && removeIndex + cs <= insertIndex + colSpan) { + removeCell.push(cell); + } else if (removeIndex <= insertIndex + colSpan && removeIndex + cs >= insertIndex) { + cell.colSpan -= util.getOverlapRangeAtIndex(cellIndex, cellIndex + colSpan, removeIndex, removeIndex + cs); + } else if (rs > 0 && (removeIndex < insertIndex || removeIndex + cs > insertIndex + colSpan)) { + removeSpanArr.push({ + cell: cell, + i: i, + rs: i + rs + }); + } + + cellColSpan += cs; + } + } + + spanIndex = spanIndex.concat(rowSpanArr).sort(function (a, b) {return a.index - b.index;}); + rowSpanArr = []; + + if (!remove) { + if (passCell > 0) { + passCell -= 1; + continue; + } + + if (insertIndex !== null && cells.length > 0) { + newCell = this.plugins.table.createCells.call(this, cells[0].nodeName, 0, true); + newCell = row.insertBefore(newCell, cells[insertIndex]); + } + } + } + + if (remove) { + let removeFirst, removeEnd; + for (let r = 0, rLen = removeCell.length, row; r < rLen; r++) { + row = removeCell[r].parentNode; + util.removeItem(removeCell[r]); + if (row.cells.length === 0) { + if (!removeFirst) removeFirst = util.getArrayIndex(rows, row); + removeEnd = util.getArrayIndex(rows, row); + util.removeItem(row); + } + } + + for (let c = 0, cLen = removeSpanArr.length, rowSpanCell; c < cLen; c++) { + rowSpanCell = removeSpanArr[c]; + rowSpanCell.cell.rowSpan = util.getOverlapRangeAtIndex(removeFirst, removeEnd, rowSpanCell.i, rowSpanCell.rs); + } + + this.controllersOff(); + } else { + this.plugins.table.setPositionControllerDiv.call(this, positionResetElement || contextTable._tdElement, true); + } + }, + + _closeSplitMenu: null, + openSplitMenu: function () { + this.util.addClass(this.context.table.splitButton, 'on'); + this.context.table.splitMenu.style.display = 'inline-table'; + + this.plugins.table._closeSplitMenu = function () { + this.util.removeClass(this.context.table.splitButton, 'on'); + this.context.table.splitMenu.style.display = 'none'; + this.removeDocEvent('click', this.plugins.table._closeSplitMenu); + this.plugins.table._closeSplitMenu = null; + }.bind(this); + + this.addDocEvent('click', this.plugins.table._closeSplitMenu); + }, + + splitCells: function (direction) { + const util = this.util; + const vertical = direction === 'vertical'; + const contextTable = this.context.table; + const currentCell = contextTable._tdElement; + const rows = contextTable._trElements; + const currentRow = contextTable._trElement; + const index = contextTable._logical_cellIndex; + const rowIndex = contextTable._rowIndex; + const newCell = this.plugins.table.createCells.call(this, currentCell.nodeName, 0, true); + + // vertical + if (vertical) { + const currentColSpan = currentCell.colSpan; + newCell.rowSpan = currentCell.rowSpan; + + // colspan > 1 + if (currentColSpan > 1) { + newCell.colSpan = this._w.Math.floor(currentColSpan/2); + currentCell.colSpan = currentColSpan - newCell.colSpan; + currentRow.insertBefore(newCell, currentCell.nextElementSibling); + } else { // colspan - 1 + let rowSpanArr = []; + let spanIndex = []; + + for (let i = 0, len = contextTable._rowCnt, cells, colSpan; i < len; i++) { + cells = rows[i].cells; + colSpan = 0; + for (let c = 0, cLen = cells.length, cell, cs, rs, logcalIndex; c < cLen; c++) { + cell = cells[c]; + cs = cell.colSpan - 1; + rs = cell.rowSpan - 1; + logcalIndex = c + colSpan; + + if (spanIndex.length > 0) { + for (let r = 0, arr; r < spanIndex.length; r++) { + arr = spanIndex[r]; + if (arr.row > i) continue; + if (logcalIndex >= arr.index) { + colSpan += arr.cs; + logcalIndex += arr.cs; + arr.rs -= 1; + arr.row = i + 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } else if (c === cLen - 1) { + arr.rs -= 1; + arr.row = i + 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } + } + } + + if (logcalIndex <= index && rs > 0) { + rowSpanArr.push({ + index: logcalIndex, + cs: cs + 1, + rs: rs, + row: -1 + }); + } + + if (cell !== currentCell && logcalIndex <= index && logcalIndex + cs >= index + currentColSpan - 1) { + cell.colSpan += 1; + break; + } + + if (logcalIndex > index) break; + + colSpan += cs; + } + + spanIndex = spanIndex.concat(rowSpanArr).sort(function (a, b) {return a.index - b.index;}); + rowSpanArr = []; + } + + currentRow.insertBefore(newCell, currentCell.nextElementSibling); + } + } else { // horizontal + const currentRowSpan = currentCell.rowSpan; + newCell.colSpan = currentCell.colSpan; + + // rowspan > 1 + if (currentRowSpan > 1) { + newCell.rowSpan = this._w.Math.floor(currentRowSpan/2); + const newRowSpan = currentRowSpan - newCell.rowSpan; + + const rowSpanArr = []; + const nextRowIndex = util.getArrayIndex(rows, currentRow) + newRowSpan; + + for (let i = 0, cells, colSpan; i < nextRowIndex; i++) { + cells = rows[i].cells; + colSpan = 0; + for (let c = 0, cLen = cells.length, cell, cs, logcalIndex; c < cLen; c++) { + logcalIndex = c + colSpan; + if (logcalIndex >= index) break; + + cell = cells[c]; + cs = cell.rowSpan - 1; + if (cs > 0 && cs + i >= nextRowIndex && logcalIndex < index) { + rowSpanArr.push({ + index: logcalIndex, + cs: cell.colSpan + }); + } + colSpan += cell.colSpan - 1; + } + } + + const nextRow = rows[nextRowIndex]; + const nextCells = nextRow.cells; + let rs = rowSpanArr.shift(); + + for (let c = 0, cLen = nextCells.length, colSpan = 0, cell, cs, logcalIndex, insertIndex; c < cLen; c++) { + logcalIndex = c + colSpan; + cell = nextCells[c]; + cs = cell.colSpan - 1; + insertIndex = logcalIndex + cs + 1; + + if (rs && insertIndex >= rs.index) { + colSpan += rs.cs; + insertIndex += rs.cs; + rs = rowSpanArr.shift(); + } + + if (insertIndex >= index || c === cLen - 1) { + nextRow.insertBefore(newCell, cell.nextElementSibling); + break; + } + + colSpan += cs; + } + + currentCell.rowSpan = newRowSpan; + } else { // rowspan - 1 + newCell.rowSpan = currentCell.rowSpan; + const newRow = util.createElement('TR'); + newRow.appendChild(newCell); + + for (let i = 0, cells; i < rowIndex; i++) { + cells = rows[i].cells; + if (cells.length === 0) return; + + for (let c = 0, cLen = cells.length; c < cLen; c++) { + if (i + cells[c].rowSpan - 1 >= rowIndex) { + cells[c].rowSpan += 1; + } + } + } + + const physicalIndex = contextTable._physical_cellIndex; + const cells = currentRow.cells; + + for (let c = 0, cLen = cells.length; c < cLen; c++) { + if (c === physicalIndex) continue; + cells[c].rowSpan += 1; + } + + currentRow.parentNode.insertBefore(newRow, currentRow.nextElementSibling); + } + } + + this.focusEdge(currentCell); + this.plugins.table.setPositionControllerDiv.call(this, currentCell, true); + }, + + mergeCells: function () { + const tablePlugin = this.plugins.table; + const contextTable = this.context.table; + const util = this.util; + + const ref = tablePlugin._ref; + const selectedCells = tablePlugin._selectedCells; + const mergeCell = selectedCells[0]; + + let emptyRowFirst = null; + let emptyRowLast = null; + let cs = (ref.ce - ref.cs) + 1; + let rs = (ref.re - ref.rs) + 1; + let mergeHTML = ''; + let row = null; + + for (let i = 1, len = selectedCells.length, cell, ch; i < len; i++) { + cell = selectedCells[i]; + if (row !== cell.parentNode) row = cell.parentNode; + + ch = cell.children; + for (let c = 0, cLen = ch.length; c < cLen; c++) { + if (util.isFormatElement(ch[c]) && util.onlyZeroWidthSpace(ch[c].textContent)) { + util.removeItem(ch[c]); + } + } + + mergeHTML += cell.innerHTML; + util.removeItem(cell); + + if (row.cells.length === 0) { + if (!emptyRowFirst) emptyRowFirst = row; + else emptyRowLast = row; + rs -= 1; + } + } + + if (emptyRowFirst) { + const rows = contextTable._trElements; + const rowIndexFirst = util.getArrayIndex(rows, emptyRowFirst); + const rowIndexLast = util.getArrayIndex(rows, emptyRowLast || emptyRowFirst); + const removeRows = []; + + for (let i = 0, cells; i <= rowIndexLast; i++) { + cells = rows[i].cells; + if (cells.length === 0) { + removeRows.push(rows[i]); + continue; + } + + for (let c = 0, cLen = cells.length, cell, rs; c < cLen; c++) { + cell = cells[c]; + rs = cell.rowSpan - 1; + if (rs > 0 && i + rs >= rowIndexFirst) { + cell.rowSpan -= util.getOverlapRangeAtIndex(rowIndexFirst, rowIndexLast, i, i + rs); + } + } + } + + for (let i = 0, len = removeRows.length; i < len; i++) { + util.removeItem(removeRows[i]); + } + } + + mergeCell.innerHTML += mergeHTML; + mergeCell.colSpan = cs; + mergeCell.rowSpan = rs; + + this.controllersOff(); + tablePlugin.setActiveButton.call(this, true, false); + tablePlugin.call_controller_tableEdit.call(this, mergeCell); + + util.addClass(mergeCell, 'se-table-selected-cell'); + this.focusEdge(mergeCell); + }, + + toggleHeader: function () { + const util = this.util; + const headerButton = this.context.table.headerButton; + const active = util.hasClass(headerButton, 'active'); + const table = this.context.table._element; + + if (!active) { + const header = util.createElement('THEAD'); + header.innerHTML = '' + this.plugins.table.createCells.call(this, 'th', this.context.table._logical_cellCnt, false) + ''; + table.insertBefore(header, table.firstElementChild); + } else { + util.removeItem(table.querySelector('thead')); + } + + util.toggleClass(headerButton, 'active'); + + if (/TH/i.test(this.context.table._tdElement.nodeName)) { + this.controllersOff(); + } else { + this.plugins.table.setPositionControllerDiv.call(this, this.context.table._tdElement, false); + } + }, + + setTableStyle: function (styles) { + const contextTable = this.context.table; + const tableElement = contextTable._element; + let icon, span, sizeIcon, text; + + if (styles.indexOf('width') > -1) { + icon = contextTable.resizeButton.firstElementChild; + span = contextTable.resizeText; + + if (!contextTable._maxWidth) { + sizeIcon = contextTable.icons.expansion; + text = contextTable.maxText; + contextTable.columnFixedButton.style.display = 'none'; + this.util.removeClass(tableElement, 'se-table-size-100'); + this.util.addClass(tableElement, 'se-table-size-auto'); + } else { + sizeIcon = contextTable.icons.reduction; + text = contextTable.minText; + contextTable.columnFixedButton.style.display = 'block'; + this.util.removeClass(tableElement, 'se-table-size-auto'); + this.util.addClass(tableElement, 'se-table-size-100'); + } + + this.util.changeElement(icon, sizeIcon); + this.util.changeTxt(span, text); + } + + if (styles.indexOf('column') > -1) { + if (!contextTable._fixedColumn) { + this.util.removeClass(tableElement, 'se-table-layout-fixed'); + this.util.addClass(tableElement, 'se-table-layout-auto'); + this.util.removeClass(contextTable.columnFixedButton, 'active'); + } else { + this.util.removeClass(tableElement, 'se-table-layout-auto'); + this.util.addClass(tableElement, 'se-table-layout-fixed'); + this.util.addClass(contextTable.columnFixedButton, 'active'); + } + + } + }, + + setActiveButton: function (fixedCell, selectedCell) { + const contextTable = this.context.table; + + if (/^TH$/i.test(fixedCell.nodeName)) { + contextTable.insertRowAboveButton.setAttribute('disabled', true); + contextTable.insertRowBelowButton.setAttribute('disabled', true); + } else { + contextTable.insertRowAboveButton.removeAttribute('disabled'); + contextTable.insertRowBelowButton.removeAttribute('disabled'); + } + + if (!selectedCell || fixedCell === selectedCell) { + contextTable.splitButton.removeAttribute('disabled'); + contextTable.mergeButton.setAttribute('disabled', true); + } else { + contextTable.splitButton.setAttribute('disabled', true); + contextTable.mergeButton.removeAttribute('disabled'); + } + }, + + // multi selecte + _bindOnSelect: null, + _bindOffSelect: null, + _bindOffShift: null, + _selectedCells: null, + _shift: false, + _fixedCell: null, + _fixedCellName: null, + _selectedCell: null, + _selectedTable: null, + _ref: null, + _toggleEditor: function (enabled) { + this.context.element.wysiwyg.setAttribute('contenteditable', enabled); + if (enabled) this.util.removeClass(this.context.element.wysiwyg, 'se-disabled'); + else this.util.addClass(this.context.element.wysiwyg, 'se-disabled'); + }, + + _offCellMultiSelect: function (e) { + e.stopPropagation(); + const tablePlugin = this.plugins.table; + + if (!tablePlugin._shift) { + tablePlugin._removeEvents.call(this); + tablePlugin._toggleEditor.call(this, true); + } else if (tablePlugin._initBind) { + this._wd.removeEventListener('touchmove', tablePlugin._initBind); + tablePlugin._initBind = null; + } + + if (!tablePlugin._fixedCell || !tablePlugin._selectedTable) return; + + tablePlugin.setActiveButton.call(this, tablePlugin._fixedCell, tablePlugin._selectedCell); + tablePlugin.call_controller_tableEdit.call(this, tablePlugin._selectedCell || tablePlugin._fixedCell); + + tablePlugin._selectedCells = tablePlugin._selectedTable.querySelectorAll('.se-table-selected-cell'); + if (tablePlugin._selectedCell && tablePlugin._fixedCell) this.focusEdge(tablePlugin._selectedCell); + + if (!tablePlugin._shift) { + tablePlugin._fixedCell = null; + tablePlugin._selectedCell = null; + tablePlugin._fixedCellName = null; + } + }, + + _onCellMultiSelect: function (e) { + this._antiBlur = true; + const tablePlugin = this.plugins.table; + const target = this.util.getParentElement(e.target, this.util.isCell); + + if (tablePlugin._shift) { + if (target === tablePlugin._fixedCell) tablePlugin._toggleEditor.call(this, true); + else tablePlugin._toggleEditor.call(this, false); + } else if (!tablePlugin._ref) { + if (target === tablePlugin._fixedCell) return; + else tablePlugin._toggleEditor.call(this, false); + } + + if (!target || target === tablePlugin._selectedCell || tablePlugin._fixedCellName !== target.nodeName || + tablePlugin._selectedTable !== this.util.getParentElement(target, 'TABLE')) { + return; + } + + tablePlugin._selectedCell = target; + tablePlugin._setMultiCells.call(this, tablePlugin._fixedCell, target); + }, + + _setMultiCells: function (startCell, endCell) { + const tablePlugin = this.plugins.table; + const rows = tablePlugin._selectedTable.rows; + const util = this.util; + + const selectedCells = tablePlugin._selectedTable.querySelectorAll('.se-table-selected-cell'); + for (let i = 0, len = selectedCells.length; i < len; i++) { + util.removeClass(selectedCells[i], 'se-table-selected-cell'); + } + + if (startCell === endCell) { + util.addClass(startCell, 'se-table-selected-cell'); + if (!tablePlugin._shift) return; + } + + let findSelectedCell = true; + let spanIndex = []; + let rowSpanArr = []; + const ref = tablePlugin._ref = {_i: 0, cs: null, ce: null, rs: null, re: null}; + + for (let i = 0, len = rows.length, cells, colSpan; i < len; i++) { + cells = rows[i].cells; + colSpan = 0; + + for (let c = 0, cLen = cells.length, cell, logcalIndex, cs, rs; c < cLen; c++) { + cell = cells[c]; + cs = cell.colSpan - 1; + rs = cell.rowSpan - 1; + logcalIndex = c + colSpan; + + if (spanIndex.length > 0) { + for (let r = 0, arr; r < spanIndex.length; r++) { + arr = spanIndex[r]; + if (arr.row > i) continue; + if (logcalIndex >= arr.index) { + colSpan += arr.cs; + logcalIndex += arr.cs; + arr.rs -= 1; + arr.row = i + 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } else if (c === cLen - 1) { + arr.rs -= 1; + arr.row = i + 1; + if (arr.rs < 1) { + spanIndex.splice(r, 1); + r--; + } + } + } + } + + if (findSelectedCell) { + if (cell === startCell || cell === endCell) { + ref.cs = ref.cs !== null && ref.cs < logcalIndex ? ref.cs : logcalIndex; + ref.ce = ref.ce !== null && ref.ce > logcalIndex + cs ? ref.ce : logcalIndex + cs; + ref.rs = ref.rs !== null && ref.rs < i ? ref.rs : i; + ref.re = ref.re !== null && ref.re > i + rs ? ref.re : i + rs; + ref._i += 1; + } + + if (ref._i === 2) { + findSelectedCell = false; + spanIndex = []; + rowSpanArr = []; + i = -1; + break; + } + } else if (util.getOverlapRangeAtIndex(ref.cs, ref.ce, logcalIndex, logcalIndex + cs) && util.getOverlapRangeAtIndex(ref.rs, ref.re, i, i + rs)) { + const newCs = ref.cs < logcalIndex ? ref.cs : logcalIndex; + const newCe = ref.ce > logcalIndex + cs ? ref.ce : logcalIndex + cs; + const newRs = ref.rs < i ? ref.rs : i; + const newRe = ref.re > i + rs ? ref.re : i + rs; + + if (ref.cs !== newCs || ref.ce !== newCe || ref.rs !== newRs || ref.re !== newRe) { + ref.cs = newCs; + ref.ce = newCe; + ref.rs = newRs; + ref.re = newRe; + i = -1; + + spanIndex = []; + rowSpanArr = []; + break; + } + + util.addClass(cell, 'se-table-selected-cell'); + } + + if (rs > 0) { + rowSpanArr.push({ + index: logcalIndex, + cs: cs + 1, + rs: rs, + row: -1 + }); + } + + colSpan += cell.colSpan - 1; + } + + spanIndex = spanIndex.concat(rowSpanArr).sort(function (a, b) {return a.index - b.index;}); + rowSpanArr = []; + } + }, + + _removeEvents: function () { + const tablePlugin = this.plugins.table; + + if (tablePlugin._initBind) { + this._wd.removeEventListener('touchmove', tablePlugin._initBind); + tablePlugin._initBind = null; + } + + if (tablePlugin._bindOnSelect) { + this._wd.removeEventListener('mousedown', tablePlugin._bindOnSelect); + this._wd.removeEventListener('mousemove', tablePlugin._bindOnSelect); + tablePlugin._bindOnSelect = null; + } + + if (tablePlugin._bindOffSelect) { + this._wd.removeEventListener('mouseup', tablePlugin._bindOffSelect); + tablePlugin._bindOffSelect = null; + } + + if (tablePlugin._bindOffShift) { + this._wd.removeEventListener('keyup', tablePlugin._bindOffShift); + tablePlugin._bindOffShift = null; + } + }, + + _initBind: null, + onTableCellMultiSelect: function (tdElement, shift) { + const tablePlugin = this.plugins.table; + + tablePlugin._removeEvents.call(this); + this.controllersOff(); + + tablePlugin._shift = shift; + tablePlugin._fixedCell = tdElement; + tablePlugin._fixedCellName = tdElement.nodeName; + tablePlugin._selectedTable = this.util.getParentElement(tdElement, 'TABLE'); + + const selectedCells = tablePlugin._selectedTable.querySelectorAll('.se-table-selected-cell'); + for (let i = 0, len = selectedCells.length; i < len; i++) { + this.util.removeClass(selectedCells[i], 'se-table-selected-cell'); + } + + this.util.addClass(tdElement, 'se-table-selected-cell'); + + tablePlugin._bindOnSelect = tablePlugin._onCellMultiSelect.bind(this); + tablePlugin._bindOffSelect = tablePlugin._offCellMultiSelect.bind(this); + + if (!shift) { + this._wd.addEventListener('mousemove', tablePlugin._bindOnSelect, false); + } else { + tablePlugin._bindOffShift = function () { + this.controllersOn(this.context.table.resizeDiv, this.context.table.tableController, this.plugins.table.init.bind(this), tdElement, 'table'); + if (!tablePlugin._ref) this.controllersOff(); + }.bind(this); + + this._wd.addEventListener('keyup', tablePlugin._bindOffShift, false); + this._wd.addEventListener('mousedown', tablePlugin._bindOnSelect, false); + } + + this._wd.addEventListener('mouseup', tablePlugin._bindOffSelect, false); + tablePlugin._initBind = tablePlugin.init.bind(this); + this._wd.addEventListener('touchmove', tablePlugin._initBind, false); + }, + + onClick_tableController: function (e) { + e.stopPropagation(); + const target = e.target.getAttribute('data-command') ? e.target : e.target.parentNode; + + if (target.getAttribute('disabled')) return; + + const command = target.getAttribute('data-command'); + const value = target.getAttribute('data-value'); + const option = target.getAttribute('data-option'); + const tablePlugin = this.plugins.table; + + if (typeof tablePlugin._closeSplitMenu === 'function') { + tablePlugin._closeSplitMenu(); + if (command === 'onsplit') return; + } + + if (!command) return; + + e.preventDefault(); + const contextTable = this.context.table; + + switch (command) { + case 'insert': + case 'delete': + tablePlugin.editTable.call(this, value, option); + break; + case 'header': + tablePlugin.toggleHeader.call(this); + break; + case 'onsplit': + tablePlugin.openSplitMenu.call(this); + break; + case 'split': + tablePlugin.splitCells.call(this, value); + break; + case 'merge': + tablePlugin.mergeCells.call(this); + break; + case 'resize': + contextTable._maxWidth = !contextTable._maxWidth; + tablePlugin.setTableStyle.call(this, 'width'); + tablePlugin.setPositionControllerTop.call(this, contextTable._element); + tablePlugin.setPositionControllerDiv.call(this, contextTable._tdElement, tablePlugin._shift); + break; + case 'layout': + contextTable._fixedColumn = !contextTable._fixedColumn; + tablePlugin.setTableStyle.call(this, 'column'); + tablePlugin.setPositionControllerTop.call(this, contextTable._element); + tablePlugin.setPositionControllerDiv.call(this, contextTable._tdElement, tablePlugin._shift); + break; + case 'remove': + const emptyDiv = contextTable._element.parentNode; + this.util.removeItem(contextTable._element); + this.controllersOff(); + + if (emptyDiv !== this.context.element.wysiwyg) this.util.removeItemAllParents(emptyDiv, function (current) { return current.childNodes.length === 0; }, null); + this.focus(); + } + + // history stack + this.history.push(false); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/template.js": +/*!****************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/template.js ***! + \****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'template', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + context.template = {}; + + /** set submenu */ + let templateDiv = this.setSubmenu(core); + + /** add event listeners */ + templateDiv.querySelector('ul').addEventListener('click', this.pickup.bind(core)); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, templateDiv); + + /** empty memory */ + templateDiv = null; + }, + + setSubmenu: function (core) { + const templateList = core.options.templates; + if (!templateList || templateList.length === 0) { + throw Error('[SUNEDITOR.plugins.template.fail] To use the "template" plugin, please define the "templates" option.'); + } + + const listDiv = core.util.createElement('DIV'); + listDiv.className = 'se-list-layer'; + + let list = '
    ' + + '
      '; + for (let i = 0, len = templateList.length, t; i < len; i++) { + t = templateList[i]; + list += '
    • '; + } + list += '
    '; + + listDiv.innerHTML = list; + + return listDiv; + }, + + pickup: function (e) { + if (!/^BUTTON$/i.test(e.target.tagName)) return false; + + e.preventDefault(); + e.stopPropagation(); + + const temp = this.options.templates[e.target.getAttribute('data-value')]; + + if (temp.html) { + this.setContents(temp.html); + } else { + this.submenuOff(); + throw Error('[SUNEDITOR.template.fail] cause : "templates[i].html not found"'); + } + + this.submenuOff(); + } +}); + +/***/ }), + +/***/ "./node_modules/suneditor/src/plugins/submenu/textStyle.js": +/*!*****************************************************************!*\ + !*** ./node_modules/suneditor/src/plugins/submenu/textStyle.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'textStyle', + display: 'submenu', + add: function (core, targetElement) { + const context = core.context; + context.textStyle = { + _styleList: null + }; + + /** set submenu */ + let listDiv = this.setSubmenu(core); + let listUl = listDiv.querySelector('ul'); + + /** add event listeners */ + listUl.addEventListener('click', this.pickup.bind(core)); + + context.textStyle._styleList = listDiv.querySelectorAll('li button'); + + /** append target button menu */ + core.initMenuTarget(this.name, targetElement, listDiv); + + /** empty memory */ + listDiv = null, listUl = null; + }, + + setSubmenu: function (core) { + const option = core.options; + const listDiv = core.util.createElement('DIV'); + listDiv.className = 'se-submenu se-list-layer se-list-format'; + + const defaultList = { + code: { + name: core.lang.menu.code, + class: '__se__t-code', + tag: 'code', + }, + translucent: { + name: core.lang.menu.translucent, + style: 'opacity: 0.5;', + tag: 'span', + }, + shadow: { + name: core.lang.menu.shadow, + class: '__se__t-shadow', + tag: 'span', + } + }; + const styleList = !option.textStyles ? core._w.Object.keys(defaultList) : option.textStyles; + + let list = '
      '; + for (let i = 0, len = styleList.length, t, tag, name, attrs, command, value, _class; i < len; i++) { + t = styleList[i]; + attrs = '', value = '', command = []; + + if (typeof t === 'string') { + const defaultStyle = defaultList[t.toLowerCase()]; + if (!defaultStyle) continue; + t = defaultStyle; + } + + name = t.name; + tag = t.tag || 'span'; + _class = t._class; + + if (t.style) { + attrs += ' style="' + t.style + '"'; + value += t.style.replace(/:[^;]+(;|$)\s*/g, ','); + command.push('style'); + } + if (t.class) { + attrs += ' class="' + t.class + '"'; + value += '.' + t.class.trim().replace(/\s+/g, ',.'); + command.push('class'); + } + + value = value.replace(/,$/, ''); + + list += '
    • ' + + '
    • '; + } + list += '
    '; + + listDiv.innerHTML = list; + + return listDiv; + }, + + /** + * @Override submenu + */ + on: function () { + const util = this.util; + const textStyleContext = this.context.textStyle; + const styleButtonList = textStyleContext._styleList; + const selectionNode = this.getSelectionNode(); + + for (let i = 0, len = styleButtonList.length, btn, data, active; i < len; i++) { + btn = styleButtonList[i]; + data = btn.getAttribute('data-value').split(','); + + for (let v = 0, node, value; v < data.length; v++) { + node = selectionNode; + active = false; + + while (node && !util.isFormatElement(node) && !util.isComponent(node)) { + if (node.nodeName.toLowerCase() === btn.getAttribute('data-command').toLowerCase()) { + value = data[v]; + if (/^\./.test(value) ? util.hasClass(node, value.replace(/^\./, '')) : !!node.style[value]) { + active = true; + break; + } + } + node = node.parentNode; + } + + if (!active) break; + } + + active ? util.addClass(btn, 'active') : util.removeClass(btn, 'active'); + } + + }, + + pickup: function (e) { + e.preventDefault(); + e.stopPropagation(); + + let target = e.target; + let command = null, tag = null; + + while (!command && !/UL/i.test(target.tagName)) { + command = target.getAttribute('data-command'); + if (command) { + tag = target.firstChild; + break; + } + target = target.parentNode; + } + + if (!command) return; + + const checkStyles = tag.style.cssText.replace(/:.+(;|$)/g, ',').split(','); + checkStyles.pop(); + + const classes = tag.classList; + for (let i = 0, len = classes.length; i < len; i++) { + checkStyles.push('.' + classes[i]); + } + + const newNode = this.util.hasClass(target, 'active') ? null : tag.cloneNode(false); + const removeNodes = newNode ? null : [tag.nodeName]; + this.nodeChange(newNode, checkStyles, removeNodes, true); + + this.submenuOff(); + } +}); + + +/***/ }), + +/***/ "./node_modules/suneditor/src/suneditor.js": +/*!*************************************************!*\ + !*** ./node_modules/suneditor/src/suneditor.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _lib_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/core */ "./node_modules/suneditor/src/lib/core.js"); +/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/util */ "./node_modules/suneditor/src/lib/util.js"); +/* harmony import */ var _lib_constructor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/constructor */ "./node_modules/suneditor/src/lib/constructor.js"); +/* harmony import */ var _lib_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/context */ "./node_modules/suneditor/src/lib/context.js"); +/* + * wysiwyg web editor + * + * suneditor.js + * Copyright 2017 JiHong Lee. + * MIT license. + */ + + + + + + + +/* harmony default export */ __webpack_exports__["default"] = ({ + /** + * @description Returns the create function with preset options. + * If the options overlap, the options of the 'create' function take precedence. + * @param {Json} options Initialization options + * @returns {Object} + */ + init: function (init_options) { + return { + create: function (idOrElement, options) { + return this.create(idOrElement, options, init_options); + }.bind(this) + }; + }, + + /** + * @description Create the suneditor + * @param {String|Element} idOrElement textarea Id or textarea element + * @param {JSON|Object} options user options + * @returns {Object} + */ + create: function (idOrElement, options, _init_options) { + _lib_util__WEBPACK_IMPORTED_MODULE_1__["default"]._propertiesInit(); + + if (typeof options !== 'object') options = {}; + if (_init_options) { + options = [_init_options, options].reduce(function (init, option) { + for (let key in option) { + if (!_lib_util__WEBPACK_IMPORTED_MODULE_1__["default"].hasOwn(option, key)) continue; + if (key === 'plugins' && option[key] && init[key]) { + let i = init[key], o = option[key]; + i = i.length ? i : Object.keys(i).map(function(name) { return i[name]; }); + o = o.length ? o : Object.keys(o).map(function(name) { return o[name]; }); + init[key] = (o.filter(function(val) { return i.indexOf(val) === -1; })).concat(i); + } else { + init[key] = option[key]; + } + } + return init; + }, {}); + } + + const element = typeof idOrElement === 'string' ? document.getElementById(idOrElement) : idOrElement; + + if (!element) { + if (typeof idOrElement === 'string') { + throw Error('[SUNEDITOR.create.fail] The element for that id was not found (ID:"' + idOrElement + '")'); + } + + throw Error('[SUNEDITOR.create.fail] suneditor requires textarea\'s element or id value'); + } + + const cons = _lib_constructor__WEBPACK_IMPORTED_MODULE_2__["default"].init(element, options); + + if (cons.constructed._top.id && document.getElementById(cons.constructed._top.id)) { + throw Error('[SUNEDITOR.create.fail] The ID of the suneditor you are trying to create already exists (ID:"' + cons.constructed._top.id + '")'); + } + + return Object(_lib_core__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_lib_context__WEBPACK_IMPORTED_MODULE_3__["default"])(element, cons.constructed, cons.options), cons.pluginCallButtons, cons.plugins, cons.options.lang, options, cons._responsiveButtons); + } +}); + + /***/ }), /***/ "./node_modules/webpack/buildin/global.js": @@ -37948,6 +59427,8 @@ module.exports = function(module) { */ __webpack_require__(/*! ./bootstrap */ "./resources/js/bootstrap.js"); +__webpack_require__(/*! ./suneditor */ "./resources/js/suneditor.js"); + /***/ }), /***/ "./resources/js/bootstrap.js": @@ -37997,6 +59478,36 @@ window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; /***/ }), +/***/ "./resources/js/suneditor.js": +/*!***********************************!*\ + !*** ./resources/js/suneditor.js ***! + \***********************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var suneditor_dist_css_suneditor_min_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! suneditor/dist/css/suneditor.min.css */ "./node_modules/suneditor/dist/css/suneditor.min.css"); +/* harmony import */ var suneditor_dist_css_suneditor_min_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(suneditor_dist_css_suneditor_min_css__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var suneditor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! suneditor */ "./node_modules/suneditor/src/suneditor.js"); +/* harmony import */ var suneditor_src_plugins__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! suneditor/src/plugins */ "./node_modules/suneditor/src/plugins/index.js"); + + + +suneditor__WEBPACK_IMPORTED_MODULE_1__["default"].create('sample', { + plugins: suneditor_src_plugins__WEBPACK_IMPORTED_MODULE_2__["default"], + buttonList: [['undo', 'redo'], ['font', 'fontSize', 'formatBlock'], ['paragraphStyle', 'blockquote'], ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'], ['fontColor', 'hiliteColor', 'textStyle'], ['removeFormat'], '/', // Line break + ['outdent', 'indent'], ['align', 'horizontalRule', 'list', 'lineHeight'], ['table', 'link', 'image', 'video', 'audio' + /** ,'math' */ + ], // You must add the 'katex' library at options to use the 'math' plugin. + + /** ['imageGallery'] */ + // You must add the "imageGalleryUrl". + ['fullScreen', 'showBlocks', 'codeView'], ['preview', 'print'], ['save', 'template']] +}); + +/***/ }), + /***/ "./resources/sass/app.scss": /*!*********************************!*\ !*** ./resources/sass/app.scss ***! diff --git a/motorradig/resources/js/app.js b/motorradig/resources/js/app.js index 9c481b4..f82e334 100644 --- a/motorradig/resources/js/app.js +++ b/motorradig/resources/js/app.js @@ -5,3 +5,4 @@ */ require('./bootstrap'); +require('./suneditor') diff --git a/motorradig/resources/js/suneditor.js b/motorradig/resources/js/suneditor.js new file mode 100644 index 0000000..7d3b595 --- /dev/null +++ b/motorradig/resources/js/suneditor.js @@ -0,0 +1,27 @@ + + +import 'suneditor/dist/css/suneditor.min.css' +import suneditor from 'suneditor' +import plugins from 'suneditor/src/plugins' + +suneditor.create('sample', { + plugins: plugins, + buttonList: [ + ['undo', 'redo'], + ['font', 'fontSize', 'formatBlock'], + ['paragraphStyle', 'blockquote'], + ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'], + ['fontColor', 'hiliteColor', 'textStyle'], + ['removeFormat'], + '/', // Line break + ['outdent', 'indent'], + ['align', 'horizontalRule', 'list', 'lineHeight'], + ['table', 'link', 'image', 'video', 'audio' /** ,'math' */], // You must add the 'katex' library at options to use the 'math' plugin. + /** ['imageGallery'] */ // You must add the "imageGalleryUrl". + ['fullScreen', 'showBlocks', 'codeView'], + ['preview', 'print'], + ['save', 'template'] + ] +}) + + diff --git a/motorradig/resources/views/home.blade.php b/motorradig/resources/views/home.blade.php index ee355b7..0d17164 100644 --- a/motorradig/resources/views/home.blade.php +++ b/motorradig/resources/views/home.blade.php @@ -18,10 +18,15 @@ @endif - + + + @@ -30,4 +35,6 @@ + + @endsection diff --git a/motorradig/resources/views/users/show.blade.php b/motorradig/resources/views/users/show.blade.php index 124a0c0..024e842 100644 --- a/motorradig/resources/views/users/show.blade.php +++ b/motorradig/resources/views/users/show.blade.php @@ -27,8 +27,9 @@ @if(file_exists (storage_path().'/img_storage/user/'.$user->id.'.jpg')) - - + + + @else diff --git a/motorradig/storage/img_storage/user/1.jpg b/motorradig/storage/img_storage/user/1.jpg index 1866ed66fa53909ee849bddd552103eaffc3a063..22c8abf71cd0675fde78e8988feb9991edac9792 100644 GIT binary patch delta 5919 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%0D@i!VBccpqhp7i)rp(i@5=vuda#X}{ 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 literal 102429 zcmbSzbzD^4yYJ8qDg)9WAtg$8E8u{1N=rz0cL~Tyr*wCT(%mVY(%m(5d-v%3{?0k~ zkNdgzj;xtId#%0pe%5-vPmjN6elLR_NlQW`K?n#4AbsE;==TFi;I)#3n2Nj-Kb46Q zi@B|_36(S3OI9idCkHcY6Do+b6qU4sgcOxCFDv5Ir zNl44NLI;DB_J^|nJHq_`zbN|;VgE(fEC?G30oXjG#~=~Vy>bp`Y$eDrNnTS?ECV?k ztSE}gC;?VLkN{VLVijdXG2jPEiV`63KMfTspeTw0j6*?$GJvvxmfZwaKpaz)GzDdx zXLBkbi0(-cXMjc}O;LRbBb~CKAO^5v67crX*EIvtPXY`gVaVnLDZZ5lW+q|C@G`NV+hF&Tz|cic1h5EQV;6 z4I%>(#gb&m88SsMV;EwXXFxC$7)@dTb+Ld`x8ak4K?aeEBZ{I}P==fg#Q5lVU;L_< zyg8gs87Nr+5K)wuj2ys9%RppAQ5mwE=zz7BG)3?jm6Copf;gr$hFb}$#AHOs06FI7 z>;TIQEIM!p1=BrIEQx1usx@EBh@z11FaljMoWQu{1u+5-E{eiJ2L>qu`{a@pex`sR1Canx z#Qxd+JqZvCI935+F?>RC7Fe7tV1v(r6<}mE1D+^&V>A67jcbo|JcyJE21#LgP4?A3 z#~{jDaozONp2@95H6+`sJBQ%y!1_<$P=C9m>WEqoC8Y*@N{9qO_9VK10z+=5C8DCt zSoBvc_?ja8*@x^ZfW4CbUAQOk)x(r#)@G|lpT0{znq9Kg@O$N$$EsHOlgUPc1M zonqQWlz|ukEJQ4cCL6Fn02{)2^X~#FjR8z8Fbebnn>F|!cmS*pXT5(Q0%v3d1|c&C zfI$|Mf$>joPT*5I^{k-C1w$?p3Cxv9$OUIef-j0U7a1m&5WCy z7ciBAqv0Rv_;(H7!MBt{CJFR<44@R0lRL;+&43dKR(>77BW8f!N5mFPC|`c>DyN#z9+Qsvu)Ny+ zj!VzNF#V3Ktb)08CXEx)?c~qm?w3Euqmq3Osi01(L6WMZ63Ey8p8S#94s+Nc!haPZBtRP2+$A7rw(_MfjR@y<}vA;|`Dj z#MFrSLdVoNV#sc-IFC2 zC=NfqDZa3xOuU`syJMD|A?S}u>iXtNI7PbNlgwnLk0*F~&n!WQ#c5PH)jv&k2uYSPcF&lbAvDu;Qo)#>Y}jpz9`cos3ZD(y>j=#QihA-aAGc z6Wj52V(s4`uP;G&!vxj>%%NKdXw}RnL^(`&=3OISTsW1D9+9KAo z7#qEId4#EZ=9Kk`>drI^st?BG9|c4f!zvVn2WWyFU?uE;ZNdaZE-d@cp`xDzh<;5* z5(NzM=2YwggA`0#vr9qb+rag}g}@;qlwYw61gxWJ1~MmH5Gn#<73EnjAb7(o|1ibX z-`%H(h0j|GhbkQlG0;2l@h=AoC<1(hoC{ZFk^tji!#U0%RLKAe(pH4NQylXpWn=o} z7qg@NJXt@It}8n1HiZz`ge>OXq9NumX}yftstT*X?iBG8Wd~Q!7jw>|O&htXkEMBE za2i&~6Q6F($b;_LlptSR6O${bRKGmO*Xnt7`CuNt@@^kyIpnpM{$&0GYNU1(`r2&n zYO!YY$VrkCib_MYr@xgH9wb_4Ucmc zsu3*}yCfmvAY!m1b#d;DsmxeZkOaMXxI&k=lonWyyGJFr#YLS~fbd(ah>N$vtF^h%PkJxTxWf2^lmrS|k)W1C z6@>=2Ph-x?lslTACoAHYwhmCy_N8X$=P`?PErxgFI6~AC|xjlyCC5VT|{N)nZ0x`O}kiFA34ZC8FKZp0aWMx z-MNpUfZ8I08#O3IT>$6-q`|k+0DyfLa1s?RZ-7((>41-hOPwyF!GBM}Hy==qaBUw8 zsthg#lYkf*ase?U3Rg19Vi}0h@qgI{&^W7q2&z_OX#~sKq8c?)QxdCeRhZV?K$p>zYsiS zcuz83wcoGyz*s$Ax&Hn&pZa6VP;1Mzan4H^n9?dFo^et~tWOS&{JQL^deH8o11D9l zar6R%m{uCwM*r!3DK^;vP)?8Bs=e?5Z`Ox4l6a;| zg+}aYAkN7g|MYe)wL{_~rdFMY+(}gwDY|yN;d!nlyN`BkWO-MiNA#oroHULub6*NW zmPKA{RM35zmhPZ2-i>#G-}2#O{r18~RYxb|50PR+5^g-fcNW=u_E@Z=@4%je?1z@; zWYe-A%JO0l>EBOL^$gHGh&O!`!Mw4o;kekHtTaKfWLa2s0fkFSdNI@MPFp(4s7LRv za`Ij))Z+GxiU}s2q(Akvj@QZ`Z)8JnPC1^|=zm5Q>4sK8kYFXW^MT^qV1c>4=K%Jn zS}95wQ_E$?a_KUjUppucL}PZ|uu%(=vdq=xvcp;D2vW~Qmp+;ZTi0&%qX~5pkJWn~ z>H0@zIOG$qh!TDQzEWj)Wfpoe$Lb-13JH)>nfr93*3a=cqp6LCb>tX##i0B*unA@80)%-s7!$AsA^@Wx8?gP9#tZfWk)s@Cyg_pGFb;?-%Dk_B$eA!~bmpihID_0rBt* zTnX6G(weWKAWcSA0LZ9hDu^_`(kD%P#i%iS*+fd-UBcKptk*4-1qDMF`9f>>$w1nBuS5@;YKS`hdM1T{6ceW%2rN<5gM<#{vmDgMA$)wG>s?ABFDKYQ7g-N1e}@ zo9FQ5mAIF8%vd)%tj5+(^%{i)(2@p$uxp96O^!%z#FwOh1o2Ms(zF+}A6%T5$CR8m zl#*&J<+ZDDrn?4=3onW3OeMfNRQ*+|Ypd9s-_of@h@F?~F?4_U26K_3pvO?NnV+eF z>Ak70)bg!)MvrN9O2C~Si!?%VYDL=hRF`wKJKf1!L6h8HQX!q%mt*dBv8n}zr%(&S zZ|t#4iELr$T}QZQh92t$T2-YJXq#y!`(!s&sE64N4oN_6y;MPYre&3Ymozwf(J_uRJI;RhLObq?NsM&*PvRq2LoxLkvSOhB7{eK(e|Zz^0%!gI-ZK8>XW)|_@S^`9 zNdonsQQ1v@y^%kzH=yDETGat?nE3&3xNzp@9|3&DP=N8_%>RFGQ@(iJP?2Fx1`wz3 zh`W+=4kCx)VvH?X8d@py*;c-{dG5jLd&#l>HUq`3cbgeyT|{+k(=}0A;zp@=1wBd@ zecnuWZ>z@7-hb64b(Iu<^p-uf)EE8y@~oiIX7#c<$f6;C0bHv=MKt89eatb9mINz4 z!d_g`E~{}#JYt!V!S+PKY+>y~BlnWxr;`7K||a!|KAzNym9j3+G_w z2HuyVIG5jqEHaL_LP|WfvKGW_2Z$MzHlGVt@Xdv%HZiX<4jM4&w&>=M*3PCzDa(yp zoipRr&=#p}2=-!Pn+UO~WsWFIhn1NqX@QD)M7B!plelBbJca7&65hrckEZ@?F^L`yxBp{L0{oQ}!SHt-181bPFLJ(V> zA2AJLU3%aJ%zW|rRCn$DXGJ4a9fBxuo+*Fmz)jV^i2=&sM z1Xz7M&GZj*UyV*hoKF2W7yz08-r@3B8~nAk{ym0A4E{*|t5IOcUvL1PJY4FBpZ&}4 zm9c>14u^sWCYvYc;HFZew4PX`-6r}FdCQbT75M(?%kVw&FlutdyE1J53Z5^sePM$uIcLUH8O=S$&;ouI@mtj z+s|yXwRT&)9FUl}W1${K?$Audy$zv$t}zm>9*Jh7C%x;$@M_=6a*7ATrvSfNa=nLw z=Q*A=?`i`j-ZsBaM+=s2E{x}i?C0sh>o4*1XtX|+%- zGY!*^UGqreyBJXQ;^~TiRU|M_(7WAucUXJWqj_K{OzP7vMo=%Dj4S}F{G32@w^=_( zbK&uQEHg=~D@Z~g7uhh}=jPm1`z15c(Nm+(aqbv&EW=!tS7Bzk+0TQ`gmXQ@jiOn5 z)5S~Ee}hzwX4zoQHH;JV@l&vgpR@*GRF+G74||L0>|>O?;16CxO`jCsJhR7;SZGgM ztvz6t`!UH0p${i}OVmA9hQu(7>oDDwL7Qws9>c($VM*EB!$ z!L(78=k(^MT^?Ab6=K=Bu|GmEX+S667Jm)v4K?B`jK4ghOID~z&7Q3M5v>wwBq;#K zUqTX+b@F}+L(N^i)e$m^n%X{|)9?#h(vv=AQkD*HsCK!pjH$5he-NVYX36Un*BnYy zJQ>D1J>Qy9AJs*kP!o{<&JptsF}EQgMi*gq35)#s_;8;`3x{pwITG5@+TymQ;uXMr!}P=VCl;-D zijHHhU;4=Qt3!W-_^;AvV!}8Rl(*SaDcPcgn+mt%-^gvKe&hINcjGbrlrtfX4yF@w z8aje8N(9EbZJLjmYD!lbFDc)T)L}4IrMDq_aN2B_!IE{xD6xB_PArG&ZDZ5k!m%Dl z82#(VUd)yYaxuLNJbvt!dZG8b+#?#ao7wEc~7p= zu~XE7i{Q5$)6?E-eK9`6cO!y|`5lE22M7E@Nd)nNty8X@p+-iTc%7e2?c0~CF>=Rc zA$G3&6?8c)0_!POioJcplPfKl%>w0NPRYe{!Cjwfe#~~hCAyzueb~Mz^SFq-I{285 za~?)9sXO~{h(RSu#rQ1SRwP2mtGM$4JbeGHA z@iEbsTAb`~W7pSUg*tCG>V0c>BSV6X1n%k^wW>nRPbV)))MJGq{U*e1YXxP&Z?3BH z_naRsVVNPji2g|Za`HVI4d$WFw?^(hpfl}wZDnQjRJ2Iu1oy+h6Ia@E5$UUDYuuFWe^td@A8mGRL<&OHansh-(^^h@0$4DL2h)0tH1E(I?9GpG6!X4T*)PN{!r1 zYp<%o!u+X^9v5>DH5qdCT`4iM*yv5h;e5+<%?afCffv@p1)Z6wN$Ix)}OfP`y4>c1qD^7S{!IdC}BkVth1aV^h58CM%FsXTL~sDj9t3`j^qO0;Jsk znsGp`s;NXHMC;q`45Kc|9Tk9W0fl28BcVj&Avi%~M)_%VyJ)#remT7xVI(r%S}UY!?12M#-4=tp&)qcs|`N&kAz( z552lD^43c;8&*=41kBRrpNtM=z3oW3>xpJ!ZsMLLHxT%&DqER|M&mmJvO6yq89B^* zs?d6ZPZF_+sY+qWcT>MXn4CiQ6o<>{HVwLzYc`K~K0Aep8@Tid4zk)9 zrio~tFM;OYreTejd_-n$_||*dh!k_Jex`?OJb>~kl+xmUYn?BgrN5-ai~cxCL;rjI zmk=xeXlRE3;I=d@;hAw?3~*;VB3s{7yZPOtxH3IiWJNewOSL0)aj zR-VRo*83HY_4&EpOE*$q@bO#vaxuMl80!1;7u_1cl@VoqFkDv&$f42{*ZTNo)3o$* zhQ`Dza@?N}Ra=^bF$Ivk%GN0G8nyP_FJh#W&9XZg7?zY7L0~)u4}un&U|9Z*(iK)0 zTbmhfl*0>;QC}quhasO*PcE}tJ$o(658~;}6BRjKB{Jqy3AwXujH)kx^)DkV?deV) zul|%>weWBt`932_tl<}_%RMB*blULc+PbQ@m5Iel!P+y_i0$Z%Ykvv-%%$pk?F8LM z89L||acNC=Q9@dwtDSX9Xc(V2No7{(vAV$NmGZ;~3BZeeftQ(RsgBAh=xmeCcyDYWS91yo@PUE?7e`=M``KN(3F~YQ`AyExkmbXR zgQ;fetEF=eKjX+9jq@D?NA58s4=BER6S=iH$_iZEUy065$S!_DF zA6wsdXg|NZd>5KN)uh~^S*+_CtU8`$bN2S}6S{M%NS`>jOW(8KpqCv=Q>2%ACQCNx z52wB*XygLpX9ose_!>bs!jO+#p8>Zts?p?WYWeej?&2MT+0;_Iha!7 z2iO+Ql{uOFFxpTjaPJayx;ku>0 zR6oMK#Tst|Xm9yGM|EC4tFJO&tOhyE6r#?5evg_9&d)u+f#f`d9(VbBB_X(>* zD>`Rm8gqaCb$85$EU7|Ik?At($*1=uavwf+Sns8M0(9u?Z2zgU4*S&Dj7;HBj^KO6 z3K#umc{ET!+n_gM!NAj3#wdk167R(G%6|E@dK1b&lDdyd)EW{to*0OTOhMIN3$<$_ z-`l>&Z71jMX4X*1>dbVGL|AKC0}?mBp2U=aj;3qRba&qgem9KnQWq&G`%a*bVck4= z(=3%xLQX1c?)h8logAdmA4!Ky zhP;EiFW1aU+o24_kN(GMJ ztMG}F^gi+I8f_h95GZ;j68<=XciFpgBazis3JpBDal{gINe5O&hI)*5DfmNCz|r4O zz$7@Vm<(rd(Q^Ked=bI?AI9!EAUqg_07(Ey8hF+mvC=6bb%Uv`Db{KWNMou(v~lKw&&zp8{e#$ES_hrk;dcxq z(Rcp_J=Kp{ISSB{BjLz;;suvJXYZx9PA z`bnGO*`6-mu}G&{4S&@`bad%p<&42IK1}fx!_%{J~5gQuasZJ&s`9X4?}d|l61o0e9FJ7xrl z&BeUNYuIsrZ7q!@9|t`QXdDx!+nHhZkox1rXV~+nG1rE(Q%2&tKfbp((dL$yM}x*x zoL8}(biTINY4|3#nwHNwf{w;n&|tAW8S`Cmogb)A_zI7xVMuWTdV_@uZjcGVc>sre z`>&Z5eg=Abm0%6oUM z%cXidCcPs15O-P=-b}CKDHF9{Nhu(IyxiN^==vMv#z-`a$huRf13~k3Q1etRGk*|j zHsqR^bq>QKuh0^Ze6F2hjU4GpHO*J3-5h2ePxx4Tj{|+KSJ^LG_>k>>E#3WU-`R?9 zO2yQZKAVi+f72x2dzgaKOXOW$t!XEBW~j4bAuYOXe!x=7&Gh$aj^p1Th%8q7taTc~ zk_Gzbpxc4)9_UV(mo6?QI9iGT;vl^uLB3r!PW3m!|Hl@E*J=G+)xLa1LU6WaRPYFj$I$Bl3#!&Co{X=tpY$Imhr}#&xzd^~<45wE4R)HbNcgf$h{9^oi2$phM7<;?XxGo(n#4Guh4x^ey!G{6GFx9#zM#BmRZ1wd|fPTa5e;lU)Mh#G+gRR0#?dD zVP7;rI0H3Ja1osj7#qa7e~Vb)0$dg(@rouKPqW;^mgOMH()+;M3}e4`vqUCZ%EldL zGh4pOb4QhqWiy5mO*%K};Y1oFUa92SO3_%5QxBEZ?CDvmmhWC*UZW^C%PCZ-Df;uGvWc0cmsP`0iAl+ zSI?9LuO7b-Icr6$@^Z#as3UY!C6#~uv&zb+lVms~Zr!8h@uTY+a{~I)2 zt~4%)kUzXUeSBUTSDW-Y_G`Zw+Ov>uuVRRJmCO(+jq5KKS;|k-{35}XrO&;X+-Q^d z5Ov=Dyr%87n{Zd3v|u+^+ZOz`s%0na(-;g$Ta4rCrUF+HH63Opsmgh&bSw6KW1r<^ zUw5(xt_!^mA)i}^cIQ2tdW&L7Br5xYf+o-|yZh7x?d)Z^^zm*)MT^mI5FyKEvRiiF z^A196JF*m`3ZW(xFEaN0a*DWTX>|6P7o_C3)BT1Y z`aWBwUP+j~kG>sYAZI{JTG@ci@71;hzFLtqE&3yX?ifWdHQ$XOTq*rAIN=p#*_ z9b7CNk=JuyTx8W2=s+2F;*arBr!*3>d~sPWm{{)QCNb0`AmcV6o{x#Q{5E&=%)$z> zP2K%KZ$&u`BC;mqQ6gm?EyGM#_1$07U`9z`ISr5C`jCUS(_lQ*S;$oJ6X))W%Lr?~ z=c0Xg=(R*QtKYrxyXYf?nHGt%Q9IsXT%;@)CmPV9qmg4$B;GN1dB3>xYOL03qHnEN zNebNakFf7=10SvjAq3k@HJ9DT-;w_Yp$E4e5H75r9?t(f)#1TjAEp6G$?+I8c~f>U z3Y#~id`;|U>iH&CQ{*?yheTXhL=?-6KT<=h(%tepRD~dFgSn{#s90hO0;_KZhA_0t-aQ+YB;`)$Wf;7_r4nt`>f1NcT#&y)lFCf38xFYFY0#RyJq4!-2= zC5Z%89yqiUTG*BJI8>XSeA$$IJjA|^eMpm51*_Xsl&d5+t~)ZWJr~PWHjJyN9~Ts( zm8XrFHK%bN6rYTv|LiyJLyHvF@(y|^$Og;TIo7ZI4h#G?QJS0hOjcf2jjgl9_T3=O z7EMg+HuIJZ(w*vPqqpJsiDNprE6O3K)+hEv?9{o4ERe<5bw@Wae|I`Qs!`pv+#L6p z%u3J7bhR77^~F>6?hVyC6K}a;!|mb~MuU}Mq`g!g#j44Y=)-o6L#nvf#a%-xzLFwr zni()XrfrvL60X%<3d#xH!Hv*oPz7Ug{^Qd2i-XxFmo_~j{fT*vy~y7nWApsL8rpu! z!l4bFY+pRxtMc)ayIYJDV)PQ_T;e_#Cp$m z^xidXI8|&2@zBmY$Q49gvaX?x<>n-LpaNo6^>5?`C~SlaW}wImUcdI|3%tY> zKT94MbFB$n-}(i4h`YLmm3I%rkXD1ri+UHW8oxIbl35CboDuKsXpZG=aXP5PrG^S& zPQI){-%xUH8@O@oGSI9H<1A!6Rn4}G88)9A!x*V#?mK+0A<@>_e@KgnzB5)qRgpAF z9b0`x=dZSOh|tsIbx4sw$0EmP?j{##DYC*jQTjQ2aDe1IfdkiBEz zEiQkkdgztzM$3voH(IiYT+fx=Qq?|2Gk75{ zkZ#JkE66?tN`xc-lpp=6KR)`0Q{W+qN+stE5QP~=2BzgF-?utFW4U|Zcs_^?(xfp4 ziQ;0kopo_-B1o=9v`qx$MZpGhZo>==hNBJ}xs*Sjx{4Q?bjRS7)3#3$b%z%3@f2O<~a`Xazge zni(t)%0~ayGfR(#7Ii6IbGwvl>)xDQ?7F6~RH$8n>^VR@QxTfRiax|KmG?b-TuwB; zjm!sJ!Yki;KIkdT!(0COlJ!QaMR_7$9Ne@Mb?<+vo@nFbw$YGW`1B>0d{hR7~F(|tA#)Ef(NKy5&b&enzPGz3lzs>+-Mj~^Q<)> zdF4nWK2b4Z5B(e-ulG{Xb!+RqMS=F%I=5H5#xo6qUUoOpyw z()9_C`ZMve2MRRZ7Gy$8zgMcD{nem)*2WVd7sG{A;TACk6z=Wp}S&Xo|--MKAU| zK4v4L>SN;R^8r<~(}k`Ms}#v)ZyGja%!V}<{L|7lnq4xHlsCDnCuukq<|TVCsl`LB}c;@rMa>xt8Q5oqI`EL;^hCQdB3G6PL(b~)ba zVo{b3m9X)^Ib)LCXfTP^g>1VR*4;CY?Kd-sZ~X`<;?Vy=$vNl;XR z$#;Yp&4m8>K}5#bxG91uQ2&nz9FQ|Sstjx840jGa_1jU9)^KRRnx-A4bXD>!+Vc1Q zl}_NZqI1UB&=uP{OUf{ZxN1d~X?Hvf~`%YP42}a~G#k zuS!59p7a^1Tj}8e3tga2zZjckqmBcACQ{u$YA{QGs>+{LCN2oqU zeN6Mcmd2RJdt~3($E*!`|;+iv9{*3=*P8yPozg;+VlugV>+1YmN^Z?i`3#2m{) z9?ISr##%zF0+l%}}G^rS+R?&h>pH=P=?Wf_c?H za-m9Q<1n5}Z^8aS0<89Ybxd(KrU}HD740XA$!G=wen1kc2!Vo>CHXQ&7lE)@4xsLm z8d5!(XqeWIWIl z59z}fKtnrZuTIOkVDjBEGQ<>1vZ2~T7^upZY{OImedUx>4^+F}wDZ$7N`#ar{ftDC zKFhR8{Wbm%4?Lz+u2;9~o&ihY=P;s@-6qIy(2ulAR#;v+y@O2`1xq80snR{}IE~$& zDzX46(z_{mLt|=#+B6zH4TQENL2D?)SEkp!`06;J1M9KRs_chn36(rg5Qps12BIED z%JHX!Ij(wE&rg0`@sG(Oy`Fu&i+==Rn=kIZa}sJ$k744nXt8*&bDfGI?JiDV<$AmJ zG^i1^%*KhK+}iirv6ogVagP29$$DREMVH%CYwakkp)s4@-;=A>U-}^JLz*z;X@y)* zwinY@kTCw0i$n`abuR4#6AZVFHi5sGWy1Vd-&~UmUNU_-Ox-)4W0$SxqFN1yQ#P?@wsIx*!{s3p$b)XY*?< z@(+73)t{djKeO9say5`4YH_OgX79TC?M{9ThexcMhd*^ptCjEN7LoAci$2XCv0?%j113kLD%~dg7B-z{5(eI!akpnN}9z~@f)jAHkYj{?dvpXe8 zv1mI!dpb~fA+_&9m;R+uy->S53*Zj1upTODQk?Ob=^4Mez5_j>2Oz$R4P+C7n=x8$ z*|o2KnB&u@I`$7T;e569Wyj^vd-I52-=IZvprAyEHX@=^#VP+Mmn2byuKDY?XqK=oe-=29NiSmncbC(IS7ty1yp9jK&SP^1>taesop3GEDipMW*S* zI?{L`JFjD>BF@FRJo8T3%PZ$9MyblVtMtt7{;NmUru>#3ziYsjp&%ocHPbYR0xC_N6?{>oprmV9z5*&8FU-x5)FE)5^w4X}6idTs=R_sharuem| zeY#h%OE{*vJ1X_;Lnu)jvKQz^9j&xyZ7J}w21)6M%_CQ%cSi&VS&idGMhEjnnPRi3 zZoB3>_^YU2$_wLXPxxkzt;&p4zfwreqX`vvI@&#k+D_3=isxb!t4av@EDJ|@7W=Ho z)H!-d+1d}#e1F1s8`!#6b5axn^lYBnEtirRTA?@QQqy$#Cp7;>awHk zaATurUi4@FZ(6_KM!I7T$8@_GxIkTaoELbvu9bq1^nR4owUn)^cJRy0D)>xiZl^uD zs#<9wF0skmHMQ2JT!7$rZLA4;_VbvaHhgt@?k~8^fBE_}=FEB$M%ihDcjciLRYjz4 zAu#hx`t4I>o_;jt105-UK{1%i+Y!A^eoL5ZfJ9ZS=EBT;gSAb9$D_v_my-P9Rg*8$ z)Goe4?pl`9T&8C)+1Rer4b4dI?_-13-c3--CXnR>4C9;)BR1UAuccmmHPG>pWD1U` z$?esj2WnP0Ux&9hbB+3#593(N;NkDgrUyHrt@u{WS&J;&v-0+e`%3Jb?Q zR@mBZC0Ue$JYxSwb&1AxLVIF1-PN@b`=PD9-sro>nvjJH1m@h3Ia_4r-muI13UO?| zD3IKDmg6^Qx4fj?PM2VoD=x>iHZ)K1ihQ^LAs;{Oe9ir7Pprzxc@y{MqJgMM<)?bQ z%Mcne!}D^9QNa({dlwJJ;h8qVZj9i9A$})N3WbDMI3-*A>f{PdXFN$My%~+CmznE% zk;iug+}`E|9O=&ZAq2Tjr*d(@h>stbJHL)DX04~7Zl=`r_V(q?$%})_WRe)NrwYDh z0m1jb&eYmed@(D|bF_D-M+Zu+>0pB&rBxO(#RJ8r)>&zXOE$@fwJe0o(uYV2# z(B_hy6kD&|{Z=oKonpbWX6w4u+(L1pYb3r_a@Pax;4ZwUzd`LS$Ipw)U*Nc0ym{g# z{g(bk_Q=hRxYe2fgYHZ+Wj?FXy){J(@FhH*!(8+i|G;K9nb!*r}uLW|cV0OU}F$ z4Gs;In9cg`X;@t5w<4scfVGJw1NlhhaH*2Mqgf}N6TNMaIp6@q-_*X>O*FnP)$B1h zU|$%B*1*YjHS7g|H;?inf(FJOOP^4`z-Ta5^M=mUlo_k z4=~n*&qt&U z@Sc}ZDgl*{ZU{V2A(m?i(H}9BJx;ueH}}>)9`z3uC~GC(#Al4nSI&0LCzbvNDf2$( zG)%wVWJlw>gQ;X$3|tFKzNLCt!9?;FG-yoj@}X#?T=wH+U63iWut|;7{FKD*c37HL zytCMttO;xBl7}WRT3ANAddS44pij0j@sY8oA4Uu{l0+6NFQzn~j^|@cIZOA9F0x;B zEguDO9|$e%?mmU$vM6dh%te+6F}Hgv-^yNXt!k@JrGdwBBR*7A&_GBNp9%>ZDK!%C zT@*c#+^1Suy-ZMO!11xg-FeL;7}rMpoxVG&)wL645KWR595o%C;+FF}~7PrIG_iv+^& zi`C!U#~f8LS5662yGBD^<{-XzoLPPLn&RyOIM(ZFevLQ+hTUr13kw)H$qm7xfgT~0HH?6F?SSWY%_MCxcoM}S;j zfE-tr+DIhu`+Mg+_=$c*Jan{CBDVdYn{Za3db zyt5uJmkLVO9A`0VY#u)`^naPF6QzBzT_@zBKHN+Q^G;tI#Hk{uJ|P{jW%tKE)aC!! z+%`cCy_HWQj;*w3eulIZK6xzPNjbBoedSg>@0ze;-Dp|m$mfOW8r$RSYqa`4k127s zxIJdbV)X}*k$NgL?1B`k()5c0%0(}FtkXj_>V~;wQl|r}5$Vhi&{c-vEw=;C+FyOLU{LQUKU7__gVSJhu;<{uEJJ!&c2*9tHhLqvD=_wzm_5# zV=o<9ZNl_Ymw}O&sNYCtl0`EJ;(isx%^xATqAgx2MXNZsO(oggbJ)^xU+YfC;etHv zB++(n4)YICuJ{~q?(E!0ge^~AFfQnoX< zJId_hC09d;;n_{r-o1;AX?t2zjm&NwjSjzLY(oSH!!~}J<|E%mjdN{Ir#*p{cbL)} zMY_gF=xRJ1qV{YKPDX5KqXl~NYFy!Wk6Z=y4}EN~=!8_(yrMj;VP?M$#Jdz-b}3iK z3yKa<$#q(Hn@KSymX*t~94@-kTd^QldpH!55g)gCZ)93S`o;jUqMHXv_k+vv?rleX z(t@jr&XgcGc&iV3zT$h#%Sa*g8^p1vBT;_9vhu%}I_tNl->~mbQBb-;S^<&nZjhGl zoV0Xzx3qwCiFA(c?jAj97$v=tBYpP0kNdcf=MUHq+p+8Ve9m{g&WTf{@ujPYL`<*` z*_s@=PYW|s&!m_s>C28kjyw)#g9ta=!eApF?K_W*>AuNfZ4$qUmq;Rb{O#eIZnd}OO$^Mcj!toeOWj*!EuFUnZ5K#oX)u8uZfT(1<@;1joFBA-&>oSWYuZ1Y7M{!HByc zYS3R@X^MOTO@lcL`?+)h4qQ{l=+x}$H63rjCqF)xi7ZPhEaG1Kn;x`Lmp-a_y*hSq zhmKfrAQ{YJnceVa2c|9m7Ua9djaom=G(2AIaxZ_7M8rxqDkT#9l{tG)%CELo={O>| zOkq8fH7-E5(A2-!lhh|LVLMZIBO3w780w~qSen-h(~=6>r<ymUt>Ycc8~b zBueHHjv^xsA=!Ta;U#bN zpk~? zl0JblNP<}X2cSFQ+KP*x!pDZ1aykh8UPLS)4AfcWqwP#o=Kt*;Q!&EpCExuVUF?TS z#x)#ilb~((cq$Tj>Pgy?t}E-H^uGSrB$9%&aWr$|rmi`~;-$~Yv@->-aK^hZ?`87pF7DBhjQIW0{%{_z)L?k{n<=%Zq_>`E@r- zFxfX&$3J@qOm>7E!~X$nvJV}yv>G7hQTEs)7NHoXt;n>mNWY5RAqW$ZH!|e=wYxso zGWOwcuABKEAT;`@-rH+v6UReXcG-p8q%!Ggj#cY9eD3iBqF>|%^jOe(LEoRV@&$)F zo^zXr(eBHE;58SMoKFu1UWPdvv!zx6Yn0AKw|{N+f@=)>ku^mT2P>y5zdoyTB}*cvMF`s!!(7FEW<7IizsZfD^CYl~iT%%?ZT9YrvJfGBw_X9BO&(l% znqX&TpR}Y0X#~5mUt|5E|9*1>vadKsrS0;At8hVgDjzq<=A6tn?|o;OM2C_x+gl?V z&d)==W@s$I37p1_Fb~_4xOF|b@|)&@iq*p(JP?g4PLPf*+$lkv%Ku%-qbM9JzPrVS z_j>B*Op&x8ec@L$RfD?$C}_|Ek(|Xl=pb5BXrCMlYv9y>%e)7VK-n|d=!E>Vts7xd zAiUX|4SA7e1OZ92s4HqybtNc3Q%@3UAZJ65w<(2{k*=;?V%Itl3-4ViRIR7^<2jIb zzKrq5!x+YkB088`Oz4wDSIozEFI2b@x_^fG3&#`aApD%VefJ`POzW8yNVu7OY%%IVQ@sozw__7D z*z>&~HRX}BBu(VrmZ#Jf#WNf&PzVyRlTU~Y6O#uu0}R$)tw+4;Q~!hhNP@KY%lBhQ zX7i0BOI5TS!OSxr0@tzBTpzv60xhkk1$nKW$4Wy#DW#AbS$gKl5#?`Dij4ezCq(=Y zKw#(_S4qKl^S5K)iWG3$2l@l6OD=w^CFZEING5BQZNt_9#n5xe#N^<-M2SlZ4k`o9 z2fYnkzE`hrNz|CF(J*_%k_|WtFzCjGu}A1Ch18HyrYMY!fk8c8Ua*Pp9FK9h-iJnd zoq2g5N}C)uNBgu>MH6R$n1Qq1=y1Zi)#gf~_?GaopMZXt(%mfPep*L>v$qh zS>vbCuQPW!A_h3^`EHW2G|CUZIiFE!$^neN8&LWq!vpYJ+PzpVPPBy$uYE*oGLLg* zn#eZoYVU~REfDKbYQ|r)xTLVumUC_S2YKozt*=y)eShU_FPKa#kzahBtj_kpz*uTG zPY4p}?|?Y9E0jSdAP%A&e`gzYi79a%a5BFvC8dcP)4;LadFFleYFn5BM~Misr+*rL zIO9xAt!qlBM8U@LA8`j4*xZAn&uWw!aTRVHo|H~ly1O8)AlU?<;6Rp~$no*FynlcP zM(?wop?p#iZFBC)3mY9P^5_!RIR!4&rat=%?r9v~2Y?$e4+vA9^0-cn4&>|j>6mr4 zT$A(Ad8F#32`mWS(#_S$Z%Aic#L^xr-kP%@Q$N*nX!8vbD7lLb_0v$4_>yN^xGr0I z@RhIojd>%^NSA2pkh{?($vZINQZ6CB-V39R0%)a@i!fdGx|s0+4JK8vdDiyzKL8a? zy-(J`6!Y|(3;4Zm{`X;xUm!s`C&dT@@S5B&yFiARG4xg0+mw*pB=dwWx7A0xiB7wn z^DEbtgxY&E#(#iBzjp@jy2FujrkAGm8C4SYu7odf#7}l1*>)RDO^qQX zJqyWfCq`$ELCeQLPEDbBUE4QTfrTfFN6%S$zO$1!dj@Pg8r`?`6+)feb zTb;@~3cHtC7yHs=p-M(=Ukmec;3gzhkN(PvyNA#C^F>QFdXz0P@$Ka!#x)rN2R%-{ zdpj`IXn$>%^k=R`gKav8-@~L!qQ5TV;k95LN?{1)7o)Fj6&+$D#w;wyhi^J4&!Yo{ zZL*A0Mt=8tJivC%{=6g%<-(S~eXRV^9fed<@kJUcj=;q$EvOKcG(EZzDI7Yg{Av%R zD=M0h^&w$p-gE?ozICLWca6ozfS^~rTQb___e7P_uCJ>|r=B{(g?s$D5!fJcGVs_-}n~Ogr6|+}Lo|`|&p3qGUt8xN#C#o;B%atxuaPtYg zqCgp=&h<`=MgA*dsPX(+L7VZsBCNj*RzxQ)hG#ps+%?ok1$EGp9(k{9jhJsc*qkxQYuvA&Hh+DQlG019c+KG*NB^$E z9m0JE=Bi?bsOZ*A?k6!c07+*+R{sb+1S9E<;GorXmV6S8+<_G;`^$-yj2rOw(1`Sp(9e9vYH~Nf5pdQ@X>?rT;J|liFr=2V%)$JD%1P*4JpO0$EopBc?n%zh#UG?mm6uc1Z@adJOngyymPd5 zEaXV?<-UUFJx`9MRbqSz92omZ&a;%q2D_eAaQG>d8s7=BU%!1z3Xn4is8m&fKWA4D z$G<)yu&(f_FmhQ#G3kQ3uole^c+)J{$Nc2eJv^|$n?V`*k~oaKXMva^f|ZQ<3i#e$ zYAHDqI-f$0Z`JL94pI3dR61ZYftbd0mL}Qtq3OS=rxWcSA}$DMXW|Z81P_*@MNex8 zi{nHvnV&!29J2O_?u2qu>u>XO68J>`Hdan z@gc%*6)MtNsQrS;{Iw@M?Eux> z3h2o05{*}lvOmEN7=yM^BUc6Q);N~i{K#u%D?8?Eol3# z%?bL3_t+zsHEAO^;jleO>P_^){DIS*r8_F|2;Ki#FCQ=%eH| z2J@nJ$E^9-F^@Wp%Y4C*6S{zrmQRHgcr>fk|1-f2!TjV+m-t9~z>d|tex!zYBx6!f zQcVeXs6Cu1@zs-rWs-^u5C_p9pCZNRS7>`n>{3Qw$c@Z3&A1#I^PfEI;8597(S0+J zTj1&4(;J`MV$)4ZySh1-@lVJuI4uySq8G6!&|KDy2lt4)gPRPQKj1{O(B=(0Qe9z= zwvJKiu^a#H67LTbZb7(}4Pll1z6V7*?y4U&Fb8D+;22U_r1s9qx??PIJ%4BQ6O#Zv zFX~QLb$b)fXhooNltJ3%O1z@uv;x z2s{aB-w<8(Q$}B!!$1ocCtr@|Z^3buRC1=PeXam;lSKl@xLwR-8>1767sG<)ryHH~ zP|%1I&LexXR(son?C%3k16k)mx446Z;V$nP5BjqVw=!1MWbv&MH~Xbdiox@^*vX%} z>=O= z5D=C+2EMODKtlg&98sabb0elsun0Zti!_;>gH!Q4!s= zh_GG_(2YqU4*@RT=vJ_(I8(a%qK7JxF?p`kHi#~;M0MgGeS4=pM0a%{3wtT+IpiB=AIh3=d`u;h$&ICsWb za$LdyZX+EK+~Cc?8+6du6M-q0ti*U;jD2gH*kNBEi@3n1;x95HJnkG?723X3b!A67 zX?NCn7~XR5F&d43fXoA;5j!z~S=u$KZ8j};JfXVta})I{?>vR1q3Pc`oU@jm_P)@z z?;_F;Ue2ucUjt;f697?wl=+@+aiI%4t68PYKUeS57i>?irp$+zvYLvTmzGXi_b_UN zpX_o-ymb8xz8NY0dK@n$YT5>e1>yUvlkvrGlUIXoO}@sjif`1MvHzLhv0U%DH{xrz zZK-0x`Ma<^nDI?^&Z_b?oww?DRyJr)taiO6KU@}iqN+C3TY$DFu5%)DD~9VhY-Otb*ONw=#=+NTg)s68Gac`_^!X zPWZ)ZTjG+G^t>So9V4(RH@7)8yeE;9Wke8)dNPy0Bp)vrYRaVWn*2xxgCKloOjqTE5G zZK{_ip>~F?ju|*Lx5DzYO=E2`O+pGY&}GY!Do(HrnJ9sV-;w)B#>cUxW^HZxsdCW%bH58~O}xV;CxC)P zI+9{fMO218;n5INXlQ+~cg)U_@Pl>ykSxxY-6Wg8jmYIhkQ-(?2_|}U#;$BBGIGSZ z)FU{}JvQe^2=+q@j#pB&*7T@p=!Xa;raGbHn>Ohn)e(TtdP3n!w<}`oK@MRp)txpC zJrg|BL^(PB@D5d5{?6;5m3Px*b1LAYS(Z}mq`rDa9j0%B-Coa%T`zH#VAL=%G45LD z0SO+Mtj)+i&OA{<**_42xNh+uV1+zT4y1`g=9HE#SZ%#i8Y7}!#zRFuzqIsP!0vEy z_NO&MesqN9nFuv|OV~kI-xxU9p0hI4_ag5j)972YgpqP&!M3{7gQ&Q8q4po(mxOl6 z=DfgZLTbZS5W!IvJdc%X`amN$c(8atR{W(T2n144FZJiTOO-X5dN|IwCmFaA3XHd) zn*LFk10j- zfE{rHRZH79SS5!kW2kHJ(LJAD@#vZwaSVj&fR_~(wL+u~ZTcj?n>4u*h0AlpH_?!L z$n=8{n~G-n6m7>buVtf;`siUd10owb(dY0RSxl%jxg{%dGnAJVpkV1x_uf7+2hVk5`D?(dp&N+&K|F-&7xT3F zlgU~^N|%c|lkh|YmTy7?EOz@mY|sr{B-T|%vwxtYSEH89p*op)7NodUsfY_a)%F>Z z(JFuZlxGa3jx%A0Pz-E~zp=gDYb8nd_3!`mH1SaaGFnz4-U>)v{OD>dC75!4FR?a`hsNZnl^wOUS4oq;A+EixC#b>8M z)uBaeV1J;!1ewDUPu92Bd4IR{5ZK05VFVPTQC#g1t$I`L&;Ob5CT4sm3m`oS8g4o5 zR4z4Gsh{9@onh(sObE{`VJo`(+NM4qHBqK%v{+nTSm>>S#kI`pe(YHvy}FCbxV*Pz z&QQ0d^V5bU$(AL)DSKSK;m_87TXtfM0bAPm{*nBk^lSZTff`3-gmgIbb!Y6ij>#xm zC(W>|3;M{x#dK~JIn5!{f-^~~Nla&Xbz}7%4L!!)CC5^zz{-cD7qkgnf_=9K)!t_Q zGVqqTGizi{%S);)X&sx64sZTxTW<{JwuAQFskozaNhKba%A%HbJVV3xu}ap}CExZ6 zwyeykER@`E;)BQ;u5L4H6q|ZVeZ>0*c$*l1)?`zBd38!+ou>C#|1Me0S)y-%<{W5O zWI-$nR)n7~`)!9keniL>eM@(f@hIodq-*hWqgyTZBG0&3mEN*0_G1k!4(T7kQKs|H zHK?ho8Q$8}$otu-TQd2Iup|bHt}0k~R?b)We;Y6|^Z=n4#s8(;{a1vJsus)eowYmT zp=9ce-bd5vlOC|}JY(uRRTmIWP$7&nUn+sb%BQwnun%s&^mfyRGenDULY;7`p)+d=_;%%~(iO=8ek%8Amp*gE zPA#ZNOc)^rJyvRl6Q`i%mmlIBoT@2(`Grf{`zk4IS^z}t_Yc7NYE~LuO4g`fVZaLw zJ{1^{*%Fa*>okc3Xa>$}GxPYc74Gzq{AHx?i5KDAW#Mee^sshr5&L@fCtA#ed$Y;S z)w`#EgBIO=Y=b->s<7iu`}{Bz@bdY6+VtYwl3c>upM}5OoxPbh20d!fj9^Y-O*VAN z4rD_$yZZ_S?^0D<{qFa>^{aUA+U%b%|Jp1L%D8U)y)^6+Vy@!&X~gcF_>9^H#6z%w z4V&$hrg#}bRnx;7<3fcJ{PM25Dj(nFD|Xv-QbQHOu_pS;6w67s%+DCl46mwkrJo7% zafTxe^{y>6!OO4eQ|?|I-Y?2>tFEZ$#_t}st`r6A4DsTG|9BLKJJhuOPO^5h9hUzb zHHAKi>+MMc^NYFXhN|`^Mj?f~)6-6cA{*6WxxkL-&>NqZBBtixO(0atC1j~n6H1c6 z&=EIO?hVwf`-zjLTW29FdS`CX^AhRc7&>7Yt|4TPmD(3ihv`~~IqrtEoRYsh?ohOp zngiu4pnI~n9U>Xqu-SZ(-1t9%gx(YVYAD-@#5^gWDKZ61V$MJKCvs{`O4L-33Ns%$ z5m6E(Ri)H+k?cjN|gzrK&vY?=L%AGmVnZTge{p?J#6Kzl#M&$huP zE23+Gg?pc6e6u12D6C1Ov({7))O%wy9|vqK*1Z@YF6KpRFsi$n z8|+SdS+gkxUy3i2aCC4g2>tR{ki&NtRd8r*QoW^$jcD6{o}d4<7{j`&Id9_d5?*xY|Dy~IsOGnGQC7@C*K$jZEU&a?y6+3e9=Cc3WLig(|8(^4 ztq}hK;(=55C!*OUW!A9fE4Na+>XoK_X>mk(@kd8C8!(F^{R#N=ap0&f)DY z*(CB<6%{;DE>!F*V%lpCmKc#a1*&;l_b)vY)z;1Pj0R`OCN;$EHUk)v170KB=_l*O zLqQ$^6%&pqQhb#=aX*6kyCdeR&g1Z>ED4kY;`%4w4o&mgYl$$(Q_y!4_H6f+EZeeM7+w3C= zwfN6fm(&pr=B;(zK@zgl&aCX|IY-yzwB1ahI+PZZuo#`tRh_u_N(Xn+mrwlY;JHTq z4U7jvE7T*w-5;YPyV|3GUGxWgF?2$6hkVW9TwV1)V?qlp^|A8iPQoIu4@AL^0yQPa z{Wmj+z`dsEIdUKEZikMH+|nGBe1j1Ow=XbTSr&CCUiJ)Sp8+O<`F*t6@4KEgaz^mi z!zKDnN{L)V??&xG#|VhS#{-h_JB=f3iZe(9Pcgh;mQ^;tFp+Itwoi~eHe^H=jq=5@ z(QqM@j$yK^gS)|ckGX+5Rjs9ENkrA{28grVH7U4aX<=50C=*+(?WTZvg?`Zuq}g0`D^A>&3~mZ5On954%~>uQ?A2>i z1$WMgdUs>aA2}Zcy$6P-ZomXbOB)1p&o}$uK3bubj#J7XG3RFAw9jAZvAdt6cspWo z@0n7x;E^t?aF9CuxWL{V?^M-CB<+Y(ZLW*;RGR=RIT=y-{w`S4U~|X7Oj+hRQ%fIO zZ$)3LVnph;T^sqLoosIDzXM&z=Hnj|Kc3>6NEBTk)r@=7UQ{_)-|Ws^38xf!6ZGBO z>wh<8+ifMFmhhZ-`ww7oeF|hKu9~f=KgVu+We%D9O-49tYvWmG{N;2}L*y1&CzGP! zl_~<6I68HgP3tv2zy0R7U;Nf58Rmy19e>&LCpHGCLfkm5!Yj3JuMQoj1CE#ds$oB`>S0%erw z`qkopCn%U%t_`)q#lL4OzvflSZ%n;QpL!UfE>>@WTlLu4f?a%E>96#`;;Fv8J$QTIvO*jl_RmCaDu|vPQQ|$?jzz0)3cWuf4zEU<{8AH7(xK$poE%+EEhe*# zaX5Q>i>yI6YH)XsLP`-^HTb1e@~9k8{vTl4E)g$%&M8Zc)tuTbtMRF{({1~Xm8Nk) z%C=Bzz~#aJ8V^BhoN z6=@jFOD4iWu5EYSIEX0aZyU!79r|w`=2k~ZD2F{ExrPjV+PdmC*)0A`C%2;(2x>TE z_|m0Pu}Q}%%~Nq`Ue~hZUXLO#Fxaafd@6rLITQ zjZk59u{hM$H+3lmN{x-5wUhvRu_T`(FAkqoGg#{@+uJegAV>4mI)L9V_TU6A`VOa5 z1X&y_A;B^1uk|v?(E#vP->l=`kZua3BKcu>gKQxqm4489B;TkZWdR9sVe;89549y7 z_cESQj6k2bwbBw=zrFcZ@0V<^_c%^Sb$5Ral7%%A^YeYn`usftb%(s>4N9|NiiuN& zH@hLMxF@?*!2xs_zB^%dDjbsZG@DR*#jC0W$COjoXWg(P&luL7e({DT3@p}ko$=)X zN1Gn4@~@9}Ew7E=gyyFGd$X#R+B4~k2odwmgeK&uNOGKy>A~m$#4v7jV+3-oC|6PV z4~rNzb>i$)&8T>yT>aSZG(ZTC)Y#Tp6l&m#Dd<0GTs`h+&fX` zl~i<(ZLf3wnafj+l#ZlZxxU22752dnQuCytw5Aq+n3y~R%~yP6bTRelg4>6E7ckUq zc~E`@nq(DL%UgOhwrN2f-y>BZ8kBpjhbzhOCm0#2$=~8X4Kfwy(l$V`eN&4%GcH;*rRH?f>(_vrh&6V!qQ2EjbW1M{Q%T8DF z`6N}1Vc8E7XDaAnxxc$V_^@FYuj?7-Ex366ZcKuSWLZad(w7gEcy}lpimLZsSSl>0 zPK*D!lLO3Rb&?naJca)y8+Yf-$gxhwe#4Mg%6mOBtQxt5lye&KEAbV|RvwqqQBo*! zP{#l}agZ_JVElkQnWr5?PJJo2F%jyy9xibGV!Cd;k!Va!^)@Vz<~M!9{v^D{=KEU$z2|&jT}1y9A~M;zZ~*YO1Mf zunUW_X*`8S0dk93ISMMM>V zgm~!{R^pkvZ+Npy4Gog-i2Z3{B)!jMbNihg3C4CBIs&P?SsaD};%pbfSvR7z>JJ2O zSXfP)v|n*o*{U8f?=x?%@Pm`={RMy7u5|uN4qcg?Aosn9QEFLc&S8k7 z^|`*Wc5^`i+2@W*{IyvaFsozF#$%H?`eM8N*B`I#ivFg>jyjY6`ih2zE-F=%8no2e zFeu*G68tFa!oqdr!~@UqaWNd-xkR_inh&z@TYUiW4?hcbEbdaY>#fm^uU+02QdQr@ zTsaVI16$^OUycY-aKG{?0pr6@GsV1i*G1{VMInMADnN^&HEk|9(3*6 zuK?b<{rp@fvOYC?sfFZnCR7yeS63kH*=`!UmB_A2;7I8N@Adj1@_y&PPo8`$d9fWV zikP-L-X!s!!~3;yNc_HWHTyujrQr+H8+qoBvI<85_Ym&we4J$)%@M5Po)q`yqxw#} z0X|uyCwWjoB=_sc;*-PK&B?98@If8_`OLi)nZ%(WlHXm;d9@!BsPqd|#NyD3y-cVP zST#q)tnASu8my$PgLno-*&{)j6lPuRV`PWnu4_-_FJIK@@d*^oHp(cymW#)k?$Teo+{ApI>c*G{J*h5CX7KQv4ZSFKb9Ugr-`kan*g95kZv`9zirXOW4?L;aTFptTNY8rFMyZ$ zDQ?f@hugg_k{|sW%jCI#RLr~QYo1byJ8?o$Nk))Fiz_~chkYImnh zdv=|i_e}l8i>^iy4nOUW0(f?6Xq54za=*p*U`<@Z^0 zWj~Yc5ezy{g&z6nlg)t~u%Z==f`Q3XDzNLzl=C~C=3KbbfY|#GHWtSau3#lLIrV&1 z-y0=m1D_h}`i^F;;Fs~Q>JoERff;cLMOHP++hDW_K&%F=QCDqLXvB{RDWUk2J+=^$ zag=6w-Tr{VSUQ<7ime^^mfxo zm$arORbb=0A{|V2%L@|fcM3E4G~XIEXcI(wN{2hBdTf;H>~6JCps`U3k|RE~t+jmk zZocqrSLtUs3P*C%wz1I;OoUOtZ@%?+qmFTR_%MAWFR8#gzhpPsY6jzKwWiSg`@Hzf~?RAU8$_~3_)Fuchcs;6c zbm8YA-Q@lfjkDLW@xl+Z53Y-r-w*p}F6dlWwVO-nT)nS|rk0LQb9jRa!p6&Qy9akw$?do8Ty{i%9fvXB9|*Zt^UF#vl)T*I zjZS{JY9Ift4Qg)rAl;iHkvYOoF7udvx`9jrSJi1buOja{pd?4&UJR1W^LtxZf*w1MdfW!<6c*hx}n`Y(QrDC1#z;MtRRIaxM$B~z7R3p_kPgJ zmK2%K4c_VTO}@YVvRGi*7DJvUzVSjleW}}1AV$-3P`#z#OseGL#?AwnX{MXg+tBz2 z4_V%=X>N?3`BnAZwH_PPiA}XpR&FhytrW)VriHNFig*2pRV15CrGzmiCmt4a(dBmI z3%hblYh1Lf6-_1Ddv~A7w1Y``{#Jpqru*Z@qb6UI(_0&%H3E!y{Ha)LR?1E!*p1y6 zMjgHR*8TKTdTk7JF*}bAfSnh%(NQh8l~-+havv0J2)O!2aNjc5x=HS>GX`|aMhaGDk}#=i_W}|J>;6~r|d03$zyI*Pf>3cA*63f8umavERONx z7pL)&=UggnnvU#$Y2}Wsh@&-so{)v@)X)~_6wv&er_QYj4T9UB#5=mmbQFw@Hyva! z9mkq*({Sc$W;rG``as2=CQ$h4jp+!*r(rvk;SJvT$G5+XjHIe z4K@1T$Sl{_A155_URLr{dG7{`YoP4_k-tvx;L+{$U2pJ!;^H>eeimHO! z4Wrr4j3i%~vk3PDrBe#&GD1NlYa4$iTnbSvQAMKFC=@;YH(V*;!HUtabFPX$*S3{Zi8|D^+fB3i>2?hT;NEsdSK}?QdMTXs6Gzfn(Wm2yB zY|sudmwn)hOoRG6B#P|%K6^M`4$S-&(y)Ez>-59W8?~s5kLmnnas7@|z;ucY1bt%I zdWx={D=;=UVH!5<8q$8d>#^2Fk=Wnq;V!BRO>G)3EgNGUtVi|*MQWoc>*AiZVJRc# z-1_anfx^wUGnGhk>=dUgIo%!53e~MjqvRx|o&y=uB{!2n7s?)5bH#_-F|gPU7ks>Q%%6@k zMlN~9SA6_=;!+cwDwiIFNbki%w;NjT;#?VSV<3Lp#{ncNt(w9w5JA@!;Z$S`*5pGQ zIjSm7X4FeH(%YxsDCGElj%=z22N{g(cfWlqVy}Q$Tip6$U7v75H>g@<)w($a1X zcyyAmraH8mr&S?&O(PmbaLb)Qen=;CW3^Di1~UrW2;N9_ku8)kA5aUPAG-MAMmq&L+V=XgizO#}3cH55N4 z*~~>Cyk*`AM`QG|o$>lG1sxr*U=0L$PuY)PvKr=Kw>=1bPKRD>GJZg5gg^V~=B__- zz_Ft$Ha5y^b|y>}Mjw{{D*JVIGt1BM+6{SK^%f%rzE&jo&~~|#Efp3Y|GI^p zpYVQbPs|pH-Upk-9n08`PLfnUE+4$-9M*7(}M8rMPB>dDC`L>hSw9O(rMxWHG|)tFqfx)4*9<1&+V0M z#xI(%)*|9zW>~W`*M-UF65BteIVcN%wvh3EEi{oSs#?IaE=4KJ&bRu4=#9NQN?Ya0 zP@KYk!&G0wXF5XC9keEI>hMli2Pa~8EX42^+F% zCHRvS9kp#c`{JCSlt~y>zpk7yg{pXaKzZwl1v{ z0&`l)AJXs!%FdQFHN}_sn8#=Q`un-`a!WVnTOJJ}3hGDVfbp4YYtPc5DCnO^ z{5f-r7`Bn^;&@A-OrdM2!$(_HxqxzLLT>XQZI~v{dSy5a{#NiK3=s}uW-Vm=y3KAG zfW17C?5bEC%_8>J`*P6jC!9KZRX(o#Bj6$ujUr%)cK)(vU_iVtPG*e)KHlz1kTw}o_ZED@*G6HG%6TMrYd3``WGnb*4`#;6f+<`IKE`13T3K$J$a^8FqNSTH+9EaISV{gz_X}(z*J1Y)I&4KY&U=LJMb>6* zqFQUCwUy;pS;9QdI|x!he+M5JR8M!Rv*8@&;uNilkTY`qT_<-^zBAEcUipaJ3c2ZH zUKfHmzcum%2_IDehX>`(7uFYT9vZ<;5MGP`vRR7-C;Y*bKANk(f0LO< zPRkGAz))FjrdIpf(Sy=%yR5LA&#=X!ZqE+rM3*F~0|$lz$@KZ6 zsIbXm3o9Lk%$%hiouBgKqv@!r%iFv$`kEk4)+t8*LQz+F>^`WEvyw$d;bLPX{V5Bbpv6R0`p7Xl?X(fLKpu^Eqyzez$enjbc<54)+_A{s|e zx0~e66SS#{E&}Wz{@lX)!=yA!YW~F%SNk0od=vK6wzkqg!83B=Ih`oNMfKstr>9dX?_ya~45a@&a76V} z*bD)x8m(ojr^bF1zSQ>TEj6(vJ3IE?xDXgcr5SXj!xcq{JQE$NO__gBE=5#Q^}6uU&dD z{pr~wM7ZrJ;lNW_)vHn?if&aA3ilDklM$xQgM?PlobwOGEC;>2HidD6*jjvSU#(P9 zXwji@IelFQa);`n)_z4kdCb;p<^~^!4!(OJ# zLz=@>Bm+7w6TYjPiQ6_fF7G8AD|t;1QK;G{q1d!5+z>L48DMvkADxFjkCbP`)n~3* z`8L%OpzmHvyWo#j?7frT4xw-q&-E9E0+(;M*J_p^E0kxMF6P234K}(M_6eGM(?oXL zmpSzW{>Rcw{bqa0%apm-dmV$fI=8sS(wx9gm5~(A%R^?i_=YCqZE?)L!_41Xo)UTa zTa$MNHi@Z~8+I(y3U9JQb9^IFQc@5xQR)aHxL?2goQ(mpWg>O8Y(LTQ{19Y%2N~(? z=GKjyz1C_FVEvd73Abu){kY+U((0BVj=q2Wovx=j8SO5Gg57op1VvmHPhJ=yK5g`O zI!6Ec;&(~!W)L+bPOgXF9u@wv$pykS^hDNB8eECy-SIemXI`e@{}H=uTivu~#Dgu< z!Hp&VxEkf)X5zzyH=)NZ+AndL`o z0@kHU7W=txBx7J;eUs}3Pitqwpb;g5+6y#+7Eu`U%ym#~H-2k^Rttpoe3lNWOW0+! z!#5(zKGQryqHhl(<43QrZhprX&@<95I=Hq>I#UCjsOD9d+y&K!;X;ir(;Uu(DIth^ z-DMz_zv|l=5w^LGsJSMA11r)ybu$!7UyBFbzGf4K*nxav`$^a6->F}?PF_n|t)LNI zM-801OY#my8;`k%S0J18^gd6_9r$}>NoCE}DaL+^%5=Wgr@Zh{@3Hg&p)WNnCPQ{n z8t83z6fdRm23WmcO0gD>4sc<95??>py8h(BN}%4}*r73bL3~NNd&)qYb5G`3T4`w0 zubbLDghSq?!u2{x!ujNr+{9jSf4DPy*n}-W z<*%~%x@zi&YYObl8`Nq<&k(45eDWWFP68?*C;Lu7ESE9wElh3E5w)qZcViAzsP#G_c!HwoW}XG!&8PAfpjsrIw@iHc!4TLf-k8)I z5H&!IR~I_3W9Ab4J`wGB>f1^pDk)wK!Qcn8K#K%Y&&0|7b~}epqb7o^IxBb~bO|U9 zSHsMT6TPQ?pKwLnn#3=be}j?rf~;-(cFso7ZS>An+c@ZvMyL8`7_im&*Ym|21+dG2 zPAi;$VAR4gv7fB!fELrL@Qs~x8=gO?crwK4yZl&sEyY%UepY@#%_n#CJVY)FbA zpQ;9J3$aMMq9DpAu<&$mtu+v-V?R=7z!K5-YRdRWN^=&-(5NPU6Hte?<>Pwmw zXIoe%AkeS7pPAKXxp+YQK&>5Ke7&Mx)(QRr?9VEc#I%DIe%2PGV~rRQd9o8b*nY0| zPX69a`VHQmEWyVelJEO)K5!qH&l-+D_L5KXsBqyyCr8IXi=>X>PvHj}zKg=1ZD4_B zzvcC(ig6)fYC1SJFFkhI<7)o4Q*_RmD&X6X9*5=@lzVM=1ocid;rGt>CBrp7S}m>r z-6Pj#PMF_3Yw7Csq}=`izCa$CUTjweXzXch^ndzI&9^6m7Sp%wjB!F-$Ga(gF@_x0 zfZvCyQwGuw-yN9sxg+!cBy1 zi8j4`65#KuPJ_2ShR&W&g+VosIwr+C>`^Whda1lMY8xoDV$Vr?`Rr*2gQq)`Ja z+Nm?iKv5!oR;xj^8r%uGV;SaGH6GQE+HZV5&TS91ZETIOPbK(3yY~^5m1RqHHdqw} z4_i{ANQe^1M6y~EYpA)7#{uoWTnxzEJ$_pbdq%IKOs&!wSxjk6j5t4?J0H?*kF5Wp zZ#X6#LZujXN$>~+8m!KC29*81Pd56S<^=$uL%H`xIm4211m2bNg0ZKdK$6Ykoe|22 zhK}6I#2wmuh%z)D8B7=s!Ro5+6muVNs50Yt_nkIK;2*%Yvm!%Z7CXgcd!=$h)>A0p zEEoP^xyGI$OcgHj$ugCw|J?H6|1tI6(QF6o8#mQfwMJ2UM2l*Ts=fE7s7>s>YOf%6 zQ8RW+iQ2Wd*qa!wU9pK3TkM$6o9Fqx?>X;3{>eE`PEO7@_kCa2^|>qneDo>px+{Pa zy`zZIXC>d}%=&{Z!}Gl+pc)z)>LAy2A3vlzkmU8IspYa663^OVXe{LQO2=5wq2$}$ z&%K7m`{;M1b%Zp+c-g^hsphP-ji)x;)O;}xRQVdY)p zEdQze8_=c2=Lq-(`7P zUleNpDF~$!YsKkIpWFjVfA7}<%7bep!9vv3gwBxr+;)}|pk~>hGD5hg8_pU%>D_+C ztdCZa!ws}cYWz*_Nb?5Zz4;EuwO{NB>0dq(%bhzO`yHAu5>Og-xDG0JK}TysV3khJ zk^9mISqm9@y~LwW{P1uw0V8SF>k=r`~#FHZ+$NH6sZcQ?WJWDBZ-s9;w z$OFeh`(AT^4yIOhaAnH-+#B+XQ7L!JF+6MuMxnjFJ+=f8`V3q1%2ael4NKyJ%H&zV z8tL_8cqSzGS@nllbU60lf#7)6MOsB_V-Y3Cg82*@6Y{Naw8c=d2JAh=XIhsjgban!Ni+Sr9${H-)y%8>q5;&8L+X$hUGg&fS0Xb{iwIvsc zec2QlX2WOuHBJ$thB3z`t4jtWl?Sp4ZOxI0a;t-TsV~P2asp(=& zW&Y}zjztgk+InY(?(P=4DfN!feXm$xdBiF!qJH)ik~!Ej;V0@k@=ZuqV&MI0ao82@6$YWKFq+%74u~> z43O^cSsqsT!D-TY+fNsiExHvUu7S9$pJKZ8N)-~7=^>XzF1sNOUC|c=@iLL^ ziz)*>3Uq*hp3p$p3x=DxZUhyed@yx>4DlMj_^Avk-%UQ*G&U__%TgdTZ# z^r5mRSqmNFO)s}g{LaLi5%AI#b;iKb;E4x1*fa|2eCt)GD4nl6jMufgYpxxPrHq;J zhG0}HtMt|1l3ZwWJgUneDmfU{~w&E!PL9C&#~FgPKId!+o{~9iF4bHq)dCyTX5_gYqxXH=@UIXt zbhxgNuo&+u)?Ci?=!qPo3hUt0U?8+}fqeuX{`LtME0?1)j@GUMV_NsS{QuT5|F_rq zzrNW2wZQ;28nBhLR`J*>AZ)L>7IuyLucDS8CXElYdw)KeJz100{MA-@5LAtGpU0mG z76L)Jx36Qg3&)_Wf@Wg0?$w-DJG0WNz5UZvNkddy?aZFj`be?2v*W4u@__)6TW3=` z>BU5qLsR0s^=h(Lyz`(J{Z!oXBvKkyN;Q4nReU-p)&1NnGD3YF>ZCVr)3(?Whn1>W zYJac>@aCr)MMUsn^{Ip=QV7D|p`^)3Ig_W5vTS@SYTYfZCRW;wb7UoX!Zy`v+`%m$ z*cg7M_GXKO^93?0sCnOOc1wg1)oV1vZYD}kYmii#F3vHYS8C*gz>A?t5 zbws$$zs9(CK)XQa_l07wB00U@dNg0a1J2FJ8f}mM2BG4<Tx-a{V%^Zl+mYW-h5#jm?CTmFAm8w>{cpPM7k;{Y;kn%ElLL_M+9 zICDxL5!I5gg}0Wy0twwxHxw2%{;@0hurfZg0dIRRwoq}Bl2KZC9u0#BR%XQBtk%l} z(Z^9oZ>{g+zJ3ZmP=C*M@z;ZrDulYx_{TC>#PN&p^7i6Vm1IYdbJbKk%?a7jt{rq= zx#0_VMK`s)nh{G1Edoltn!bjnvnf=P3+Kk06P|atE^{~BW2Z)o`yKD(O%byI@!AS1DUitE2n@xU2$GJa8?cnhon$EjAn!nW~5%M1A<{2q415YZ&V2t}5 z*MF`az8L&CXUy=E-i1y{!;?hLx<-+p!UntFxV+nT+Im->#Fty6Z<41Tmey?5G%%+sN3%2 z0F0W$P;Zxw0it}O6wNP2H^F5!P{?Mv)n?--rCMU`s(O7O?a})|%)1bgWgOSSq_5@1 zS#doKfBVzf^D?;s_Of%bH>I8U-{nhGY~wg|^IxVUa}yO2rwcXVWIZJtZrA+y7eu=G zPKMSn59O|l=>y9UgCr^}6snjGHyAsM*v0mO33~GjB5K@IpO4g-I#?05B_I#P?DK}s! zQcoPg;F6?u$=Y;n7eLNN&BI7T$nN7jK^Vc1y_#3L5q)e~Ud_Z>L8W>E`VqL}h!@gNp!7Yun2es!sQ>t#b6{(st z7G@Xw9=Oh(VJn^sTy6OGuxN#x-rmSHb53b!iToazbfPknj;b_wb{@(jTO3KiJs{ZF zA8?972MQ zMOIw+{#0v^EF9tyUV7!T;GEwP@8mVF@Y~ceWBx2NK7|5K!w}@o5j|ZJF6KY!$_4n7 z@Z;O6nDFkQxz;l;C4H7HIuU>nW)$c~vX|A86_Qz$G}xx7yy9UZCw`-wP_buyn6_gUy(hC>BpYdqdh%VrtsXHMb!WzwBzkRB} z&cF06*Q6lVXG7P|cC)URfWJ`=9h$+sap4Yq6X$@JD=HoyZXZTtWNzi#bdQ8lG}OC^ z=>q)*k^~)1GgMluJ_Kjrj#%Q;k3k{n0Z$t%fuI+vI4=69!wKdz_C16CjOp7{mx!#x z!>W$oiZyclMG7sCDXBTB@#auf&O@b&(ac49rlTRu4l1SZ;dw_Zw6l4b4&-mUnIvOO zIKzOAHH_Kg@U(ha;m|DSRtodxcHlv{ZmJ-xSAm@_A|jsPrO?j5wGd){i4gb$`?SlQ zgqu)0`Jo?7zt8@D!YiTDykwPFoXQam=tX=_E%Y;Eo3Zkdk9P&daX${Hh@!!-24V>H z-xRBheC|_QvaeL<)J-c)-1FzWlPF%;p^T?gp48W+-^9TOUs0Tr9A=*A^j{i$1R3|f zv&mpG^Zi`$tl!g5XZ~kLfcXG-e5+qi2c;$%269M6TQv0NvouBSZ}DhbiE%k|j-4)A zZ*xja_~rJok%It%wAj&Gh3*&eLF@iF&+k@ARDF2J;lisAxaZFul~OK6xQW2_CsNTa zC*>gRZM3~dCLUUN;{~G_?a{f^LaL0%=E^Q&mSjnw;VVi1?`n1QKh&Z(s2G;aZQ)Lz zCzclPH}E9`UD^NI$NZ^-pJd&zb82p>)07_ipBsCFzy)hyK*02GD~#Ow)z`*b5G5DZ z`pijRfsvcZU6=efzkn%Mnaz@MECs5TCim};?;o4k!O&tz%>5ts zwMl`*7h_JVwO3IaUQ&_mZe@;mbdX&CS56_vKOnbK>Hecc-^UD4PWPN{7qN%Vujcn? z!&zjikjaJ0p=?f@XYdiRi)sN(?FpMMx;U{_F^tpNWVXP80*_goRA>k}69Ic2wuy(O z+=9y2jt2mbKnB{g2f=UWO&k_fSyKLbm3=b8YgXtXeX`f>so)Rq8-KA6Tt2>Ih28v` zX>6;JKONe z1yaNfF=60>T%`c@^-Xi$z@w||6BJpp9@{fnhrk`V7)^QJ{Vmq??D+Cjb5<@*D&gw@}WUDBOK1}(g zA4YA1=JBMFxkEfkYKOFk_WkBYQc#GD$zkP3Qjy z1t>tur`t#q?jDF(b1r#DQ#S~0r`24siY){_< ztsz(reKb1ilkzaf*TaOvdrE+Fdq{Dn5h=EF*6?)O;luh51?E7_X3Z0MXJul%Xln?d5{>KE2D^NpVZlCYw#dCT#C4NCaw1_{DX$W2}`r za~d3Houuw;3L@kC$PDP`JH2FZexVE9lKU8ipW1R72|g^mlgCUW=Z+qM?56b_jibMX zf%1?(QoJsP!`-{7vkeuJe0P>@uMx=Et>BOKEzB_Hk?JugB#-yzj!q7u^jx=07LmL| zi-_aqN-OslJfaJI!}yTiy}xjA_;(`tsE09>RJRfG3jArtG~u`}zYc#8=#LM$I?xxx zrZPslehNOkh+@Kjqt*oY%Mn#<4E)}vjop3$fT-x!4PP<6?0tRC)S-${OXAfZJiFtw z?IWlEMHl#XIF~toVV4Z}dtIkas??0*_lW&M-vB!U{i3RROe(Jc>DyM|d`mlRP zNaoMp=~(7T+d)I>L;xOPZsszFCTUoT@=u2qM>cbgwn)o+jz4$rZ@G6w&B_@DHml2$ zx#-)hIJW5k_|EUjeO4DC|~vaOxl+-cMjlzaXmckgoGmuq3YZiK}`0DUBqr z6O^qvYgGZ=j|g>VqayviyE7*+TiDd(oM3mthc(nd6_V`fJil%vFEkd3!0%T?{d4Fa zW`%xV2a)93qccj-^M!3qooYKmb`I&!6E%c~H!|)y8YbEeC`-0h9H;p|J!5^9)Q!p$ zw=ePrcIH-t){QgYOn;Z2Cb$;rw9(2vYR1nd8EcMP{Tk6XEtqFp-T-s{17T6k8+YCG zW#A|squ{UP3S^kWhJfdf+MwlBaTVffCHE2ilrbz$g4bhtxy7PuxxlqM1vD>Fz&70~ zzSHkYCif;pa>Eb?M~F~*W1CrWB|VZV_5+tPM7PNk{}EC*{RYjm55!v3IhZBVPwft@ zWL5uzL-OgyuPUDPOCOP>6WNt=zwHbUJ8B#%jxk+_e7*UD)qQvu7sF0f-$IDqdKTcu zU?0mzAtaIvYU|aZ*zZ9}tmX1=RkN{PCTWEQW*?SEitdNIKv*YV+jPUO#jR43G&>Yn ze*75Vbi)kK7^ONWSUaSBWD(@)-I7zAa>!c7BP_wI^u=Hr{;@PBq1+Xc(!XXYt0H~i zJ&rGjZoAY*-+v8LKTz@FsEa2QzeSuoZFX53N48*mHq`BGmr;d7BrRVPg92ZnH4&eQ-)q%;*hyvYuLpHspOdT3H`V5*2JmZr4q!y&~ zN3DsJn6ONl`DPXo!<}T-TQRt;%hVbM*BMl>a%x@2sy#_eRw4h&QD^5>txjrr8e~n| zLC{F1whsa-=->^$mT~&4sxGxjpBFJMc}8kXpNq~AScHRGgnlEes%yt z0r~UtHmE|oMa|pRN_w1zLffl2yRs!NPW4Kl0d(lip#P#YVhB8#5c-7}7kle#tX>ru zj42!aGDscI)g$sit{EM)wcK6%LvWDu_Z(j8o-^dc;2TRLI_OV8#@v?A`$#5~2w=v5 zQY^ZrDlb7zR;!7)7topGHStMkGXPpQO)gT<2s?x_! z$O4f>8LZypfbDKOe5%(5gDMcPd>oP)XGoAi9{Lnd=7;fw{}SAYA_`la>e5EO7tI7l z7z46Vsb(vaqNZ=E&EL+SP1fcVnKdkU^T-PES_Fr;(n*o3mF#*ByXS$kEj3SU)?4UY?6`Oh zp#tnN3D@+u>%}v7ZsgK7iQH26-^Dbwre|xsTh2u(v+@BHnA3F$$@M*9ZQ=P^n8Ufi zS#F|_ErNEluHK}{cuTl9C1kL}crc&=xRT46{7%Iy_g${F8K81$d4X=e(#SenQMXuz z&TB6a)fgx&s+z0lHJZ~gxv}zIi!%Rj4C}LxeIcL13|A;(h|4_)wT@YzDTt$r0;n$i zqr{qoeovboh^OQFW@qOPwgizau$VXPhm z5$*n*)~=-`*Ha24)aze}F-OjTfdIYZ@S}r^RkFpe#`4K7`r^3nZJ#gmO>-b-JK&eD zO{Pj4M_q+ObIx-MLLLZ74>m||!@(UlRsZof31t%pT=gREmup8ih$sLAH_?(TV))P2B3oP;90kJekC z(l=jBAi*kX*|2E}hni*c9Ip~gY(Kcv)z-_=;u@&SJA1!-;0bu#NwSlR>;23!0c!-l z)QJJNKi(Q1V%j_m7C8h;N}d$K!q1&^$w0Aw$@1!#hJN%YXWkTPku7ywP}llk`dYt7 zu(pet!rQ48q2(bwv2VNo0%EU6NMeD}{karQ*8NG>R7eK(diwVe=GTT#ma+9ogs6l; z_1XR|?;Cmv(U(_NjRHOrj=?;86RW?~?FJ-m!VuripwEJvhZx@5VtCM3@ab`%pc1u` zJ?_Y-gPN?mVK8AmR3!dcMFCoaFZ*az8P1@x=37~a`R<1d zWUa$Q7A);*GRm&b4PNoIuraf|)B1;x+BH=LSATz^vo$kYSDaJEohz5!exKU;dM6Q) zO9Ixu8TjhbSozcabg`;$TN!tao5?y0bpiO6`!blytT<=GjU+1G-NxXX{VCU>*(&mO zl);KF$Uwd$eEV&@=@!1?~X>b+s!3G0nAJI9>84X{= zc?1SwNOein3vskRH@|aoLVGp^bCPpiB0f9SxJ}^PMfEF8K6jj*DLavD z5J#`z!RJBKxs@T3zs>Qsa_lvP!iR=8O5F^$HeYu{4=(E|SPB!5>0W|*k8t!z2r);4 zPhip7Q7FyR&d-cbd#Jl2(CiGf&q7drs|K)1#J*wJy(=1|BQ-6Z+X--aCz@-+r10?lG$)y#2jP3s}v) z^G>CumUVV-5FK;-LY;t2min|l-t1@`!H|zZ9I)sOXpx`wr3CQtj72vQ`OBa8B6^QK zaql>W6Zx=6#mfoA&};?!`@negGT-|5XdeR^H;_1dmqwrYKR7a#u=Xg_ACK3brCp;C zjsdp#2l_kFlhy1i(Km*F?&u1k_BO(UzQ;Hl)krfppIgCYhZ?LQ@5Fj_u{@W3N)0s8 z=BvOO!$y5o65TUZ&7mEb-MF{@zI=EmfIHNCv6=ytK_sNvC?rHyPf}k`s7hhfwnmhv zf|}}*2IH>%)O_sFJNB=A(5qD?umzQMk~=T7h8?)hq#*_;(pu{Y(w0-qE!qOB^(-DK zkZFo@6Lu=kve1HJVlVTeEfAnwNoSj5_A)-ryQq+vA2;@@x^#%^mDVRK?I~=(@c%V@ zE8sBf{7+2!ub>o*^M8cU!e5UvV&CDu<8O$O-w@D!GB=u} zdcm9z*wx=O9Z{;3=ImCFb#Gqqnwe@`sg~|&5;ul-5xers1XW^udsajYhdrzv0mpWp z^Y#ijkNUGyG-b?u{MKE7&zQffA|92a_+-Q^k_QPGvms-hRSu61O;Shzk>G!~>UWGM z&mE{bUt>JKwf5p%(faG2ZsEMU#^Wsm=fzyGNjPtv5mu_-suE9$Ip}GsLgX@Lf|)S! zi}H1Q=8oCU=YyiqGpg_d|Mnz(GGFX_-Q8vZ~@wX-1jgC9Li0(06vw3GsOlB-wyKepgK z;0j&;<$It3UcX5+e+gDjaWtnZ2&XAnycS_>M9p?j_BjK~%$es(eu$Lo6nTja%m%QJ z^QW#jo-FfLSt;QNtttN30g2UWTJ8J(x>9enHD?S%GA_er^6~DB{RpjD5H-dR<-9y%7bL>wz)=`i=!3D*%EIPIEg`@oD znD7hpOrthJ?_-ny;6zj%Nivu&FBtF6@&Qfw1ZKEg7%x1f?Fg0dox^$wx5}mz64)+5Cz>(!LWy9@5Z2PI z%F1f$sLTH3+*4;58Ws+wLYHlt87;t{bkr=f&J0s$Z_tQ^;?+n2&*-ou;H+_o-Ajy@ zdWv(nYym;KUi~T|en2H#pNrd|jz5%dwx}VBujPO%?zQBvI-bX#edvlkWcfRoX_@c8)vjbpbc3e2)@dG=T5Sv6n#hKBa#t9?j(4G45QTd z6kHuJ4XF;8o%W6c5E~lL?Nag>8++ZZziNStaK&SzO*tOepTHj%E=K1aOmU-ESg%v} ztJ7AJbvy}~HAHqtj`xNv(KWP#+f%5VgEp8aPQ%%^LCwbDm8F#e&5@`6S^wADa!aoh=w?;$S98TpZcN;OF>eh~OPfBT$$3TELumY?HA;9GpW&Y4kefzL zu%G};Ix%A>SX0yb!)vlqS>#Ts2<*D@v9CWEd@ggci z;4!QY8wggtDH$|4F2VqMBx!id3|Cn`H_x9D&@AJOPat-{LLx}?S$d3TRse9?JmFH*pGPYC;(Y<$_M>G2`j9R?DF-P^O>{|L zR&a^s=Cfq|K^ab&;ZsDl$aZ_#>SY^xvMDBOcKL(UR`HISEB4voGyYJwt*SXU-AdbI ziK1XnsYN)MQ#Ryi+$crJ&T?55}YPsbU6-i6PU;1X#LK*Y0ijg{*v~@mAC}$- ztM0uQVR=!a6p={706}dco|rNH^>}4Un`WB8oVwjdAB#Y2sJ&cbypsRMgE1Sg9WG1Xvdgs-1x&U zAv;-fxew0=*3^^PK~6MA0ksSv!p^8t%Y7_e2xzan*CQjFU2W|L{|`<>Zo-{CvevQ~ zEQrXT=^xtGpZ;NsJ4zU%vTFo1AIJqP{@_9P87;P`zzIM)c%%%D>)$3!ckbOATRzml4Crp5TaLiU+}=R zQwv~2cA%xs7u8d5)D%l^O~7hozy5<0>Hi!au9B+p6Z@bth%yc7Q4ts55KVaBV?8mX zA$3Y&i%p94$cc;brUh|}TSrOVxt94C`-McK*@fw!RR0OoFS=F3D&fWua4=CFjQO{q z4)?=9$;QV3x(B8at1LI7xw2yS`~_Dp_|-nDZG17J5B4OBi&48IwaHWJGDj!ka%n>E z8|^0)LqZSsrwz^lH7X8HpV2DowJl#ypFCGAI58fC@$#Qw0*0v8e!;#&`hqM>FcAYn z8CQ>7Xcq*V$DYeEJ%eXMod>I=TvkbbiScKSGCufY`E@=KQipj(OR8H9&V@0FQwo!t zf#7WYhWg;wuwJ3?5$Nx$7v)sp3sQ{>HOo1Bal;a|xd8){8>P zFHD_AJ`;;lSHR89fHmt*;EO#)3Dxe=c{o&zICZ@EVyuz(WIiH&P%xZ6Haq4>7Eq|E2hm&ycFl3#08H-V7 z*q^k?ss6&!G;`o`r;=B9LUC^AxzeU6iw;SuaBd3{8xWPxdfP(%Lsigttbq6jTr6~4 zX5XYD09ubOH?5y+|MV$KyeG0~h*<)cX{}a@FKoOBj9_u90y*-9I1Y2$YdJ2db%oLT zR^qLIg%Q>5q~-X_tm%Jy7ZzLwl^4k<_iKE1NE&%Jv@w}$!bsTc9UFculT75lb2XKc zGteN5pY3=xUTM`VUE~b68c=b9CnQ7tPGr2KWVX5bn-tyWj`6SOFJ_&2^L*45V5Bc1 zM)H%My++WOpd{0G*S2E%KbXk7wq39n(Q28@*q3fYrS1zhPMB(@&bj%dr#9JcWsi0H zH6@=dlnre%3Voms&@WECbdh~#GqoUNwfFkb8(tMuyhprM%e`1{6PrrQL>1=-bV>AZ zso;;aiuD;((`2?d{Z->>hgT+8x@{qtE~JZ}ji20$`bxvt1-ue*|M&V}w^P51 z97Gm4culptFPB{deWB*FtqN{LxoDVtfU7(;U;VfIpp6UnDuM z1N6I)qt4;HPqt#=Uk(#Bnd~u2!T#m>Xv`riofLCc1DnF~P&nOUkX}Be-|wLcicRi^ z8uBY%(R%Mkoxd;)Xh|3CTh)`djgG`WON`1?O6KGvX^oyv)vHz%QnL3`YKs~qK8&u` z1yzp6Bl-oupDkk~=f7suY8(tIJ$|XNJ-(t(Um3J->HNyQ;j<;PPD8OIawBXETG(#C|FzTpSC#r7LIb;>sRFT?s-&r@ z|DiK*L?^K@4cd47pC8d`O+i%OJreoui;KsAb$&=suC;zOe;3a)ZpJ?SE|?ncqL8PQ zxdza;kXIhI0U+&srR2=;0Q;3`!7F>{Wlu(R24ekTliC(ZO>qi~6IUv8@Z+E;tY0cV zYgPP8zy)zP07MJiP!8$Ag*87R#zPv|4*r7^xbCc$W8OXPX1z}T=<>UWv08l1)|9{! zJVPR2y)%$!loj~FJ127o>7h!Jp?qC6+P~0L73KKPg*Bw}YeHv4io_F}eSm$u`1daR zMz+FZLHvDqr6X7jqg8=P?fuR?Ai9+0+v3`HD43Dj5d4|5|7BH$($K5Zz!}k!o~|g` z$a!?5w}&|)uK8&dlM7_KTh ziE9P(fXa|{$Mks@{zVtTM<2<0$*BQR&RG@M=ri(Is`)69nbb6}HGomA0xWdW1v#8T zX}2{_z4oZpvs1L8hsxklFJZ}mS$lvNuhGyJS`{&;gfD6>$-XRY(b6)9hi3OaT$|JN z;?osu5%dQk{znpCdSDsKNXqXC)|4voF`aron|{nYQncqaneq8EE?3n5dSvrm8ye5} z&;R<459%~LP{&To$TN>kt!$va1^o6jYJU76khuZ)M#~*u@xisY%T)260CLbYVB_nN zn(}IsKAb1^y1?i}u=Z`ul_Xi?4B0g<*{a1?kFe}IdZ_Rn$3!rmIKT-TW!M4Rt2uCZ!p0?riaD>ms(UD@7b`jO|`)E1|1GX_hQv3O4Aij`g^Z zrjI0(2J@AEFlG|t(w9L=0(PwGr^Hzc1)}1dYBI!^IQYmB;RMX|7nM>ppfrs3l4MQp ze8x{Dm*n&fH=QFX(G#OPm-0KUj;zsMtpQt$l*bwO>EGFvUei#Yg?l8=7;uz`D|NRp zMH4i4+Lo4XaMQpG>*nVB?n}#-+%4ib%QXC1y&{t1^;QW$MB;*w^1U$u2D{Ctn;XM; zOeEi{N4h=5^o~g|d>UvIBA?eOXIg`H8Jp!}(g>=OrFm>af6D()Ar%*#E*g8Kd4D&o0mm4Cx4pGRDYoLixt5_S-$+X`;^$FYMG6d zOxrR{kDmPb%beoRnyxb7rwHLsE2w|tJR=HxcR|~{M{zn|7n-oP>mz?!d5~8HZpM++fyR$UwXk#P z`I0n~@=f0_oU!$#RI}0gm@tg#WtO=pYPFmWL>~mMxyV4$D@R$nT~FKdvI91Pot>sH zS5fOZe zdjt3@o4Cw$tp`6@V~d!oRUpQgn2P=zXvUYKIxF{jf*5L6|32#!BHie9c%t{uDC2u( zrRLK`httY!PR(`f9)Af{%2muN+X{qwd;Fl80pIx3tLNU4ryh3mg7TFM+>ocK*neEr zCy(7-Y<7|(Z$n~>z&Em8ccwnHnuqqkcWToR?X2{lUkj&9O_Vb4O(C?9tBXR&@o%;< zY+1)@>0PMZb%p(d?RG-rv5#?A$r29m4`m&*mX80yL92~F*?Ypw$ee9M3=SKAkT1W< zy(1Ird)duMLZQ)e5f*}Jy{smFm1 zY_R|OLqohi-ml8Z@W72ZU^#Q9Bq~Dn9cHU*Ei)K*+Q03D>z3r^3~=X}OLa%SiuBfa z;rxA?>2|U)4>!6PJaP%4e3%F(osI}9Fo^YeuA!|bzL8kmUc7%ffX)^TH!?IdbrO<) zDycm<9KUh9cJbg7$=q1crRqtcv{Y_=)RTE_dm;0mFA}p>Y@B;4eB_)AKJ9=_y8)VmrRYYSeh28%!=R zl7^0~_Zf68Vd&Z~@_OLKu$@FmM{&u0Mo5l-d8v%%ym|p=qhE2I2k&HkOK8c&7ddIy^YmYbZmtwUOIq4T7Y$W1(0_GG#rEA+F*_K+p*_w&`A!NgD zMfcItlVhoN@rK2QC^o5n67Yl1UuW9Jv4YBlG2Oz40LsT$STh3NNj7=M<4Q8$Fy}Jk zJ~4>pE`i`Wcl+B?G@ADJ6{+&c18U;x`6YrfrGX5tlUNX-w^nlU052SubF5 z&!wySsd2&<q_ zDUU1>#S;P!^Ma<`jC^xBD8NX237nBCYkLNit320Q{8juKB9bh*qZO7K-oKV?o;uK} zSvIo|tCrg@OtUIup5~Xk&*YmM`{`nLZDan~>p=i@GnOX#0(7cb-@A&Aawdytk$FR4 z6duI}eZ)+k8hhY(&JcaZbXAqyaL5gZ(zT(-s#H7rzcf|8 zT^<=w{lH7&EAa$0<2;t*CtJ6u=r~L}ahaoK)xBtD2?z6^ z8{F?T@Bod8Ir0xA{2}p@N=wfDaaZyDNCZx^KL9={2CK{j6N9h^#~w2_wRszu=fbDi z{v(?uJ>Bn?Nu&YqC`#5BbL`iT;wUqJFRQq?(Qpw}7SweUAI>Km`}sV!oe+-@Y3>Rn&~8>xX3ktG<^wO~H|YF+iLt`PixXy3ol`Mb+dxX;fn4D6B7+ z6hju6pwq|XB)FKkueA#8f24v+J~UN|7Pviryd;A>CX@b#RA`KxdjE2W09Vm)GewRO zU&gEl3zddNG72Po9B8lmh$~?Tku%HrBG)Hi3zBM{M_TGrZZ|-r(B?7x$233%zAv@y zpSH)4O~N7)5Q%yWq8Q|*74$|ONr|(>kkEX2aiaq^MjP~XkupI(Pr~n*C0QeWEFf%1 zO@u7p&e*xN;`A`6yWg0{v!UTJslAe7jiMS2l7?0Pz|9}1+@(LaaH?4JdrTPQ8WYi5 zT{b(KGSl*=acgM6>-Tv`G5u;jeggyfbto$XzVM1=)~Hc*a_w80CAK4(JU}6x7GPQ!jeIlu0UfG&h=Vx2$rE6;OV} zt3ap~Y4yzAgx?0LGDcDqBjneX^GhQ8PlpBO@6YH9@9jspM`A@qWq+h;+D}r% zW8=$Y^F-u2EKe+bM1|vtEnAYtk}hFrlW9|Du+E`Qet9WThVX*Qu_kF14ql0>Z~aWh zW|J@p9hhSptZ%gb4QLvw+#I)svu5oXF67PNys?^ShF61L$)D}y!dD$yB`$rQk$7O+ zt@X<2bks7@xOmBr;_CL-@lfkZ$hz|*y^;v*b{-^V&Kby7&Uy@H zM+-G7Z=2s5Wa6+e44;vXZJbvp4{p|U-=0P|qa~IE9f56I#WR`&Q|&w_%y6LR>hc17 z?eLA|Z41i5b!-Zko;ivhpozRHZx!mxdC?c{fP!xH!=}7APd}Xul9-VWGj>RD)Soam zVrfm=ju!-lZCSFK&j{#K=K{0(n;R23K8>?TbBi6BD3YI4CzqRPgMWZdtC@F8kw`r+ zD|^qc==mjJJa7@}zD_M47~D*cAUeV85!6}`EaD7SRfJlp(;YIGQsZUc&fbEMSn&m= zjPAhJ&h?Q%HwRbk;y0>)v|w{ra)t{f5xG}FlI$}&I#2?4PKvZbcHA9<$7@IQh`dOj znxhMb4%M_BMai*@-)Ooy?nWXrx=P^snJIdNhfuvwY3n5P8B6VT)8(PrVIc@Qt})f0 zrQSd(3BY$-kS%5L8v96xfH{rNwEuOIvvnbbO(_q;hv>almjVz;n2jF&1yAa=%oGau z!!HGrjtmm_%@@_b5`dtY(hdodH@fVfgJ+@eA}6!gZ6{SlA5xJpp6>qZg@#<-3#N6! z9tH?wT*`Pmz^8QM*IX z&I{o(NE(&i#g$KaVi{J2c>C8g!Q$K{7%!Qc$Zk2yC;g$sZK?Rz2K2VH;h=ztTD9`> zAxjJV6++DTJ`nKom=L%zZ|yf%IXjViMP0?Qk{6XAW&bSOt6#8)ZRXN#u8C9t5nKJz zKalJRvBa#q^Gy4jI>&{=upiWq_s6$Pgbr$-??^pqTsE^m{oALQ2LY?|VyER@aX!zQ zU2+1YOs2;WU-;85=aJG@LtFB-^76k;f&HRiwH?kxJD*oSj=wRWhjDIO5iBT=kdNPA z=!#QSG;SsQO`H0X^Z~6Q{5X+4=WowcqsW)+ny;an^yKl_c2ZEg)7}6GU_Pm5pGL8yo$Ahp`Nd}aU!N8%%zOqm6(4toQHn( zNPqwN5)7YuAV9kmMSX1=e3?S}-DHzdBfwez6 zS9+$XwcQWuue-f9f~IOZ4!B;J9Sr=PcpXD1A{Tobi0pQddTAmQ zZz1!L7uWiUS@p()wY~10`T3pki+`JQ;H4BdYURMfjw?60v-#801?4j=HaXx)F|61` zDF9F8t$@~`0Y2al0o@xbzmY-AoesKpKIp?ptJdZ>0dr zx6q@8dctp}eY(hpEgz?_^fHxqSzC}_BW&4;Us1f1(BiE^8RYy}C2hF1nSKoM?$kkv zt#idw41ilUp1mOmib_;rVd3~zoBJJ$2|ad!VTX^a~%+dn3YET zd1w4E|EE8MegERRaQ1tbFTnJpzZ8Iruy zbPd6({Ui|&?_ENW_zCSFjDyC0q?*Xl>``!yGj;%5R-c1|YU`B6rMMbWoMQ7?{b%wE za3dmCkFxGmJD>kQ06{^%zO`A-QQjxm#=WAV`kg(lp+CVN6G^A|pzZLMs=`YPfzOms zZjfzF&CAFKAaw34q|`nt4M$Lw{0(j{E%`}xSx!|)d`BP*4@1YLNq?i;{6o@av(+Vg zxh^9+OsltR0rKM*&mewP<{t;FZ~h+mlKa5=+(j=pnc-&zRzw98Ae?06o|S@xF%+F^ ze)2p20GaASl&HxmJs7_mJOiq4(|mDdG1X>O0_$)9q1(wDk4(2fE6{u)s9I}K+UgMv zkVvF$T=K&!>FO)cv-(q}y`9ke(Xk^tMnF6$9s1Wk8n5pCh9P^e?>XwlRDRwr z(h|c|Xd8OXwo*Pv!6Ao!JAG=$i0w3w8|WX{y8V!l&T(ye5AWb|rB%0qxPg{CayjO_ zf5ToV)V>>PGk8zOEh+hxZS_S=z~qhJ>oBX;)P4rKopa)R9vD`)(&hVA`o>%B5n+)R zk+?9(BoHgF36)}_TG(6i{tV{CVri(Sd%mLRS}%zF1>(Iw!A8~mOBMNM(Aoi>;*vCN9nX9MsP8>^cD0ujB&UDlh9Y_R5IFlPu@)~ezrU;Mj};}lOCZ}cAx{; zbQGwn4;-K6PAkSKt(D`c5Zg)BqWeabdf~0EpMZ)2 zhUWlvC%j(Y>b^)qp)rVCm&jhTZOk$@;a&x=DdGh`1q=g7M);ZW5UX0 zz#TgjuQl;!kG1V$(53y($Op}`EGfnhb^4m_p_f#f)WUd(rJ?j*qvNd;Pu=#7Mi}wI z1?!gZAI3W`ANY?@({$Tscr3O9FasYlmg*0&?Oz&rzv5bzdpl_)jhBaFT0(jHaninz z_*>%t00(?4@Qse24CZ^SuG2~6${3RD!zXF%`0HMUe6iAn9R4p zyt9@B8(d+T4mzmzt*Pbso2$g1Zxi947hFfHc)we^bx9Iy+1;UGoyuflIQ?s!g2wMp zMmlx$`d$brZ(|{eNbVdCtLi-sXfl}QktI^{GaQq_%^{4&8C2{z@6CRPEDjqNMMA7} zvE%z{l%;qxj`6p}4~U*0)1~__hNHT+T!qxEt>0+i{pRxl=rj0=>wG2fzW2o%6^DrY zajxIpY10DISm+l;0ONro%B&6vUj0F?(^KE4d^EQbM6xXM24x_0G5-MdtIe&vQLA`F zo4p3$MCs1S)JlUqACh~WYUElgdx<4o^6EEJXXj!ZZa-de{xyNBe$XBt*IY;94K=OqVjGOm z%E4Im`-qtItq%%o^88A)yk8G#X4g%FcbllR;GKgVBVetcnNJ+oiXOoW37^6=TPly7bJckOrOH64+dF72-P*kU$n5@6}y3jBcLFUQP|eZT7HY8 zUo+{jwAa!oR=AsS$pf4#4mz5LR?+86d8ND|77#CHNZngC&UnL6lK%i#*Y40|rM{d4 z{{RCg`qx45`sJ+rL9R&Ls_FB^lh~CN&FaV_n%>w9o2ks1{{VPqz04gZ@d`}vF$tq> zQ@3K=5(m7BYlN}3nnUHtm~wJ@ectu^b_yyqQSnosywf_3J_&x)9G30n{iTb74lsw2 z(z&f`#S`6XbICNy5N!bD_5gbOR`#aT*nN}8`_sg*k8BLr8?D@=x{!^KBl`B}E3qXb zm8;0oxYZ%mE!N)VIPWdzjI!l-6l1_~o`hucTACCeWrizsQzQWAdVS%?Mm53Q>N4r= z_ICqow$*Wt{8v}uE0jy(_Y{@f=#un=PDMV3IPWOLWiF z3i7JOyPjVocRHUN>v7w7Gg6sIXk`Ec^mVV!o0yG{j&3B$VL0f0kP7o&5L`VE^?&pIq6?){5^%P zz6^M1EW{7A&-_QxYvL_ARz@L@J9nD>7QSE^Do!9PJ5v<(Zs59H7lA$A^7ZKyGeNB4Cr19L@ zYqy3qY(V4^GmqV$@UJ@kh3tOc@jJ#^fgGi@;dATez<;fMcLLMpb!tAE9u|F4)Z%^a zy0cpCNXAV%>PEOsjG2!ZtZQj9cQN^Zq|12Mf ze58FUzN2oan_Agrjz5`!Ku0|))t;&vQl4PX+DZGpu~JVjof(aoF=BCniWf9=F_KMO z=WZa7T`a9@ZXu8mq2uGyyvyP}sDsQiL2e&;I7Gnm`Nevqx^2z=l2#|fA;{_P?_O== zfpc$U&2|<=++lHnkfS{2y$n0M)Rd18@jr?h*GWh>S;ZuT>@24^1ZTgcc;|?Mh;ri`s4qxeMW;lGRCDznKk zU)WqPm)P#|*QXVs<4=XQn)aD4vt?-&jopOIOwdLVjyU9jp8mCtk_{)~rk8T#0(Dr9 zIL_%;{43u43R1%Q?hA-SmY0srBC!MnCnMIs1g+*GM-1`h1qf!o&+~z(N>QibK zqAQ(~Pj8K~AUtx%l751_FN%K;SH}JpkHq>b1LExv{iw+w-kKQIq%o2PnTF{x4nIGkJO@s;X>QkaAKHymcge@81>ceh~2;#-BRL9u{aM3p@u59R>?~dJgsT z^(P!AB~(({DwMhjg2?qH_KT@i6gjfR_&5R<8l_C%5PWr~$GvPh9uyUYDh7 zkzH6%q-yX%sp*$!Qd?4+(M}H5MQ#BE?#?=l*My12 zP#0ead|dt>)NWqy!}s4ljdv@TDY>>s3lo8#mCh7mx|qCMqiIs4n%(O`6kt0-&IIHU z!H+xv)30jtZ;Af^9(3P{`dpq7(QOpNV{zwyXg*8IRarN#sL!xz9dt-xCEt^lVvzYA?GsZ=_05R;Z>(Jy1;KrwSEN-U(Nf=eYuR!oG!|hYY z7j`j6Y|$ty^OqRvJ7j-)zi`3jxGcJpr^>E;-C553&7Y>fu$=PA@C#2e!XYB^d;qu@ z$mw501{fJTz53V2UkH3%uly?TT4)OCh>3MOQ;d=I{&m+}e1Gu`t1M}8AIZV}%AUXQ z8u)BhUpHD(TQ*fJTw<)xsS9KwJWVr zCLe8T?bA)l~#wHTB4iK^vhou-`!iq{g2`++jzjwlW%nBzla}= zcDh%`zY}PQ99Q;s*N`U}f;Tg;&nGPS{{SMsb?}|;q2Sy90I+J7{{U#TJnvQtM+ElC z>P2@tXN)wxZsCRvynx|QmTdkwuDbXtRdz;Et15j@r#vI^*TY)+1i86=F6$rabq7$y z@zVtR{zknT#`+yX-DkIzWr?~voP%E)wS-q-?zIk|-$_EB)0&e=yVN`|#%&`0eLc@c zo!WKp{48Wmf#m;(QeREO+OPF9OXaOQays;7>r9ei9_;c5 zr&@7*+Y;oXxo2>rBi6YMW8z1L^bpH&sz8$u`DG(~$J)4^XZDEGEZLUY(&6OC%Is9e zees;vRB-hq?2&`7O>EC(5-I3G{A!)~hZ+%dzxswed?q(c&yGW4j~% zcsjrGHRe7e`0aMqvPW+awPE~l9mfY4&TEyn@McwVOU8Qb{{Zz=8sPB9gslX+o$O|J zKQu&xoDq%)^dh}Fcp6l-dYm;ea-NACzr?t75hN_+vu8)>h6ddl;g5Az>PT>=dvZf4XbLbuZc@;unZ*Wbp-#i#@l7 zQHb4Wtr;oQKN4e*%guUFQQ1Vr$-U2`FLdocNJjqC)!>AIhJj^G!#y}89^ls(;=M+~ zTMz8b0VKM=x%mvcaug6(IRy72ypVX#!t=q?__I>fZmulB0UGLU@=V)`U=y6-fFG4N zL-@_B=r$TwqjBN*Z8Ys(SmL(0k^m)5=Kz)s)8!|RO6XB>dKudK-1T1x_!85?f9Y3p z`Pz)2JmB=f=L6q4u8Ccy6Et#28dA6_xxgG(pUdOhtN6sf=}1lf3Og;V>R5mYh>ZS~ zPG1LVlJOm_))r0Myq3ZIaak7MAN)ejQ|y{d+j=kA*yH~IAE@;oj{YZuH z{T`+kzC*HVU5qufctQ{LphG~XI)mfq6f&6uP>Hn|v6$j>Id`^DP4y5w@tGZvAQ^(Wu_Ys5Y% z*@*l;KXLHN?_1Gi9S%t+ttNGO{5*y}-aHsL22xE6E|&lTz^o)ysnJpam!W z(hXt1{3Pk5nCH~)1RwLu&XWUT2;$ ztFt{5!?C@WhqX;WxOcgnMgTmOC_z6?DlIb6^^YHD7CV)dl^X!(93HfR+RH}LErI>q zu$dfv7>etEXN?*!5`0>X<%~3Ne5yztnEQLzURMQLyR+&}F0zdzkGHkW3NfSUdUn=f z40+&ZuG3f=hJb-S*ns^MVeCb|aw6tj&r~`2wfc}+(aUr@?bZlVf zZfo`!Nz$gGkAbTv&!Nt0)@yGVX^0+5fSKbxxUMH#(?+8r2@0bV!sq5aJ6C(+Nh7^5 z#LTGcf%9~)KEApZnvjvC7bR7&M>~FBfAht5(^k}RxryRUAlb4gK5R<6fL=&pp4BFb zHoCgZyEcv7kCglRRU1ukO!J9+$yli&oaY|g)cRziIc9|s0?MI|;p%f;GIv%qnz}t+ z7?V$xAz8Arj&_hi{{T6ziuc4?e}?pk&`XC4yX7E`hu_+`n?Ddlu{2i;Zf9YLj?PD} zKT5#YpqlxDv&`Qv+-~`M_O3@wXuF*8icZBZ5Ng9%k**_fmw}$mt(nN6f?lKr3;Wf#A$a9|!-D~=S#=#^qt1%pP zh~qzn9}#sJw66>532hKrMiAfu)E`Q3?Ck~M@ICzJ05!{(4V+`kkF9=#z?6Bg)uj8Q zASAI82+{i6Q>XzgR*hk-3^EkL;O z4db_v=Wz;wqaz$GES&lT_u( zkB#;|?={b@WYu2I@Dt^MyF9mg+Wy*D;A@+SBDRVk33(hS8Q^4^;e1!GSlY)d(g40$ zAZ@_Q4A;irx1Yy95coeq(ll)kRJ^jAQQmGED~S-QsfE+-u=PH*byAH!b1HChosZBz z3~LFf=~G<6GTcYmqF})Ady4VzirUMP#u)@|CuEd4+w$}MYrubC?~U57x$tXTw7$N) zzrE8ZQe~2McGwY^^2|+iekbvG@z$)?aT};+orq1ZfXqqj$<1klwMaSkHk4Eyk1UVI z`e%%McK#BvkX&l<2Y9v++4&5Oj1!zHobg45nl1FH9n5U4Abghljt2nxA8Pq4z`Cxn z;opwdli6Ne4PraVwt&J){Mk%Ip8cAz5x4cg;eAllFsBTjOJI|o)n(_~iT4~ZgE9kc< z30Z`hVbh4C@A%iR+!10O3^?P<=sxi3YtR1xX|S?3gQ>*3JhIA9PQFUkS==13Qhm(u z?eiRO#LKe<{)u-P+ag>=fTr6rx6@Gsn=T`b~2-gH!wIr74182qd0tqyw~ zItZ<;BWR#N03dVx>Vs+Vg*#5{ccRTqY)ba8TBSu*@}tMAUQ>2DFYQqoBq@-;9FBl` z(m~=mp&#+(6Nfo0Sn-PIZ?#zLl*uH%TwTaGt}|Bnw`pe~x6`1W{g;vf4e#nJ&cs*4 z;T7vj#*}DQsqm|ww;zkHM5q2G>9hOUY*fqRi>q^l(_)aGic4VElIUJ9@vgSsMxWsQ zM(M6coe(jG1x^6l^VYSmk0sOY($mCRRquzc$t&gF?N(w3J8)0=HRsXI@ReoD876ek z2Z(~ak>0PwYsI)t`bq!?J2xCuw*ET0y!%)DN|Y*=U|(<_g<`2Q!m>pwyho8Dlh3ti z+Qia8@;Nb$n|!{R9=NY@a!n@_&XbgMWp(i~{hn)StRiU`=XT@AIjlFf)2u|gjo3{- z&B11xX4tEN>c<_8XiWlL+{xt)n+9b1V~^!u7JPd6y{>#z@z?wz-W|QVwbB-45B6D| z0bVnZt&WU)S2cRR#b|cn>HAly?zjH{w6BLeCE`gfwC!2-77RdJe=bG)#C2BouKU5i zwU>tV`-tr|SnbrdLbTF_X6kqwhoG;Beh&Cj&r0zIsJF1id2?r~Pin1rf=$~99OQj# z=-qid9d)PQ%$^$3(rYN<^BYaEiaDZZz*4P_GDkk6HP23@sw<2^YIOK-P@ImN%*S%?%x}KW{musrrTdMr25>Dzd+aMa>*tsjTaLQ^9$)2C1 z_@7wtteY)vCAW-qgecqJxf$9Tf2nJ#Kv|;qQxn z8rGo>FQU``0KB*Eke|aXU7fY;7m%#5O&sx_j~fOD@fGrI*M$YlS+N${oJ4=D*}M6Q zwWauj#2y`t!3Fi`3(_{7{I%=Q0x{OSdbxL4GrkzJ>fpmYMJQl;5Pp^OMVH4P5$Mi~ zc?w>`xMibOE%}%F*IlFj(z+ew>1}lcwo;MvGwlOEop4VBUOJ_r*&IwIyFH_D%^qT& z;;=NY7U^2+X2Sj(jlX$Nh}~OQ~=WdQp*_RB?}&E7Fxn zah~FmX{(}%D5PG3mY56+M+!1&aasN#)8y4OTiZylA5W5KnHK6SZitchhIq*Lr5}57 zN=_Sw_^5*OE( z_y(ZiSE%Yyf6gn&{7>QEh&}<3CC7rG)_@0Z_FQ)t1L|<1y__}{gxcnj!&0S0v`43F z{{XaRqU}1`+I^KlAtf#!BeBNH^Le~esd$FsTdTcFa8K|evV-|zyyH;#)#6P8R*P2f z6n2OY0(fUeAA!fAtb32zS5*ULu8V65ciPYL{$>HXYn4)mol_r7c0Af z(tPCpb-SeaRb#g|SJzQQjB*Luc;NH~zF|KdJVW-ylI+JNp*+VM6UA!Wd{5DQL*sFE}{{WV2aE1Q>A)k6#>?ex`SQwz`Dk&uUnwZc};zn&t zskyIwP1p5|+s|{9J)@0NABY0H1LM7hr>A^8eQxtqlkJZv5vRABih3M$Bei<$uA4`j zG>n7zNEsF5{{XcQm8twI3uNMV5(6+pyKW|r9X^J+@ie1NE>lWNT}Ak*t6V4S{{ZmT z?WSk8dy8pq-){v2OSm7vSEqPG#1>lDfNiYpm1VTKg%Is+pf1%TjD0JP_+hK)UlG0t z+juKgzO}nnv3R1lS(T)4~_oE;@RwO z6U(1Uz?#&@gaH9K;9!Hv>&;T|hlw;F5cpd2ea*GUhVP?3V@oRSjIQ7bAmAO@#!qVT z&xD!=r>S`E_-NYPll(u?fR7T0eY(%v^_lz`2ERQ~{U^Uf=l@%M#pFLh|O zZ8b|?!yeTbJpnD)9{8*aj}&Wgq9xv)D@>eaBV+w5^9=hBn^&nXt2;-fkFCJZ2N*AC zwLX!z_)XzGPs19W^`5-ZUPBpp)Ws*vKyOzV>0Tk=ZyH?5t7;l1p&sXqx0NnI+@Pw1 z!1q1to_`kjj{X@UvWk0iDGI=&06ThDS>R6w&855D>I@9;83&$vsq`L(x8d9dX-VG^ zH}f&a)WOYri0ihUpyL%v;!TbYH*?9&Y9a>U9y?TXSu1i+75YSDXzF~``x&AmbkdQ^ zV1f0oKlra^&EfHt*g+s3zr?lbme59up$<;|Ym4~JZd1c>6hcPhoDcSvyxR2?DNoSp z!$$R^>U^QCX%6;EpqpoPC1l3z*9R7psMyOXk5j>CBPK9&`te@<@jp&|Gr_HRiWN{5 z2kV;i4-44o_x4fCBw~4FjBiHokO}B(;<7g!L}eTOr?K^zi$`Obv+(DL?T~0tolGrD(G{`+q?76Z2oo0{{UxeUMju& zHl-JrZ*Rj&17VL*$r!J4t`()pP0IfOfx!tj$*rW4-rg~BdFGeri2X;kGsW6#*(5Wn zgXiNoz~F8F02-%xV|Ajmk%rB(F$zy`IQ~Mr9bU`(Yr@YcU9S?R(0$l{g(%@wN_8Uj zZ5t|_tjqBRv>>-cR?5VNH9p5CzLWild^VRi6KazvEWfs-#YVS9E8W-u1{Q^ zON0_fVs3nZL2|9~XC9wV(z~hbZx_sY!F@vN{uqL+Gd3eI{JfHXz0$VqG~G%Id1tt^ z-gg+25~#@s+OoyObLtGz$O{34IUg%$itKzpsCicwrcy2~(TQNZ^NwqGv8!4g4xcZV zFp}EbMU*v%;5CSVx=2NnLkmW-AT#gDBPW{RJa;v|t2#`G ze8O_MBxDR{`B$ZQjL4GU6_BCcjE5kh`@f}do-MRpL9NBQ<9f4 zZ*sh3Poy|~GT)3Hg9Grdus#djydMkf1ivgxG>1KXE90FeVESoc)e{5jiu)Jga1HQ# z!_K_0LMM-KEQY z;CZ4E`JwIzkpbJ0<;R|DiTHzc_MZpa!z=lxk~WaCKV{Dk2)-KH+@J{3Tm~Wd z;Kdz&k-{lZ!BzD~$!AZRsqm-m{{Z1lW*-sg_tLA4FXu!f2LvhtI63Qzcl;AG!t-k1 z5VajbduCXzEu@UT{;bQ8GoNbxE%9H%?+$!M(-zOfS}nGtXKd`>XKlwDh~xlAQlS17 z&Ui=RPlSFE*xtqAEgn50-tI+tFbcGU0yBb7Oq%)_-c>a|c2iM-&wNH}bcn{b`yC_P zS9X4WK^5{>?WypWSNON0=zb;e%}0uLKMhV~)86jJT>S40d12|->TBJV4{cAAxyedtJDzF#B>XMbz6pFj z*YEs87}NC~W>6upJ7g^xLX3ASFc=_p1Fdz|H(HE(!_5V}Vq0f2#=j@bGl9)ZtN5qH zUM#s;FP`G^>o`k>LSON~#c65!9-`31!UzK^d6Kg+496Vjj7d1TaBb%p!5lJ%w{i;Y*JY!6f>4 zWw^A-0YT3>_CMV#Pqp%2$&Z1Jl_0R;v?QohKN?&Fdt0R+nq9jRxu% z_O0FAEL%NE&u%O2&kWf~7l(AKecPELR%OO83Xb*hkA(a(`c>D3^l1zIsw>DhqYP~z z;{&~Y&7;6=wA)kzEFwhwlvU+E+HjoYw`U$^ttgkQt+(5j_36zlHvU?$Bj!CRkWQA- zg?3Dipq^0G?_PTzGnvuCV zcO@e^$Zi>sW1;A4Q%?9R;ahpcl7FOtbLDVH=xfmQn6#}1*jw1a6|7)m%VUk-t$g+y zglJ)EDJiqi#Ag24StFJBN#Q+T!d@5qHlcLaaythBfEzGRA9&}jdO5x~X4PaKTOe4- z>ySIvc-7*N<>i1V>?9RZZC=^t8Im-Ne-LrU>tAaOH984KEcvN7Io*b>ad5Ueq?XC^ zlnMqw>GiLHehllk+HZ+F8KWB|EtXu7&N^opuXO#L*5|}pzl!d4n`VOS3v9w)aQ^_7nCZtrE6+4d ze&58p?ymN?aa?_~Ub(n|e85iDIbMg**VVQ0bvEa=_X%N~25?`~0x4dJuf|)SDgVW{oHSc~AyVou>#DiXg%DuJ%7n;a3tgN5{ zz>qQt$p*cM)MtxYif-uNfQ`kK8OZ8cjtA#bzwe*-im(3A095xDmkR<0xrWXYoW0bZ zSwElo=CJOytrtVjoqjJ5{P9Od2l6@p0QJ{Hlvl+YoQe)QBE+M~x{aXJ<+E^jAz8ru zGm77f;wOnLq6qQDeQ3Q&F~nGXNX>b!sqr11jCx*~6|$ZKKIPBrSdA{V;(2_(^ozoO z<%O~t2k0}}o2N=^S7W9Wrz6_$zA5-$`#ei^3tL}q09!1NAT5KBm@Yc;T=RTt(_@gu zC5py>gznvu{{Vbe2Zg=?_{+rCYi(_yUD!t;=4-oYVviXE?-j>?(ATs0TlOH8qEGF+ z^^12bEZceM?xMJASHa=eEai4}M+rBn=L_++&?_WXlQRyh6wbN)lDhu@2K;dNfvHNC zUKY}2Wyt;A!=cYX_oPp8Uqtvb_HXc4gkoKqT3$}PiRT12Q|NvF07~?mTR1Es5ZgoL zB90dvSI^=z952|Xe^bz>hLn1or^3tc7vJb)5)sQ~A(85J!Q?mLjIJ5Yg) zp2wi2XanOQ6Vo`UD5N8t*1jG1Z^S#lv~(>t@V8f<(l>9+sr5DGo+$l}J|Fmr*~P8K zoW~~?1}IeY>I8iBuXm=lc=@nBJ!_^IinRV2GdWX?w@1PrHvNG0yD4S3@b<3_#jqJ$ zX}2_oj+`hT{<`sR75>j2I`DKd&wb(RsV!qCGXTC<9>n`s>Z9|{cH`SM1lI80p-H1z zWAD6wO7ZwvtB zkHWeQH^q9!l*;j6$dRjoASxSh?l5{+d#C(!j{48+n)Z&jTSu1_+DanwlyqWAtp^yHrB(yE;o7t713i<5hvj~|3JdE!<&bKvqY1_1P`_Z|?` zVjNgV53U7xKl~)O{3+BXQs6lp@tTTFZ%|H`(?924jHy(NZr#Y_zQ?$q3+gz*g`;D| zO&7y^`PXvVEyK6>kRRt>3c7}<;Dx%EY2=b=hf}|g?%&QBdT0DL)i%@`8 z23cz5oy)1yZrR@9ObHV)1asD+@uM9>!&fQ}7~=!}1S`(PL)yod9Zs4rmZVwbo;T91 zb)SHPQ<64j4mU3u>i*u<@@ALf%Z)zj;wuXmlVcT8fN%jG_4dbsbi=QF5%DIT%jO$j zoDZT%YvcJA=1pSi-%hthnkQs-XHkqEdj1vpmkiXYI`!yNdd5up{9IQmlI&Ga6ZoF) ze5RT=b}pI!0NJT8HLn$0M$IjvtYhYXDN6MJ0D)HhmYw2@c`|hs@VMwW%)*fp;kSjHm@0y@gs0~iju9V_kch0(5^@Z(Z8>I`c$#sZ8S0G0B$ z!_75x+u3Eh{{UFZK>aK0UkX`^UxrY|%352QJlNHHt0IxozK)7Ym$ZuAo?as9STrjo z)-Fghg}5I!Nj(53`3mSn=pqj4p+`wb`AuhdX8K}dl3QE=7;r{=j>5KKu~==*&BTIT z;|ha-58!I!rpJpnsmp76^|IYX=U-aeg*oKv%fgcZ(8$z6=`iLZ!Q%8dP+WSpUS$ao6^wp$#m)7R-PEy zqt5Ni(TA;RXqUGZw+1LlP)13cBxmra9S%!dX(ky$z>^4U?HK9SrPE$h8qSezi4N8z z`h9Dz+8t8Z?mR7ilgLQ5-t&;m&H(_XagVKD*3a5*rMQyW7T!nuJg5*3PbVLRWLZ4A zHN4UztgAR4Pyh|2WFKDUuC1m0-isNSfX^T#asIazhr;fTIj&}}(5G<(V(D64s{$xq zoE01a^%dv-A&IP45fI=VvB)}YKYF|UM^2FGn3ccPleiDUxX%~_wbLVx9zyw(e zB;zIA?V~MIFm!Svw47%kPDVYjE9?(~mn%QPojx+(G!&t#@kuIkH0MM)Xi#m#pTGr^#(`hv-aGTuZ{v;%tAh6Ta7G+l4UyykR`q$UL zvm`;j7}?1%3b|Y^IM0nrmcm+i*!I0djto=l32rxcg=D+ukk2AcXT(RP7~tV-@wZs3k2=n4H|A zbzUa8Xk8>ni4l2YDwFG6Mda{b-AevtuvP#ZCtO!Atm_gj!+omaNkg2BMnLcBS8cWD zhfir_#5OPt$s;J>9-Xt+y|lfTyv(V4$)&l`=&;$$q1sp?Z~12Nt^>~ zaKt!HH&-X{^TgU;#0?VbRM2%Lo*PM4G>^)`B3+FGM349Rba77dpE(72+aDW>@)m7#!eNq4<+d^CD8WJ3v44 z$LU^ge`cdnz8`5P585wk>chWxK!uK9#QMyl#^fX?Gu%4^>7Hwo@h!t@eiGI#h<)9TOyg;{c-;QmPgXLjb#(zf-sYdtCafI@+WKD8)8Ykeq+a&ms}m5lplsrZs{Z34zy zGEM&gEdKyn@i7>9;b>H;9VH{!PVHQy;d}jWNYt+`^xJsmw*faKidj#}MLVnOYjxS=$~ou z=C=~H<**?pal;XSIt+C_wcugm>(f!$_bQ`Fd#96Wc0L-pl)K*Q5Gye*g5U^ttv})n&VB5Nf>X9l3WJQ(AG|^7l(Ww z;s~L+(a<&0Fi946J4jFm03Pfss}o98DK{czzm#cu&2P4vjE}2J=INeDKqHlAdq?SGafUK@$|2)g#^+$ITG0Ri2Qlsh5076 zzmIn+Oo_<#=~V7KaiIv;7S~9v&`9b{dH#h2z9*IoT@o)o?m|bDP7eb=#q>4W>0br> zbF9wh9SxDP01qNy{$y5FYEY-8K{_*@!6%ROm5*XtNT>VDv^VEjhsN-%g!vK}{{X)^ z3`KXae#xH_ZsGGkv0_HYPqoAU0L9hYAK44yO~R2Tn-pWz+(3W!dgl7}5-Rd~n#T=3 zsPkKI8$xhRi#oS(2OjltJauT1Nxw};g-HxdYH~eAdW1i*e~x98HOP)Qo8@2{BY=LA zSB3b;!&kl*@jj>F>Chr+*Ahh1hX;5@DU1Sf(>+aVM;C|0yF*qfQ*qquA^4wZdvR=* zniNvGB~{EQLg07&E7AOM;GYb9L-6c6M!Bck%@9%=bcH;{>-Sld_m!l{6CSW-}vWR z*C!z^3}L_JoN=lBKoz;*e}x_)@&37Q2(_IcC-<{Rcq0Uk2_N00fkd zpR@k}g>3vHnmcK#>d01E3%28&jQ#BNJ&kkT2K|(@KLvQ4>Zx=tqB66^Zt$=Oq~tD4 zhd3N(73VD14;$!eu(Nxg4QcE*e&vMa}Ekwy^!jYmL(6(Nh|E1Uz}cr_&z!kc@VrD8RUYHi%d+@5Jf zco@k)Q%|Cc3`J0*00H!+??n{AD58o0D5au+5|)Z60Vx>+V;~$;sGtPF^`^XP{YGi@ zgi>ie!uA>EfVc-}_M{QuedD{=y*r9Hp+zBGjVbcuKVN#y)_gZ%uiCY>^}5dkedKY$ z{{T3xK}Kqnr5AX+1+Tf{9x(lpz8~xMQ>~7ank3JbGgzSBP6+-i`+imPZ;gLpuN7F$ za{4XZrTvQ&g}Rmg(94s7wPVMp>tCP_H=zWPk&KSD2t;wT9F^mDdi3aKb@2N;obsZi zena@L;dhBVDR9thIt~4?jNxRK(o~O}bS$IPS3drIye8S?Wkbf+;=f_FZwu)f@W!R2 z*yh4h-X~91;9suILhKu$U@ziQ07n)?zxXflL zm`E-GFCiJ+Tjd2;pHE7xW@l)r;pKkfr$)}q@F+iFe;>@dzSE{Eo`Ol_1b^fzd|$9f zj~ViH4KW9*+&}*S8n4heR7M!?B$JW}=zRrAv@pmfyce9}n!V27tHY`ByZ*v(ufqQT z?Aa%VUldCswD%>yb}=Ir+S@btO6McBaQ46OPoEUUc_^1uuvi2nAd2CM-I0&^XX%>z z@mvQZa-4M-=AK9K5LAx2^sJ+s;(LeH>7SE&&w!@zF1dN8-k~=(?o{psWCB1VAa$&1 z*_I~q$y{{;zKZ>_ygqb)i4p2CMiSccHBqzx3o7LQ06O{Lt^}Fr#8=hRsPQz^&l+*F zJrl$B&wud!9USjVoVGuOe6jvDlY0QUuz0@nw;Aujt6vXwjk;c`rk;01?11|GqM_L6 z2>vXPD||GRCb_yC_vLpv-+>b&T6mvIFM)Fd;1kdKvN-(fd~qiZQH z<(*`hkaAp%bOWN-)7}EOUkdzYipo>A&hp+w9)*ZdKb?5@?OEXI4~p&=&S(Q%yCDRO zuIVw-zbwn2_Gb}SirRYp=h?UIFj1&^wyEOX8Ze+z?QJ?pXX-klb`t=nm^mVLpPx$BUnurc(nIn;b< z;$1f6$A1FDyORuSv<`hUj@9Tt2k#eC@h^t&cYT%RYo%~F&Jl-d`Rv~jEIlVRC!#$Z z9DSo{ohF}l^7x{ASrSw+&asde*B|3wU}$=ySw*0&w#J6jO}CNIo>}%_h627@n?!kj zEj$pgMSG;2`+!s$_fG|C>3gW^Q7fPHV%EnekCm}sX_R62LKJxKdnunQk#E+WRE=;Tc z04%ZG{W|epj9j+fje9#o_LWq%M?#0~-6nB^4?(Xg$+)2=&-Fd%%AMAaw#(0vI!(?Qx`<`=Nbc9Z=FrL|2hhXsr zm0jpbraQ*KvZh424k>L`NyWEu+>VJcag>NmUu(HbW*JZTu>=ZTMOjr5BdC|UMNxC4 zM{k!0HO1wJ1Lu>u9FppL=gW?4Lz3Lrlan~F(JG9exHOz8iROrZAP3EIdqVbwk8GlU zCVCx*s~z`OcU9rf!%jc00>;Y7~Jr=WXB!8anwz?|FGe}G$tH^*Hf-Ny3A z`rA|N*9i>X-Mw;;^Ln;-+*H8wDwnR0kim&HCJmnE&omLe8^pyp7}nEo0^esmuKxkB zeJUDU?<6a)0J_umhgfZr9uJ0O-EQ3mARmFB!aP29=B!>)M;Dk7j-%deK#MnH^4okT zrTStRcqI7YmbL|!;$z)KU#hRNPRHnUaC!N10krBT-xpHTi49S zNTLFzn9SN=K}9bO{GlpO*nr`8`U_Z|k&}tw2O#GT5-YtY$0fgB_4T#@8C6#hZ9m!! z2;ByS7VNQxdQHUu;x{&!B(-^Z^y(^dCRi932I(2h(HOpdsuS^e{oVM;brt^5_RUPA zuCqQl*dbaS4wtY6VtI6v863JdYmMn?xhpbQ=NY4k-sFAcNG5-8+G5Qam;}SEu84b@+M$lLKeP=x=q(B$CHT>BUn^wc7OB$oNr8{N| z%lj%iNt>w`ao?yQBWDx)(yx6SM6baZrNC)?9=wA6Ygk4Z9I&OBK-JkTT_IM{2cX(xVs@#d_b7^$tc04XSUr=9bW zFHPHPoc9q&Z1^A|)5sVSUitvP)^3gY0o`nFX!lAZ?q@e*;RHuzX`apk+AaKb8PG+6 z=jN;Yrh!;^zc5N@o_bh%oq}I|7Mk8|&tX%z^#Vkotxn`iQ^%v^zlA5>A)}s>@ z3q|66)z@|0ebQ;8_rkz?k6G&22kk{tcVxSj+&3&jtZY$+`xv`5`K#JB>3Gr=$U3a% zQSLwl)sjj9?3aRaBT#(p6)!d_n(V6GRi4h>RN(V!`vdj_a#iV1rT>N!QaTj*Oc$l0 zKUd%zmm{R+d<0E7dFiL+3CwwrG>_P(Ap1eGGpG1{8Iv(5Esh&Y!~N0vWPU$nl4>@4 z_L=;+&WfB&NZ6IM>$o7%K=^B7xlqK{oPnq1lYQk14S{^Y6vDiDE$IwHEX`>TPYA!gT{s5vVb`79XYe$Z-{RxA9KBQYYs0^hOztlWG1Y zifX?qLbG<_pjsk0t+Q)~)~+prdOJ>GmI$!0z)r)0AheC_D5EhC)>yl-@| zxh0LhEI;E)f}*mo`50A>W}x1E1{jT3xFgJ5lPLF3vKa2nl`#aTUgbFw22wtvuMyl) zXTceRyt6v%=ATjdQE>?OKOVCi{5sykoo&EXDL%n-BbMUT(J3^!Kh5=ibFIW8xJLPO zvX#v$SY=>~ToRaHY zyRw|Wm{nBA9)h!PIGU*$#IR`PquRPk@Z~tj(8fGzWrhmy+s_QCti(_ydI@D>A;J)j z=eJ)Y1%fMo5dqF=?2nu__B?U^5|v0{hAKl8bR2bx|J4l|;<)F>-u|y|5C(I%fcrmr z593|InoHnu{=$U*M-*L@FO!Ub5KA<}*gvQA0fB%)L^%E{`K?HeQ~2+OnY#t@UyNx`eVgs~zbr)?d>eAF z$Uwf@jB`!50TQe)>76>N5v(rj-nFxT;Gw@dg&19N3Re%8WXTlvBK&K8r1Pu_jhHW~ zHhi1QM8}F>%WRT#XBuAJzG#TM+9XO1Hbt`~gx%a$Y=3N+t$=EuQ5}9IRhl7crs)vH z7Bz1Qmp+m&(1}tTl40*FX!7sAFhCrj2i-8S7?FqGn=c&PsP>IzHj1Ewv!Y~u9eti@ zlBrEUoa10SH197O`@MxoIJ-K?;hOT z@{!6^KT9s{*EYtuWZ(s~15CdOF6Zp_?sh#O5-dd~uHW#TR&f6cEdi~!@7@2spqk4! zA?N%~Yj%}YHFEZ(se=)M6vEa0ep{^j7%cC4)IwL04BvXGU}TkgpP+Df`jlL^i8r)z zXut;Z9AgL`L8`YwrzHb9VQpJU82!|?pZbjX;j!y;^xK6Qdv?9pOG2HZ+B(zb13JuG zw|tZ%I#?@ydW5bCr9=-NVmQc~z?Kv4b4?=nc8j)jiKf_-o}Aw&+wIYV*0)N)F%4aU zQ01n!Kc+yckc24s1b*}y=k1&-6Avoe$kznIosPP!+ypOdWkiuzNtTbpgL5euNq zXB&Q8wBBlDRq2cu>-5||{unW3k@DQj^wtn5DMe1VqzLa>;g1sx&U6_)$xhZ(T4Z)r zs-us&*i(KkqyQ-L9f{;OPzN`qpPsd9eQcJ>kk9f=D~ zf9gCmJ;DqzJzZVNhi}viK(f7aP%xW$2nGAOS3>%og4ZC3p}ZwNC*_Dl_5xM`u$#@$ z9=|0s^_(UMf6myJp{glR+FQ4QW!uv9ZlBR!Z$Jt|Qz-JRlKadf*nyAZWl$CXRLTYN z&2T4YgUGa+C@3XrdZwg(mVXuwGcWYX{Ih8_ot-2wZelV@Oze%` z)vdjRts^x?B}$cbApF)iDN9mB8lk};jpD3*KjR4=3?CZ}{4MD$nC(uW;6#P)m>sbL2G6-#$b_ z-Fvk&eT7{*`71(w-FF6)DQvJ7FqFuL=`eQ#qj|rPrs~OqOAvg^j0#Xj4BPnUw(WJra_T0A_l{SI(sV*znwmzSE6fvp()8*6beWl*&PSl_z%+Zp z(ATUfrxpY-8-L}Q=f2ED)6!gJLVy;IFtkcuL2=hbHhl`VN$YJQF?7^(j?6f0D*1gX ze|~OisZZQc>xdi^Kmym==I44$q)=4yC;Z1Q`#fFdvZ$q#S-WQ9MgXQLJ@DIX)j7=C zjXfCBb1I6`SENxePL=3nyNNAsd$7u(EqPGjHszn?lua3VE}Yx|`Tf*Db(EPE;k;6f9(-4z*SLzs5z~ZQXHO>aPyD_2ivb>7WkDIz1-Y!@)y5xJ+KUDsP;E%LXs3 zbPZ`f*KrG*>u;fEe`+ZS?#ShC>`As$+hS+=L%*l!KJ-xCRj(^&*?i=*QXRmRFe3D? z^5n@AdWvnp!{-oeLGgO>()@P%HI__wYLxlsDd4Ot}TgbS08$>#es(apEp>yH8?XHNHVXwTQli1Z#SCBj+*gb$IuqHjY=`u{{ z6TJrf%#&uMk2XFTK?``Y0V8p1tjzDcFcB@>sXGw&7>|92euPTvEU5$+!NF5x?5-sX%Vd zSpD%A)`8}%FJmgSfHJO6TznvvMf?F!hP%2YS+}7RI!a|ezt+*ddkCz1npT?rI8-UU zVEm-HF0uEZ^tXhDj%u7X)wQowpUoW>w_y_6<4oC+l0);yCn#qhZmr|Dm%9`pf|@-K z=u^)%tW>4F%{!Awe;EEPcKZNSZPfZ2Wpi5GBz??#-UuSj`S3zDpW7nZos|w!oDtFN z$2h75{-W~UcNpJZtM}nFeN6*Rax5-e>*z>hk%j!gJkkE{u!B)$5VxFE@pCjs;ww*V z@XBsX0S?BW#)Q&oX0btrAsiC-!z@Ya#1#$Vx_|(Z2d+~@_85!Bzu5d_x9uJCGVKXd2mG=Abr;FGfn;f{<@VWd%G^QCxrE6AlL^`-tysit47zkC(Y|<*;UNl=1cS3`xtaq#O#$ z`%c$8(EX%G$^4^bVLbk<$Fnia@8M35Xd$w)?FJouuV|fGU02Jy;5Y z78>QibwYF9Q1kdKWKH(bNdzk9#Urrv573{b@*-ME(@-dH?b2dqHnc%cbvEh!2do%u z@60d-X=w{-Q?UQiW0HVkOBJ0En=F5C*U~)uMsfD`aUu51R-X_JOO*alsI(wf`Wtum zZWePx#-nY`kKZ2Dlsb4M1g&}4zd3`Hm@aq zS_X9o_S~*7o1Du)a?h3CASHSED_-?%`G`LU!O>brB99Niylyjc0t@#p_P4$e$+R}L zXtZ}4{KPe|P&P2J7msY-((L~g|rRBpBA@0m$+zE*ob-2X~@)VKZV&X!eqc%>27ER=>o-9O<+;0#&E z68?Y^h62oJN?i5CGVWQ((BnXG`Ah35=}gZ(f)3VfwD)bU!?LJpJ-pVXSHuS4*UHiB z>{`39+V=)15PXk10$!e7&mX}_{FWzm2}ine4;;Tfx2c=ZHlXzt_L9d6)fAeRS*qt0 z8wj+6BM{;ND~ZZoa-r*)H6Qs7nV8e#&t%Hlv z%r74@2Sd+drF+``W_(L%o)`icRumKSZWN-R_)%cw*}WOn>S8c$S0 z@-@hf-}hOEvjjVp%8>S|#WF4k;em%B($u+mzhKB$W#r6P+y$a-Hwyz?;sVMBgqjm!!o zFOcL%DjObr$jjMOvb=>S`bKph!AH41S>4hhog!;#Sm{vWF7|Ums16bd(WDBKjC&0L zjD%YlxWxaN)7U8<1F6WkHETNg#UFbex|qTZsNX3ieIR-&xz~+{;cYs)HEG;Ny!^Wj z*nEC8;bk)gP$4BvqbLC<7H{LuYx(^V&)7#tRWU?&T%q0gjGE7J^L3uhvgAS=KSv$+ zj(XRCOy=g2`&<^P&OCg!CuufkE-JOssncJsHR zp&2;e#W>iQwgxoM9_5>KBt?b?5A7eqbn>in>{?r8sj_~pm9Lxhj!fTG=o2q!SiAk2 zAB%KjL>5s;TI=xM^=tOs!3=9#YB%HLddE!??aWZ(APw=-gmsZ4+(GWvp&38HLzP3P zb8mQUH++x!+4cc*CFA6O5LdhL1y|PCJO3{)5_-O~ z3%wtQkIOD@^Vv-zp3qj0bV0VYilbYAu@$z=An%T7us?{R1!j1?kgF;aH>op9(OX~o zD(z!SFfDh)>XId~n;Q3dK6iYOey0?H$uxryM(LjE5?na%!t!AHI`C@|_iO2qbMn)J z)ys5@bJ|eOy&K{4+{P;_RbQ#}nY!QTkjJ`;2qUB`CQp0QC#7!K*RLY}D|LXt(WcH; zN6;Q{r9)|NsE#OS1+l755+SMu7iHqT%zgFrw~tWy{`8W_%Ye7_MNs1TW3;B_YD{+K zAJVY74*&0qjl!7Poe;!v=BcbwPOjNp4U=)ZVLl!j}e@yfp-wPbOdO4)Ofd+R$PQ)JNYe%iJE z><`BXe^6sr0mvWY^y#hDuPvnN&xbXaTwV@4z#etNb&k~&)x8b4`yM~=SBndo>8d-6 z*yi;pE&q#kZ--_{kSC}csps%i&_{2BqZ$<{j)21Dz}NcR7FEHPSTb^q4VTK`k2kjL zo9lFvniVd4(q?ML!aY}k+-JSfgUaUeonZtsGqow1!;S~BoIVlmCAznjbPv{a4fRb* z#sEdWHEX5a*hZezV&*>pILGH92XR3eLn(HBQBTJMeVPq9gE2{J7wWzDT|+T~G$Kd8 z%dV-H)lPmu)$@O@aV?c0F4%}^UJnbmM;^a07E6Qll$1Ifnu6smPS`)QVUCHv{qFJv zo5ye~p>H5pviP)OPKg!Hc6sAHsB4E1C~bF|Gbjd?-& zOoVvB=&w%VuU3rTGB>c#pX!{+Zp!}; zcL9@K?*HwRVV5>NKTL^5%KazF1_^Qz3%P#%-;MunqT>*u14sv93J$3XhG!38oc>JZ zvtPQt02|rgE$2X=_mo2YNZ0rm?sQam!8(H+o}1F@X1Hr-PtI0tK1*fv0b?O(0oQN{ z4$=}=`jRDnV}73$v~87Clav=PO@0m9S4WRVDmx7(t^)?tPlF7@Bq9N@t2eiyNigdQDRdRQHCdmmay>R zw8N>atT;mmUVb(!cwgXjK>H#v){Y+`5y^Q)^Di`Zi~iO+!+SXRoADP_jb5r5?`7E? zAokz$J5r`n53`t}=!Ds1MWjRP>~`>g`wa7a1$98-epMSkA;Gk8_#>9BBX zQ_^Lyq~RD!Y(Sv?Q>i&*6D+H=oCxoN1yn!I;J+YX@JIlHjg zNWXu_dgTot`gA7Mku+MfVD9kjfhX-{Iu)>?6q*$itMr%d#+S2x5^ z&had+$alIphHjA;JN)bXkU$ReF z7nUt|()`Z~J`5e;&dIKN90k&tW2XB2`0g*!uIsT?XZl8k9w7$uk%XD-!czWEcXz{m zKw`^olD7}r9_|AfG)r6)Lu2EqaU87%8AzoOUPREap*7*q=rwvM?PP*`<10BN{_a(7xc=w(81}XO`TT! zTM9m*UASWUmeJKakl0Y_<=sZ~zNTZ5)^M?0$+SXPt(w*XUoBGp>V|{>-)*I2m5%ioGrm@T*mk!vpFug0}HTh?T#L|?1`#(Tl z`s2->lynR;Z%ojIe1QL!*AxD|e3Sr2$Aq8cn(Xc4q@U~%%H8tFD<^g8rOIwLVFNxn z_I{WPEjbSdhVQ%OIgK^Ne*kW@gwM#RjEqhqnVNwf=pQ}Sr~V9;{}i*$Qhd*Nvd$Yz z(CsxVc|{Gr?PP_zLlgoS&1^?3mA9xvN<=+`6jOs)NGc&rTk zN;-rUO4l5GhXirUtM*No<$_Xpq-f1X=9%u86A<=Z8JPEbqpmU7hPqK-MvcF&W2~z6 z-c?{_;mg%EHO@3t*rIU5y2qG6S}8E{%m*ant&Xu3>*XW1SgHq%_kHwPX@#6+NP&?H z_4q8g1c7l&4*qgS>#9-vKQJjSLA9C`$v_&(PqGKJ&W$5Ol3t%WR4pL8m1*5(Bh1N^ z$i(JQMyel;Zhs%InMO!zH=G;1=JQuezEVq>6KtmN@7B1Ie%Bpz=St+Drx8a8=;t5A zu`JsvfJQ{wuJ~R|)SV<2Vnn%oSm#lqa;FkiWIXJS&E^zcQ?YPUdo5KE7`V@C#uNfq z1bC6WdIB{eaWNM!ta%Eh-^n-%ton4aWpwu)x4DP?CSkIcRfOK76xyuYY+76Y8T507 zExt@+bK#mz`ulQH+M#35jI;lM7u9K9B~HbUj;2!=QA9tYbsq+>>2So01WLcR%aAgl zSKTn0>hU)i!(-ATw5TE{MuekffjTRr&r9bJ6tR2o_ZM5IdQ*poP_%dYt^HckZp=}X zkCHw3sE?4NFccXj(^j1&?TF+hzvE{3X4U5lcrYi-rS#pV46v1NoD?sMf5<2%ooBq_+NQpHCGg_dQGG1+_z3V@mVS4J@oDL8$E`8 z-PwyvS5p4LmyesW2k;21%i$)Dq=AgadvXM9;HMT^{)xeGIO`-jLX6=~{ zJyqyLSX++Smr*qrs)>QxT`IuorC~`s&WXOedYf zzn@k|+P`9dAW-(+&$d3Xf4|vp52Ei-ceXLAsg-bvJ_}^-W4R07-$?BtPhmgyO2>k6YV+L*unz!36QrH4=Y<35HYfESBoZASb2blyvej+2&T;TTA$_z z+Zr8Fk?}n`$4V4**4cCFfuZONs6a~(BTr11QL@5OiCpQJxIp^Nz1L5!Md z>^{frC-L`{5>iFqy=yfH^}`D5&BmH<*bhdY!?7d*unqqB=tDKr*!b@Dj7(rsA& zk^~SrDYI8|sXSLCxHRL|KkVJINPx5L7Y$`RE|6Qe97M`%1jQj)bqO(NoA0sDdBs`ugC8Ut3}!o=lC6*iN}P{{zi8 zvKQi7sIx1vFj0 z8W{o7-1Z8AB1cFNUXWWdM6f?qz%D=U`|O|CJvw&Smmel(-2J@w46pd=-3^cv*Fjb$Gm&5);OY) zwc#8MiM#`QL{RTei*(qRi}=qmH_8u3>io^G3EhZ+6y}Xb??2z(0%cNmr#0uRit5p7 z`to^$kgnjyO>Q<&c5&UmnM5S&O&}-7Dr4-BYcGI{JJS7{4E>>Zt*`Thg4j|@`hRh+ zlq*pD_Lh$Rf+j1&&WN11R^%-|zsEL45@r*B`*RiOk8KEcJuHBE`)P8-U{gd#drI98 zC5{KfiSHd#=~4!5ta;S5@%WjkNOE=KrJF(ezI#^~#N!4HKR=NUD3alkaPS@I1P;MQ z+c#)k1Y@dsnzF(wvthvV!=x3+_L|NP&2m3$xTYn}RP9E+uB21KrF2ALk_8gAKZf-v zEkpq=-OGFgbY0;~FKDEU)C$%mZp)@IE5k-WSHQ_WkjUrm) zlU!|4>qEETO6*-Bdzj4w{}7H^JI(jp$?K;+nY>4%h~2w5ry~5+umPHIxW}`%1x~C* zk5%A&?^Q&idf)kcuLQjmqN$z+Er-XjT%PQ6lD(_P%HCuv==6DZ&a)Ds?at6>p;(^Jj6SnS{2)D}g%!pDq>pE{oW++$0a_|md8O9(1|CUj;A+akKJ z5bc?cVDlK43Z5*oqNdIJxDQt&O*o3?H8vcr>H7TDN1y?kx|6qyPLuL8W$~afk+a*;f?&6;3)nyHFYgFlibFZ*CXqu-Dg?L_cBirqMB z{{bR&>&O#^$D%$mi8DT*=jdk>H7TF7Nq*<#Eq1S)Je65`@G5s=)ZUp1f-%*v1R z93aiLU}CNbpT1q#=6k%^bV;2X2kO~n2=9KKt?S7IPq)AusHkb(Fvn$8(a@QA4OY%3 z+p{JU9A+?&zGnSi9L>sXN$0hn9*4w*4<>YK%Ij0~!i1#hNx9%umWqE;No}7n@fG@rj78qxHn^taky69Rq zJS`!Pvq^udQ&#mLF*lnbd4Ax2is5~mmfMUAoiO0`M)ORcpxp=TE!D+<(pEF+#l(C0 zsxdrxGwHW^ZWmP9O9#!sIV3xo|e|4 z$oMVs{^ahV+U%5-PDzdZQ6J{>UfSXBh!St#So2L^g@SlpTEpgOW4(f)5@BeSo%LJ^sUIT zd{m4&!;6dnQ9 z<_WRA5W3P~518FUbj^JiJ?#7f+_c{7hl9$}UB}0yoo|w_xEw;jI;Va z!6Kx7_=gl=Nk>2AC9V^nugrU5O}yb!qX0Al%CjjE2(Se7(n<~aTVyF5$BVBw?wcx6 z4sMRUo&L1;VM~&iC0HII%+9%&@Woq`2EqxN%+4TOyj`W5CsVmWe{Ma?`TIO)DT>Kd z?PFAaGPwPH!Ios4IPU`i%a%049<|$r-qr6nEKFi+SO+jNMg{kM)UV+S1UVv(f|zcO zJqNxKK49I@t`P}uXJK|(wlLqbT;{l$S6I(zTyI?PC+PA(GovTR0QlHKOe(&8lw=t7 zb;;xu6QuGs>4&(;{i^rkx%bFMXGwFG*zr@;Ab?jn7@Pk<2% zz2<9q#_xLU_XmU?qZdnErSs>^4Z;k9f+lS1+PhpU02;Bg6D?C0Ius>bmCcb%TYr&D%b@GN#-o*18=H=a_ix+do)&@0C zLc@bi!KgYyqT|R*{ZF36h$3|qc#iXlEDR;_D+5)(p&WDy2!50ucT@$fwJ^Vg1a;YU zLzq*`6#tNKg>FCAofmV~Lf&M)NF!7N{I(A2{>{Xth0jV<>wa`NUhkE2rD@$@OK|+B zR=N>DN02~$ZT=-5HiK_9x(b|8`F0uc{YX5CI z^AlkQ7)ZjK1>1xNV{0Cwd9W?o2oRCOv2hSx}>+`#u1wfIn!DwDI$61z8CI9btv=U?xWiq_)+`BPptzT>`bvf=ox* zb`XQkGS1TQq=Vm;4kKQV@jaPUXRcYMEyzmdB;z-wdg(6nG&>M$NWGKy3964%8J5Uq zWU*KnC&p*Mpo$~hce8q!4k!AS{bj*?sc4n?b@bhL-lwT|H?f%jKHQ^+H>5<03MNVu zqift>UorYcHmDT6}~z8^GO=>4Vphd(+Sbl(0-sdyRwT5J#iR*5Fm7uo zGGE%-?CPsdz&d1)aAo9rWEuRGKRgjs2#>Z{GfEvi_n`KWaH3v<_Fdb2vW={z2{J(W z-X$IxH*mO#zv}VjCsQb&_G0P=U$ylR*(ZO1b%gzA{JCnHckho-26jyDkG;~jz;8*` zWn*e4%np%+>P3C=zBdMQt$x-L9C<_wq|XH)#}-#YK}+Kqt}Io_`e-g1+2_J|@ANYl z?`a<4I@Ss6r1>>;5ebx1M8|9oa*3_Rd6fhfs_R*~ME=byy-z-u_q96;H|<$NX{;$| zXaP4ZutXbiGY4aFZ+r8*GOk`#9+Pc)_-=wh{p*3);J$MIt?Hjtv~k$b@@E zts&Un__^LzC%H`(coIbK^UmWw;UbF~DLj(n{`JR`L`~akZvJy=y8{`8?f&-l|IQYh zY6$I#G*&oWIl7tNe6o1M?omO^81#sZ&EfBX3+$~vxROp6%w*GcmZ`usVk zrmz!fXp7l!M@8dlDtt`Cr26Q#hu~VJk)hHgYs?`G6*huZKOYTe^O)$|#uUkH zHl3qzu0+4~E@;9*sCK7npB11(XEHULwmS+O=JEv%Ozcpg>V;W>C!9mM(4c@}j{v zRKor!k1UdL>e*V=pRXH{MCqwtu3qRKHIXp(8|ww8NyF!0eD#fG!iZqu5i3n^%{Dy= zrQX);ZI>X&W9Md}rEem{U2|MeS8sZ>u}b;Oy>qCIbJC67QOS3W@1(9-wm6CTHd*b`NL;IL2GTp4G-{!u{fW5dhu8Zi>`4U}4qm`2 z=X-KvFiq!BR*`s?74#7wqc8yj)R24n;kiUev(^U{s=_e+TIQ2mKzd&3fXqjI_W*>) zl&dy1NSA+bTxrW}@z{jzvU}s;=mLd=sIh?SETKo#?-ZB(V0s^@GC!F4@gKm}io<5k zR(YJQm!I(lcQ5+~*`mhK;GN*_T0X5A|4O@e0RE@jYG-|DU_Pui9cuRN=k3Z0cmI1) zLHLGdq`2gEqGuE?;3aDaIlHP8Q1vLyM;zk*LaY6{Fgu#T^{eS@3c)CLdmeYPD*Lzx z!B72mDgz7)iFO9GHH4Tn+2Lah#MyT$Dh0Qp^*>m^=?^sj1K{d0;wv)D3LG@T?EJ!@ z^^6O}xw$n_k^58i&^7kJG_8P6k28Z}QTQ(MxG)hwZLP(k-M(Z?CV+$5RJEUK=CDh= zd*1d1t4!-u`-c%rrHM{(f-Ij2KdF;Ipn<6m1LU72Yz76 zRQX~B?s)Bq(dQ(=(mxCUQEgx859>s~^OSP=%Mg8h>}{2Fzu>6+07&8x!PEr|ZBKd( zlOJ&G@+)(y{}VB=^`Pp^yI-kuNn8y8WsBSyxUJX)cbFGTa8~>b=G;R00vN<;fNc?B zW-Xfk4l4387BJ)uBH%xJ7wqEtpM6W^KOqBCLO6hiKdRUkaF!)S--L$7Lg6|cmGupV zEv;!LVzCiaCmfIIg^9#oC&%MXgJ!e z$!cMAN-ajBVZbVJxDddj)ZYRaC2(2fSfQsS=8B1Ic^}JS6thIDTKQZ^y^~N=x(0Wq zZ@wd+p`g~svlcD4^}SBem~Q{*2={>(0)*(?i}s+#W7ptk{g)pn%6OCcSDeOh2x> zvQBeC8Z~FCnD?k&k)fvN8+W&NK<>_keEH$#kf5;uOeP@mBiMV{+-fF@fa>S>-uIj% zR|d8k(UwvolZ1luQf}IfacK_@UJL{DY;utQuIV(hvGM-uCxsOWvzeqA|?9uZX%^gJ{xUFFg3a!VeVL%Iuo z>wX_pHl;rryO^L8v(hU?QybV^3^O*Fg0kd6!x7{|WVp8R6L4MgwhtfD+{%M$#f}iy zQ%+@p@j{%S2qVrd#kU`z2*RVoX=+1=fsEgD4pIK13pIE-yzs`{X%u}Sp!qLvD@8O} zkj4J;*ioxZ+321TF>f1hzowdQ(kfX7J9v8th%o7D0pF2O_d&4_Eb{{tKwJxBP=VU6 z!tRv9(&Ix<%afjGL*D2Z{4NxCQ7JVOnxsUxGLRkd8g zqsUup^I4HEP(J;5mWJnKRLWkBm=-!hz#WAH<56AZJXYeedg8U(m&MgeU_xxSXDTUASUkEVt5Pu3^5ONWew3@FtBVlpS#3-;wpeT;5+b9 zXV$x)=)qWY@|LAv5u*4y#aq78*>A@RkQg~B@&jSpP42ubmHS(m^xA>^{i#~MXNxKJ zHk0zDAZ*;|3#qQNc1k^ax+srY&i7^E65Za$^>e4kzeqvLP>3W{p^WT}uJo`86#tlb}*u98S zqBec2r))iTxSM;MlrZlXRs_{wmm9x5zw2h-`*7p5pkv`1D=#?2cE>65feUq41&c3g z+=fh;@mS%rOya>zna8z5r}JEw8^Xqd2`@Ceopzq&&^XHbrOley#YaFIRC%u3kT)aF%?UP9g^VoOi z2!r)Av76SzeoQaF@UV(g^IN@ZKld_{?6>>QaPUp}Iw~yuD4`er99=q-O}hYUo%fN0 z!nlp9pNdZot{R_9C~<6UJ|(OMo;E6h@O%H#eu8!n2mIX^?AtK5@%O;&>M&>AD)*s+ z(l)0$K-&jL`jsOFAOlk<`977%y%g6IjEuW<16c-pA_cCX9F*~UX6(V=dK;xZcH#i| zhPZSNzG>|jop8R8-BY=2BDde0IYp*vdP2A?mO!5p2=8uFD`b8^3G|9(e17CM^*|asf^bz8u~tHylFgKa))v z5)O(RmrH9`20uLWeYDo6(388ATD(J&FC+Ho#5R(4XwRUVwOpsFoFj1|hqsYUSJn?kZ0>6~Nr;dK=WDLKWm z=80Y>QNqyvD1|{d-Q@vXJyqlrkYkjo!i~!c_DoK~S6#U6CbM*i(t?9<$$cC*s|f2k zRbq0I(M$>p(OoK`o>w-AX#Dy0kI-lr)(dXpsd%N; z)lp$I^)}@=r-|V{uojr#V2f^NJ2y4PX^$X*0UdH+Uk8^7apsO!3atM8hTw>~CB?== zM`#0?7e?ZqdXa~0_+kC_rBWPeQ)w(jYT>)RzXR3=~ng6k&P8<)xw z(T-4Z?aEVDSj};~P9DLV`rcx3`C!jdmcE8>r!_?if?;nU;d|J)0ZIrVy+f6`Wqfqk z8$ynWm8D`D7V?h0JO8CR=HR3mbY+09|EE-8NP0#!JySiRv=}~9Su03O7(F{^^8eju zA$cKL{ZA$RFWCoUl3&RG=Y|(UMEY<01yfqE) z_I9o^fZh@j2SD_N3-Uxd_@tl&<>FbZko??id&a!b={R+w+F=DC@9 zXwNyMRS7t4;mf#h;)X<{3e;t}Ho3!AKmNXCb9cZH&2ojgm;GpYf^1yc@fn2z2oJ;K zXQO|&P(+*TI~y>JJ9?IVHw+_|eNRjHx^t287M@&%NptRaIYU$ zuptEc%>^W6AHd+ZZKXgv>{@{`KBHQ^;aYH$6Uy3FZ`-2ZyP-0D@Kfs>#S zU5oUE^AA1I=Gm~g|Eue~i?{ISDPkQ|3)`yC1X}rGj2t+AwU20Q*6w|NUs}M6+bIDG zB^&<3i|tu?JxJ!l9&|z)W)=C<`CHTG{v@@;mPGWQg_K$qKM?K-sY`9meJd@Onex~p z*b}+C{Ndnm-DG9 zVbiZqlYaYfiB7Vo-kKRG*sAyOZr{tqN9jKG`sjfl4;QG~zcRTRrNr)Xw(0;}=>msI z1s8>-2O-u1T602{7Lz_AKRT7=Vn0ktA*m{X^#7l#zB(?dE?Rp4>5@_!luiW!L0W_% zBvp_WkZx%hT0**!Zjc7)?vn0CI;1-U{Pv*lz4!a$%x}(_VRL4mwfA~fJ*(&2mU@7? z#w+pBkN$fo5~zGgTm4qIj}MX>PF`C)l3My8VxVAux)rV^q#wC-sB{)J$vXL_(wFD$ z%`}y;<77*uk(X5YT9F#Y?|)BrYV~_EtVw7oR14e1-Jh#& z9}~aQ?A-p|-VrTbxSPiZobl#)x}?6s_2$xNcFd`|)eTuNE+=cnb>FVcd3zM%hVK3BD$Buom&5QsXSDG{GKTw8wWOIvZ5ch=1$)d|ZUv-3;NQ`?6!Y zXalPmvBdLo2%M+v$4H!)hr+!@ww3|$Y#rXs*(4~_J4pdOc$XzFHym`wSCXF|P!=A1 zKbaR%J8mnLs(qXvM?gYt4gsZn$vF+qR6#;yb2D>K{Oj?%WXA~BQ+nxni~JzScpmDI z`=6ZS>)1*Hnbb6OVLVUR zWAIhxN)HJXLfp}{4oecCm-327@u!y4v1UI}xUHO*gik&cKfWlvuACM>ypS;4-8ogCjSH?5e@yhqgSX{J)g)2qN{YXO z5cT*+FJ%3SIrC*Ntl%yNRFW2A-r^!VqoKB!@78`q2svj{X45=Or@2TuRO*9>;IX*-(DA4sqY+ zunOt$XGFN^g))S9cMGh9oFey(-O|n%1f9Qd^Y=UV{F;_{HakYN=pBD8BfPA3nWf^_ z)~Lpk_ZzyP&!_P;aHe1@p-| zQtpE$QZF7G*OF^DhSHdyN+up69k-0(I7)5JT@y0Tq?lGr zW@+22Aj=hA)^~Z1Fg3?Eia(dg{?jb^Cif!=VtTDL&E!%GYOHl>~s522ze%Yx0i# z^6%axCM4sL43rR^uU7~|*4rvvvk2}EV_uk;Tdb;W#h4SCS&eu|xy|EF)Zrpu zww=XOQ<`s8IHzp6b@M*T#Zk+ z(GsNh5*jj#&J25@QJ?Rb20n}%Y3-bs3*gFno_o-~HylpDK22!w#c(dLZq0gVa?bq$ z2-8!LbwpOCEuDu-kBO`!&r&o#>m<@+5JOMVHP@)DVhswmL*SoaC^fX-sIsp zX!f+gswP-Kt;{)oB6acP#ZN!s``M$k>ioVxk;0FyyQozPT2|+ZXHq{n1TCuc_FA1C zfB$CNHLt%&pp|=Y+=UltTUH+zVG$r>x3ayfKG~LCjN~IR_-4Y^<$SbwcVG9C-8@lm zUTWi{IIo^$Ip3Xdb7(ktUa7gJ$ji;06v^i_o2)(n|0NDiG|AvfOhzKwt6L7Xg#CYJ0DZ%}9@PH$! z^c#R7??R0r>WCNs(4nHtKj)l5(8#a|dOVXcHgNWd+<{KS0BjThBu~JQAlwLflt~yG zCQ8`)!*6a(?GFU)2FeFXbY12xVpvvb$8<;9v}6sz-V!T)>bz9qj5lry?M!B?IB<*Q z-fjOClxHs%UMm)oYR7w490pTg!7L`-e)ys?gSyI>`!U}~plc!?Ci6#XMlngdoy7Rj zsRi(pBtJeR8fbE1q4hOPnt>Xe^MS6q$3H19HslY+GmKxn^)(mwqqQJI)%Y0n3Aa$+ zadufXM(X5-;Gbie0p@Yy;^?R~LBrgIh%XO@=Da<(WOeG0jAlm}nkwWaP1)ZK8G5=6 zQI%0fA8O6W%(Jp56{mKGtE@%tlM~Hl@aZ~`UdVT9;g7>Gmr1xZEoOIO?;nP}t3pim zj;6JxX>z_X%+eIlSy|*9wm63e1>~rTpQktM*mkLhS zzQ%PMj|6WC?p`l$3Xz^%No`HNc$G4%T=Uyq28!dE20gI@=#Sno4LeSaQ<+EnO@EWNN?y2@96DbG>=JVuK=VqX)YKKngyx7j_e@@B2)B(H39 z!L>AI2)&>**;Sa*=$eG&~cClnHs@rB8c|5KDOg0PUh$ar;}=xWxWLN*1op5s%foOA=b+y zs_(D+6N~v)=0+>zvA<^~(8|ZKSpXpjma?5s#igNU4^a2&Naz4_|ljCZP)eli+-Z`+4l=t3B96Wfu&&`5mG&~ zF{>K~#V-%5+UAA3CX}x_qZunEK8OkyUQ>UI_Fc~F4IlRxexAdxuGeg98nz3g`7|V_Q)!IMm!7R@lEq4`I1LzOt32+cHZPN#)W zKD!~-9w_^<$K}oiZqv{ZM*CycZx9oo6+3V(n>b}5%RHztd6oD8?)E`KA@`jZk7uh)R)rX0c4hee8IJZ#AHKZp z;!3B#nW9NV%n-nLECPmVXVROFh@Q;N;d*6I3^dzzgsXvfEnMhy7QVC#RZJ{UmZKss zV}ZC!Uy;Z9mU6}yYCQ~?Cg<(@^jYJ>u4@msX}&7^ZV}fK!|Z*(m?Og{8_AzuR?YXc zbeRk^H72yb>Bia0j$*#{)2;kzk*M21)h3KmToH@yPLt{MJHc`HmV4I???OClYse=6 zQg-OK!B7Me$Q{j!lzi6qx=N36@i2^gSjyT2C=M*&9Nw$UwYd!>c>1GgE<8nH{AAGU z7F}(#vP9I_sFb(G#qUuMFH#!cZv5_vI~sRnYd`VJ`naqgD=9y~I@L?Pu+}WHh&gTD z<^5pg5`tUdJlv|3RY+&xG|qvaU+L@Xxx~BsQp_Tqp{uXmPd8JxDM@ncDd`09s^J$smSbqd!@b`sv1)1@b;17AIAm-; zb2hX!9ZeO>534-5ruTGZzU&0d{)k(BERm6V&i$nrMl=i)8Id&v?0P*RPhBXJb7oI- zp!nZ@7tHjqyuVDUjD70~8&U{L7EW?TZFBdj-DodVFrMMkGI*@bqgRgB&}cxiF*KQW zEqs%(HVLz~%=xwVXmoh2%=@-RtVpFwL0Huc9-674mO*kCsjBY^g$Y;SZsXnp0E$)$4y?yn@b zHP|Nw6E9~!OM2e_0AE^-D!GZwUEkbrX*lK&L^5Uf3Zi>Cla|J-SF-o1-$!GEV!K_> zUM3p*>x|HITcPNySyzlX1hSyc6;p&BojEE?=gZg?zny5~WxgWrCaiQdlY4s+QxP;_ zkzx$6tbivKBX*VLMd6-;_7mf%_8XDM3Nrqg84rDZWj3lJRT=?~vJPLXBgz zW68hG&dyCX^kT$XIn=DXj4gDH{ed70e5xFA*VTTlI{WoF(r49kbjW$KYB3+Xfn}w; zuaeBtocN)Zg7CVl(H zHi{1vY=Q{n-e}RCmd*$Th)x8UPw5VU6nGFP1^Mf6#$F=;zu-PTaNH4q-4$QLYb@26 z7(vw~cyo6m{lCsacz6}58a@C6;YS7IhRam6tSB0GNk}5Djq1!om3fA$l)%wr&LEHZ z%lxWy#c6dJfv>Zq4>zV%`cg=4nbmp;JJ&aM&hSc+J!m7t__3~(PZ)ozP8;=^zLn-t z|0;}MZ^Q7V*s!so4sTk_8{dLo(ds$Mz3?82{B>M^ppZ8XDK1C3CU|Dv^aLM9G#W0D z5c788=9p9nl@(uWA4(h7($x*ne#l1*^Yle|UuKR(EI?Ut25nB6ejJ2}KXLm{UZtkl)Xv zCdNpGFn`L5a!2oX{2Bx+wHSQmjF*`%Mp6AT1Nl99jMj5kR}&Fp-tK$$T_%x*>@59d zavRb^pcJ7%RMOZO#|QyZM6*IPU3Ng31#DDijy2y8R$ZKo#N2bXL@Vy)pqr(k9~*0w zh5E#YwwunNkcHDMZYLVj@8$CG8J}mE*d0nxxWooyaBWV`axVN-{aW16>n4g;MXk#- zNlqaYZQFy+Rfb0A&lOtEy>8D81*0h4r4RN)wLlTq=fL*E_o~8ID9QKe`1#ZH1x0p4 z)vlPC-;qKGrL>?ae;}rs+5>|&&lBoP*&<%YZA}(2*?zT`IEcYQf)&kGZOHkz>o76m zsrU31j^&bnBi@MI(rjuQ^c3PaNKYL0OowtBO_PoA=&dpi$y1ofqlYT_uuuNpc_`eSB0cz9BGO&x9qD|i z*89*kO>I?0t#gr8V;g#>%=`13&$C?|jFO*{{qT>*l1H_oFs&WBrJi>58tfiV6B)TK z#tOjFlw6V$EWMZ*TL3KvU$LBJX`%L)9Pdul%%=FBD}KGzAuVAI^&Ai;Jt`CM#!ebJ z8xEz7)r_0<>l#bneSGEk?Cn9vRQ-YZc{F+P1{q&c<jHeQQsQf>F$qUSenF*!{Jc?vpZzMvf~ z3ZfG4SZ`?}iDhio=6Y=jk0?GT_H`sH9kU)&*&;zj>%t`RZ*MfV-*MzV-1}twEOZ!# zoIN{BE2MN!E4ades+eeDa{(QHM_p5(lE2-9YE8kt)dmY8qkMD{DUB8PSS{cQiHSU( z4z(Wx*<0L$;;}STv?Fm!+PR!M{y8veYiM8d96V0H-{V1M^~tUN?Qfm?DnpFS zaEpONhrxag*^Xlk=~oG>nzLU^2lkyyS;g-aJr;i2Y<@d7HSB?6h$kFFWR=jUHP4hK z7hmuBa#bPC8V^+4#4K8?)DwM*bPPDN52lqQN)2U+c;>B%>(fYTvcOrZ?!vDURl={| ztvHnYIaGRlyb;G#7&Gm`)v5#^yL@6q(cDvV^UL=uLfIu(^EehV@h@aql8Rfj3826- zB5FuF>Ay+HB_L7y$;`ngK=}e!`U*pnsW8VjmdZdg({SIW`|PARWTiTWiivDB@sJ>N zN$Y25gR9;_aVJgJEogm*a@)=rJLc72RYF0qP~Yc@qwPj7H9fU$ThkF5U~9m-MW)$? zLo2Xaz1--pghotE5ez#{WBKJ=8AB(6G1o!wxadoCLRZ}?Q8RGgo%y1mb5BvQo~=fe zUPLFdU$_E_zb0x?@rYc-KeA>MO`g!ei<3!YIqzx;?W;~3!m%Dn=0`fYwR@DUnJh8^ z7J^^rexC>RDul2Yr$plw(;OoKasg$XZGv*Vb;uKs!E-53>Yq~AbXokGu`;v{f$-(DwzQJ={R|`QKzZc@nCZb z{vJ0P!RxxnA4w>Ll5+3e+`JkRT7;MqL?=?~JcG+F?@LJf_S1P;Z#P2Jx}*BJavbW7CX6`%a1EG=$Wj^{ga@v_@K0dE@7afLZ%(s(I7 zlB;KB{PbT>JML+OuV-JDQ0-w||8RvmU+Rfn=&iWVXuq$HCnI4!dAhsS;~Yx( z2`lmbtfXMwWCe`#<}0_Q|5c_I!$la~D-|mJVbM!`fqcm3QY;BO4zBZ67xdu9&)2q^ z)wWK?TxbLtqf`vPGZDgv0U0FvC0))aEP@qh}eg3L$%NEd^1E`$Kor6>~#x%BD<60yJE1eGiD z{zxrCq;(-vWhT$1hr;TYRNoU^=dZ`a6+e!b@nu>6F)H1*k9Ay)`+8FI(7V%HhXg+7nlT(7_4pdx?AShS_KQ%D35pAeJdX=_SYwTX|# zbR|e9B-9MK^$C~R?RU(p3A$)kxmaRPNAs-aBUwpWIR{Y`lAZ`|pGbE}hssyTs5?%e z(JZ|a6ei7Gnn#s8XpFVYF;)(nn(E}BsHit34O#V3K#`(NQ8G1B>C-DMYack8I@6P) z%UyFP6gDizg2{wPS(+1ZBR-8ajo7pq!vYS`?KNSt+YU@BGH;&xMC4MVAvL+f18Y#*@=c5Cvts%Q}&TnD@A(LQ`w zh3HyF!-5-2?uCL&bT2ME5=WG(c@E>|^`U#qAlgOec;UV+3-2FD4HwTai?uk36^PRSd5hHGV#_gRcr81?9HlmO(Yo|p`T`?!CBiiiJ1yh! zYY%k;vY^S*i{?ITgcDekxs9FXhB@oE5XfzT2cMq<~G~ z*le_3MdcxhW1QF{y=3(B;tUvG&L4;gjP+nO)j*yd#G9eQ7b=Zom&-Y&gG%TH!^Mo;szz9^EQ~8cZ9xn3cfL&J4tXX@9o|-2$rE*rgl$0T}vTm)eBul zEag|(`LJ<2)8L{pciPY&LhN8jmo-C{FF6?B|A>}|c#udS7mcODnS7%`SIq5}YU07K zbxQ_$SWtw>CiM7m1Cso~_n$A=A}Wp+zuC2{-iVtjrDr{HO(?%2X7tqvzT$k}M@A7Q;N zC~f;V#J$Z8ZKR&#W6aqD4z;`uL{96ms}$$Hi`avswys->+LF2|XhN@^B@MxmRJo6E zT+w93s|{3I3(DxVym7v$(Xmb23_87I)MXV9%WI@%mU*GGg;y#D;?ZF~G%m0ok|Ye~ znimYqHP=s8`0Z3VEMXXP42Rg?S~!IYwH;w^E})s$^22LY^_5?qNVcmy=3Yoqo{_g1 zX%ehAU(~c&imBdmE;hBPzx=f7@q=UNbhGWaxS?ewZ9+}0A^P7w8T(S`UH=$~m6cxiPhccC9N**X@(r0n+E~v=Jajy>t??z#dx= z1eqb@gIJ*=Hl&B0a95Cyre3CZClXHNZ0xR5QeQaaY8boGd6^nh>rPBcksL{(nuP5@ zgzZ8{8cQzd4oP6z>48pb%8eDl&p&^7o7=6#x9!<)dHwRjG6N{E1~pNWW7fQaOejH7QEIBMk+OIyXF68VU2~}}&6yAC&6lL8 ztx)A(Ps)0VQl5-ueje{`mrlL^R2=1ge>FMB;+S6+bwBRH9DWJ24>6z;H?}h7c=;U@ zhfslE@wHAoz!q4;;*{l(x1X?1wgVy?pbYO?*0ZI!zmZ%GE*1At=??{(gFH90Y_-9&ikvs4{CDAljJ?LKMaQgZ_G6ap`N~M)l-uu*j zCUDs<>1)^M=4_?T{T2xk6hS8$sJ!}1@ zn0U&I6xk0*PFiX$Jz?DXX`2U`$`8VK{c*e_pvOh&oUn@d;3<-;Ngfu$U%fH>Gd#pqeT!QSbO~j;BKDJ;t(pr7jmxox!=Gg_rxK(QqELi;qmElIL@9Maa z3kQ>(AgD0OfV=bfap)H`7n_@Fm63%9bAKS1^$e_uUubG>=ykL+mUk}AVEvka>4sq} zBXU_Kjvp2iVTrHz=$*!4Rg+dl#^H*ZHl9(;Oy)y(qktJgam@rPk$1uyM19w&drCqtCt{C7lb>XbE5y@A4&yjPo(>cgl_8QyuUIP*O%dg0_-h=a0 z(QavuxQm890z^6LV){Akn=QR{&kQ4+@m)=qpG*zhc1c`>l$a=dQC`)h7c3>uJf|GL zdR49T48YPxn=kphPL_J}tu0cT;bJ;O)#6|9dB+ec6y9dv7e!6mRl;CdqqE<)8CjDN zP1eHI%1CDV!SjtW>X+pkrAX(}ohNE~^y^qSXv@j6L~=I>?3wh_lKLB_!g~2bXN9*5E`BhB*COXY`^%v)xQq{W@ZTkQ!kaxA;Y1MO7 zyE*Pv34DEHYf}7dhfcFd&ZahHA=Sql?LZpGO2xf*(dDc2uY#k2FxYgmK)q9DxVLdTy<7uwZ65rc5k=_Bf4yS zkUdzZP*b_5Ygq%kI~~Ie3SNndh9t3A8VhNuZ^{I?qzU*ykP$?7cyr7Ne~ATj7sU_| zrh?l+iHNRM!iiEBd0Z2n7W%2k#qf9Idd=pwdxlIgHo6^}x(YMd&I(`40Pdz~dX$9- zS~mk~^7v8CZtT+UUg8sXye+2HUol7DJ04e)9aOjUbRmQ)sxNKj6-VY0#IjnrD$%mW zbv`6KtB}9MuUd;Yi%C)y@$vrM{iO6HDQkrlI11$+)rF4e=bKz^9W#s?2Glg zvBQKS+vDYD3JJ`|3^}?pu$~f!IG=KF2xB)Anpl~l+vW9e_tM~}JFsU^hxj%|Gp)4_ zCvt8eCY#~Gz7ryv_BuLq)9o^l_1K~5ZpbBkrU+Mlnr%SU+GJmCIpg_oml7{J8rGIQ z`)$Sh__b5f6)(;h1>mXKl~|V5ZpEXjdyrt!e<9FXYb-rZSYYVuGG)2bmEDtjtv$5N z|Jf-v3YZu%`0hS#aYeeQHi)K++S8;nBeR`X_GvbcyT}b*Tl|3(DdBEw%R9EM>=p)n zSKT}atnJlhkRCJ~j{@fgM+{Ya1}y|jHvX9i`b~M10VvQ<9+*!WWTgNW5AtV^b21Vf-95Vt)#Id<+2xxcIP7htS~qS65VR*xcL_{`;nJVJ{LnG=jdT zEXxm+Xs?`y-jZyGtHQ*Fmc15MfPXtkLIOe1fnz(MZCg<)O$^)4X6s@X-2lPOjvQg~ zu$bm1!(rYrr_Bm&M#Y?yc}_^B$fAIa53wb^UhQ^F5hJfe%jSc7R> z6N+_x78+%SGU6FF?mwr3)xDSl4rCKEvr#G|iY@zx~-!R(wYH*7^w&1xt66 zkvoBSo~fE#q<&fVXoe1lVu%!$u$ZQ84W059sf1iQUoqO|j9&n^Bi5sh+ITs%dr4j7 zR)X87(3Tg{n+p#{*}PcIDz|E&=ar!P>mX$(ZE4C*n`FyJ#F{+Nu{r2EPV~m~1P77F ze5)!5XZ$E`S9zP!R&b7-PcN5^jgAf0vI$qDXhvNl-az36ciI9EmP?WVA0%vE>g!k0^km|8EQu`=1gdd%*_o4H@ zIA)9oet;SyXk&EuMhtuj@LZ&WMF$vUQQ*sT4$dJ<=sdgtUwH6bG@!%(MMr@`|F`m- z6&E5$JTTP$>UeAjRT9WqM^untmf|F@ zAbNGECHnj0_SJkOcp0l2h@mg|7j~!X8KV_0vNC-!oxcPnx{Qxz#@oZ0x(@M16K~5`BYQCUnCWyX z#^rzTFRJJ>TLsi~@%4OXGy}Si-<5CHL>fIj^k7NGokN@B;^#YAmrk|l`JAWHzi5Pa zb|8~Aj#XNbA_s>4++P#S#|LAHiodZi;)b@=seGP#pQ&&wXu zKa*Il>1heJvc1r$$QF(%N4|<4)cs7$vTW$vX-uTa?U}~Z*Q;0d#ljaP2X5DS7iO)2`J;?2Wsr!GD9(f zcl8ZWlZHHl5`s!>1Nd9UJ4g#(KA<8S82EPw(g=8ioSF5vOBiAd-0?3BJ_?n-qnQbS zFbQKQ!fUgGK!LXr_#POGLxS;x4He!A<27`NLZb8C94WmO?s?Qlw~B+;m~@#Dvoc4$ zX0JJMttXl!7(^d)mi#DbDfV@H;b>R?>`+)S&@h(hz@>sF+-uEU=!MGg>NsD{&h)z8 zBgeV^1KWXp!Ai_Xz(nE4P-x=l4Z6$w*rMCH>K?KcJf`9b%8YR85|Op8Wlx_ms4?gI zw1nGBO>GNVu2(+HfVyyY7 zr{F4@TII;@4q2bIK&Zb5pVs@tC0845HW>B=S^D*> z!^YedmtF$Yw%;ys$jM)iy0HdhRm^9-gJLB1c$e$5^Q1H>dOD1pKogFi{>h9N$cHEs zgW86%a&Z&<2~Nb{@A38`L?9r1DXy$gE^P#Xslun1@$^|1Rm#EF>WTQNi8wsJRX)2- zBx99L3Q)qtIq%h%JtE?CoS*$RI8Tv3++^USKPGIbNvx4HiaCZ^7hG}^FYu&^?>q-x z?u;`jxr^p7nU9)O!ix$6bMCcZ(!1DGqSynPR)#KZLaspG$WJYt8l`8@HyY>dvi9bd z9h2wyjg#G;Q1W|=&h|v73_Ey>Q9j&-pCtc4TnGvj`39MP*!-l(pX%yYXki%p)!Mpq zbvrSoHY;Y~f&2>d(pouO(*C5mgIghgW3o^Xp{L)?^0|H7UWY0Ukg6CjfZ7NlDL#ax z93seU)LB3}Ie@4-qy}*G-x*gFn;CGqC(a;*=muZ|@00`(Q%?y-MBt+W*TCsEu<@h< zG~kOv7hFsY08~g4fQcNWC`-Wg0*45uI33*0rTbro4A)=N@SmXv1_cb}e>KQSs^S*- z_kcO+-wG>-_y%AD7gc$3)IWWNOvm;JzJ|bvaHSRnO6y3dyO$fSZwg_Iq^(_A!Ov)I zvg%5xTE1wUfkMcPOjPO+>zV45z*~aY&Sa!9+Y3VO(O3KUiLL;hdEBVgmb`Nfwxb~( zUiXG>+^n@RlX)IxQa%4Yy+X9=PI-bY)^^K2B=krvhG&w~FM3qC25mTdVg*t;>X~dh zBcPb}^TIr5^pu~+Yn>*P^?Onq@8G=<5J7&JKIJ%q4Q+L!7PZl1#3_KzSz)rjSo|0i za(Z5|avC5F?H|3FR~q!Y)?3mJNq)%F>uT&`ZdLbWXDymkvPXg39J#d3bFk2EBF0{b zczE|@+f=_~c;|M<`rA9|MMM{SqN5x@oM%WydCfFlT;Yy>8T-Pz+JMDm8|~xj5oXAb zhWv!O(u!c0bC>J(L8FrhZ3 zn%Z#HwV?bkQR21tK)yyAeGjm|Ug-T6Fdi}y2?QofR%`yLs(=si2I_^Zll)G@ZxZc` zH}5Ig4hsyHkEr6z6TQ0!a2Is0K{Vhj_VBaA(^=z~3vrAh{72;sR~;><9mYQ1xmhG4Z4sKH}%D>a(9ZyckjHk%qi+=Ag<#aB=^)AMZvn(GrB*sky*{*7eA z_VQK6=!2LrrEw29t3?#pf+0#H7;1l^&c0|y0}%2V0G3iufxrSQ0!bXj^Y4BR^Z~{{ zL)#S#?fd>N!Jn&+`v%W&cz*|(fH3MfnRZ>9wOMMFRRz^tSD?}X813^aeFFDxX zYEPtzkQ3)&5!5U|GbVy5bvG6vxEr7-6t_izxq`vC59r6}0Ob2C*0`PUQSKm=e5W^{ z>OcswYTigT;lVnLKnpIN$kItP_^O9oL%U`zwK0VjQsAMP{SwFnu_w@ub-K-em@YUfO2;!a|9X< z#ufIOWMjIH)_e*tFZ9r+o82hbFVU*0LTd zsnbZh^iy{IMs~!ra|gnjEz&9|`1Tc=K#Z!M;LY~_w^&oY9eJXbYvv2lbkJ>!ZnRvC zE4jy(R4o||aN&U;z?t=TzeB#09=HS%D%r!g-aBx>1zJ5g zGeW@k9quk6r$^pd!@yAn;sqq|z7AmjgrjK+##A6Yq+-$l$TYyE3czwWhIt0(ZZY^f zS}GD3fFY3AcaDBAupmfa1pYP%9D5)E+>#2w2LSrsK&VLc zZKbCQfyX;>9pvd@>^12oJ-D^}Vy&(AW0*P!^^xd2Y8=V*U?bnQ=IJgJ`-xcIXV+CX zA4mIzz0p^ri}mK`Oo+6hzg~KnN)VzE;>_nNJ$?JpAjz|icfIMUkiQz-3WC!CB7=vE zz}Nw_ri>K4LL597P#4biSEKzc`@Vb5f1mf=5@)WD-i;YP9PwlTgN6mfVBT_ zqbOID`cIMmix&a00iyFyY6OP<2a|67L#qFC0a^%dMruxJ`0vj42#!)c#o7O=T(}_I zOErLCK|_q!UY(X>t2R1iZ@ zed%-AHW8;yJK5<`Sb+o3oG^_k!W&(l-(pSSYY_8VjjM(1o{?03- z+-IjL6^Uw4PvTqDe$q74>KUh1HtSCki}FgmMCbB5f{UtLp_n{{cIK5*(3lXF3+dLj zZ)e?OK&^O+9Ctx@Z z5d`>{{~Z7s{e9l>XHKzY{C`9UzR)88*MNL$Oytpj+X%2Dichl01F#vFBN%eYRylZA zCL6@9DfR4iRYeBo-g)=au&;HzR#zgAh!8@#$XQmm#D|F;;;XB>CaaTenXj@-vcCHw zKy~ipFER1>uVDGoD^e zet{{}9?AOc9YtVK3POrUN|b`tq&35jxgRg_z#)X?XS&1CPW9(}jvpQ?vviYLxo5d0 ziR9yF%5*DmXp^`#-`-cbot)Hs`ZkY=+V)XbPF106YN`eHZonn$L{nvc@6`FzA%)-` zBSJ+jrU^nfLM6AikR~611n>6OC^y3Ll<5CuA-~%Z!Or}jRfi-__)o9j`8EE}6#qBX z|B;l#*AL?GzvUMNRu8)PU+DRF<=&xT_@|;-+@uzC~z2NDwh8!NAgjfCEDD$l)MS!ntu_L{+R$=&w>3P;7B7zytltrg3Z$c)IY z>I_dLN^p+2z6DPQj+Ibm%C;IRs|vY|Hj}d3NPhUQZ!>5y0gMH~;FmE1C+oktfkP@p z0I-G-B#gie@WYL2F1U!^ZC-aG4HxUb$20iO1dlu8b_Tru%UK3a;XGwQ!*^@q-`6CJ z;j9@X@LrT$20*f34;jO&Ac1j#2!tK*t=`Re27E%n{KF^pKj$y}-ZCb8&V2&WFyT3vtwPOo z>T-9N-po=R4V1|pWQOf+K+8yIa=8}$+-#0kh_m)(;@6}W)^AwZ89NXI(!K<6fQ663 zWDRr#3S3(t>INyrOG7wh;9)U-3=Z(iNa01E!14lI`+Rq=@Ok6_w$;C%fi&R>zNH&v z2fqLpR^VL&zm~!W%rcNp06T-glOWCjZ9M-D0}L^MEx|QHcm*m*mB)qt3ol%SYcU|$Ae4s< zM=dcC03MfG`>Q4X2P049(0yT4!r4F&)V26eLV z5g_RRKLLRP5P1tk4Wl6C4yi*gfO4bAWkhfRTP-s90pN~@7vMMx{xd{Uhxp+=vZOAQ z&VWSR>0J0;uq7n}_i#pK1H7*AVt57!=ZMldkRarLrXzeF;D;}mv{dj05zHO}HVQb~ zgHJTzW&yM749o-Yvw+att!_2O)O%cj+^vmDgmg5APOG|q=nw87VyvDf8+qat9$Sr v=uQ&gH%qb(f8>hrY*4uD$1TI3I8aF77r<`{KK?VHj#42CvV;n#f2RK*Sw_%e