From d067afdbb2db02d1df96d8e3bd8ca5b55dfa312f Mon Sep 17 00:00:00 2001
From: jinglong <1309572580@qq.com>
Date: Wed, 27 Nov 2019 15:19:25 +0800
Subject: [PATCH] 增加文件

---
 addons/command/Command.php                                                      |   69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/command/application/admin/controller/Command.php                         |  219 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/command/application/admin/lang/zh-cn/command.php                         |   16 ++++++++++++++++
 addons/command/application/admin/model/Command.php                              |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/command/application/admin/validate/Command.php                           |   27 +++++++++++++++++++++++++++
 addons/command/application/admin/view/command/add.html                          |  400 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/command/application/admin/view/command/detail.html                       |   42 ++++++++++++++++++++++++++++++++++++++++++
 addons/command/application/admin/view/command/index.html                        |   25 +++++++++++++++++++++++++
 addons/command/config.php                                                       |    4 ++++
 addons/command/controller/Index.php                                             |   15 +++++++++++++++
 addons/command/info.ini                                                         |    8 ++++++++
 addons/command/install.sql                                                      |   12 ++++++++++++
 addons/command/library/Output.php                                               |   28 ++++++++++++++++++++++++++++
 addons/command/public/assets/js/backend/command.js                              |  234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/Nkeditor.php                                                    |   63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/README.md                                                       |   17 +++++++++++++++++
 addons/nkeditor/assets/css/common.css                                           |    5 +++++
 addons/nkeditor/assets/img/download.png                                         | Bin 0 -> 1141 bytes
 addons/nkeditor/assets/img/downloading.png                                      | Bin 0 -> 8849 bytes
 addons/nkeditor/assets/js/customplugin.js                                       |   74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/lang/ar.js                                               |  242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/lang/en.js                                               |  243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/lang/ja-JP.js                                            |  234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/lang/ko.js                                               |  246 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/lang/ru.js                                               |  242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/lang/zh-CN.js                                            |  267 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/lang/zh-TW.js                                            |  243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/nkeditor.js                                              | 9532 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/nkeditor.min.js                                          |    1 +
 addons/nkeditor/assets/plugins/anchor/anchor.js                                 |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/autoheight/autoheight.js                         |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/baidumap/baidumap.js                             |   91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/baidumap/index.html                              |  102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/baidumap/map.html                                |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/clearhtml/clearhtml.js                           |   29 +++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/code/code.js                                     |   64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/code/pretty.js                                   |   18 ++++++++++++++++++
 addons/nkeditor/assets/plugins/code/prism.css                                   |  292 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/code/prism.js                                    |   26 ++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/emoticons/emoticons.js                           |  129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/emoticons/images/0.gif                           | Bin 0 -> 1810 bytes
 addons/nkeditor/assets/plugins/emoticons/images/1.gif                           | Bin 0 -> 1582 bytes
 addons/nkeditor/assets/plugins/emoticons/images/10.gif                          | Bin 0 -> 3716 bytes
 addons/nkeditor/assets/plugins/emoticons/images/100.gif                         | Bin 0 -> 1780 bytes
 addons/nkeditor/assets/plugins/emoticons/images/101.gif                         | Bin 0 -> 2443 bytes
 addons/nkeditor/assets/plugins/emoticons/images/102.gif                         | Bin 0 -> 1446 bytes
 addons/nkeditor/assets/plugins/emoticons/images/103.gif                         | Bin 0 -> 2166 bytes
 addons/nkeditor/assets/plugins/emoticons/images/104.gif                         | Bin 0 -> 2169 bytes
 addons/nkeditor/assets/plugins/emoticons/images/105.gif                         | Bin 0 -> 1277 bytes
 addons/nkeditor/assets/plugins/emoticons/images/106.gif                         | Bin 0 -> 1041 bytes
 addons/nkeditor/assets/plugins/emoticons/images/107.gif                         | Bin 0 -> 1058 bytes
 addons/nkeditor/assets/plugins/emoticons/images/108.gif                         | Bin 0 -> 1046 bytes
 addons/nkeditor/assets/plugins/emoticons/images/109.gif                         | Bin 0 -> 1081 bytes
 addons/nkeditor/assets/plugins/emoticons/images/11.gif                          | Bin 0 -> 8033 bytes
 addons/nkeditor/assets/plugins/emoticons/images/110.gif                         | Bin 0 -> 1082 bytes
 addons/nkeditor/assets/plugins/emoticons/images/111.gif                         | Bin 0 -> 1039 bytes
 addons/nkeditor/assets/plugins/emoticons/images/112.gif                         | Bin 0 -> 1111 bytes
 addons/nkeditor/assets/plugins/emoticons/images/113.gif                         | Bin 0 -> 1015 bytes
 addons/nkeditor/assets/plugins/emoticons/images/114.gif                         | Bin 0 -> 1003 bytes
 addons/nkeditor/assets/plugins/emoticons/images/115.gif                         | Bin 0 -> 1061 bytes
 addons/nkeditor/assets/plugins/emoticons/images/116.gif                         | Bin 0 -> 996 bytes
 addons/nkeditor/assets/plugins/emoticons/images/117.gif                         | Bin 0 -> 1041 bytes
 addons/nkeditor/assets/plugins/emoticons/images/118.gif                         | Bin 0 -> 1012 bytes
 addons/nkeditor/assets/plugins/emoticons/images/119.gif                         | Bin 0 -> 1101 bytes
 addons/nkeditor/assets/plugins/emoticons/images/12.gif                          | Bin 0 -> 2247 bytes
 addons/nkeditor/assets/plugins/emoticons/images/120.gif                         | Bin 0 -> 1008 bytes
 addons/nkeditor/assets/plugins/emoticons/images/121.gif                         | Bin 0 -> 1060 bytes
 addons/nkeditor/assets/plugins/emoticons/images/122.gif                         | Bin 0 -> 999 bytes
 addons/nkeditor/assets/plugins/emoticons/images/123.gif                         | Bin 0 -> 1055 bytes
 addons/nkeditor/assets/plugins/emoticons/images/124.gif                         | Bin 0 -> 1022 bytes
 addons/nkeditor/assets/plugins/emoticons/images/125.gif                         | Bin 0 -> 1013 bytes
 addons/nkeditor/assets/plugins/emoticons/images/126.gif                         | Bin 0 -> 1030 bytes
 addons/nkeditor/assets/plugins/emoticons/images/127.gif                         | Bin 0 -> 956 bytes
 addons/nkeditor/assets/plugins/emoticons/images/128.gif                         | Bin 0 -> 1022 bytes
 addons/nkeditor/assets/plugins/emoticons/images/129.gif                         | Bin 0 -> 972 bytes
 addons/nkeditor/assets/plugins/emoticons/images/13.gif                          | Bin 0 -> 1736 bytes
 addons/nkeditor/assets/plugins/emoticons/images/130.gif                         | Bin 0 -> 980 bytes
 addons/nkeditor/assets/plugins/emoticons/images/131.gif                         | Bin 0 -> 945 bytes
 addons/nkeditor/assets/plugins/emoticons/images/132.gif                         | Bin 0 -> 936 bytes
 addons/nkeditor/assets/plugins/emoticons/images/133.gif                         | Bin 0 -> 1012 bytes
 addons/nkeditor/assets/plugins/emoticons/images/134.gif                         | Bin 0 -> 968 bytes
 addons/nkeditor/assets/plugins/emoticons/images/14.gif                          | Bin 0 -> 4006 bytes
 addons/nkeditor/assets/plugins/emoticons/images/15.gif                          | Bin 0 -> 1562 bytes
 addons/nkeditor/assets/plugins/emoticons/images/16.gif                          | Bin 0 -> 1413 bytes
 addons/nkeditor/assets/plugins/emoticons/images/17.gif                          | Bin 0 -> 3366 bytes
 addons/nkeditor/assets/plugins/emoticons/images/18.gif                          | Bin 0 -> 8137 bytes
 addons/nkeditor/assets/plugins/emoticons/images/19.gif                          | Bin 0 -> 8135 bytes
 addons/nkeditor/assets/plugins/emoticons/images/2.gif                           | Bin 0 -> 1804 bytes
 addons/nkeditor/assets/plugins/emoticons/images/20.gif                          | Bin 0 -> 1808 bytes
 addons/nkeditor/assets/plugins/emoticons/images/21.gif                          | Bin 0 -> 1864 bytes
 addons/nkeditor/assets/plugins/emoticons/images/22.gif                          | Bin 0 -> 3010 bytes
 addons/nkeditor/assets/plugins/emoticons/images/23.gif                          | Bin 0 -> 1950 bytes
 addons/nkeditor/assets/plugins/emoticons/images/24.gif                          | Bin 0 -> 2257 bytes
 addons/nkeditor/assets/plugins/emoticons/images/25.gif                          | Bin 0 -> 2446 bytes
 addons/nkeditor/assets/plugins/emoticons/images/26.gif                          | Bin 0 -> 4014 bytes
 addons/nkeditor/assets/plugins/emoticons/images/27.gif                          | Bin 0 -> 2893 bytes
 addons/nkeditor/assets/plugins/emoticons/images/28.gif                          | Bin 0 -> 3262 bytes
 addons/nkeditor/assets/plugins/emoticons/images/29.gif                          | Bin 0 -> 5861 bytes
 addons/nkeditor/assets/plugins/emoticons/images/3.gif                           | Bin 0 -> 1852 bytes
 addons/nkeditor/assets/plugins/emoticons/images/30.gif                          | Bin 0 -> 1780 bytes
 addons/nkeditor/assets/plugins/emoticons/images/31.gif                          | Bin 0 -> 5174 bytes
 addons/nkeditor/assets/plugins/emoticons/images/32.gif                          | Bin 0 -> 7189 bytes
 addons/nkeditor/assets/plugins/emoticons/images/33.gif                          | Bin 0 -> 4317 bytes
 addons/nkeditor/assets/plugins/emoticons/images/34.gif                          | Bin 0 -> 2140 bytes
 addons/nkeditor/assets/plugins/emoticons/images/35.gif                          | Bin 0 -> 13392 bytes
 addons/nkeditor/assets/plugins/emoticons/images/36.gif                          | Bin 0 -> 1417 bytes
 addons/nkeditor/assets/plugins/emoticons/images/37.gif                          | Bin 0 -> 1195 bytes
 addons/nkeditor/assets/plugins/emoticons/images/38.gif                          | Bin 0 -> 1674 bytes
 addons/nkeditor/assets/plugins/emoticons/images/39.gif                          | Bin 0 -> 1798 bytes
 addons/nkeditor/assets/plugins/emoticons/images/4.gif                           | Bin 0 -> 1977 bytes
 addons/nkeditor/assets/plugins/emoticons/images/40.gif                          | Bin 0 -> 10092 bytes
 addons/nkeditor/assets/plugins/emoticons/images/41.gif                          | Bin 0 -> 3368 bytes
 addons/nkeditor/assets/plugins/emoticons/images/42.gif                          | Bin 0 -> 13367 bytes
 addons/nkeditor/assets/plugins/emoticons/images/43.gif                          | Bin 0 -> 4327 bytes
 addons/nkeditor/assets/plugins/emoticons/images/44.gif                          | Bin 0 -> 1571 bytes
 addons/nkeditor/assets/plugins/emoticons/images/45.gif                          | Bin 0 -> 4692 bytes
 addons/nkeditor/assets/plugins/emoticons/images/46.gif                          | Bin 0 -> 5162 bytes
 addons/nkeditor/assets/plugins/emoticons/images/47.gif                          | Bin 0 -> 3685 bytes
 addons/nkeditor/assets/plugins/emoticons/images/48.gif                          | Bin 0 -> 1755 bytes
 addons/nkeditor/assets/plugins/emoticons/images/49.gif                          | Bin 0 -> 6361 bytes
 addons/nkeditor/assets/plugins/emoticons/images/5.gif                           | Bin 0 -> 1866 bytes
 addons/nkeditor/assets/plugins/emoticons/images/50.gif                          | Bin 0 -> 3073 bytes
 addons/nkeditor/assets/plugins/emoticons/images/51.gif                          | Bin 0 -> 3731 bytes
 addons/nkeditor/assets/plugins/emoticons/images/52.gif                          | Bin 0 -> 1532 bytes
 addons/nkeditor/assets/plugins/emoticons/images/53.gif                          | Bin 0 -> 2056 bytes
 addons/nkeditor/assets/plugins/emoticons/images/54.gif                          | Bin 0 -> 2362 bytes
 addons/nkeditor/assets/plugins/emoticons/images/55.gif                          | Bin 0 -> 1582 bytes
 addons/nkeditor/assets/plugins/emoticons/images/56.gif                          | Bin 0 -> 1170 bytes
 addons/nkeditor/assets/plugins/emoticons/images/57.gif                          | Bin 0 -> 5072 bytes
 addons/nkeditor/assets/plugins/emoticons/images/58.gif                          | Bin 0 -> 2596 bytes
 addons/nkeditor/assets/plugins/emoticons/images/59.gif                          | Bin 0 -> 1533 bytes
 addons/nkeditor/assets/plugins/emoticons/images/6.gif                           | Bin 0 -> 3556 bytes
 addons/nkeditor/assets/plugins/emoticons/images/60.gif                          | Bin 0 -> 2667 bytes
 addons/nkeditor/assets/plugins/emoticons/images/61.gif                          | Bin 0 -> 1136 bytes
 addons/nkeditor/assets/plugins/emoticons/images/62.gif                          | Bin 0 -> 1269 bytes
 addons/nkeditor/assets/plugins/emoticons/images/63.gif                          | Bin 0 -> 971 bytes
 addons/nkeditor/assets/plugins/emoticons/images/64.gif                          | Bin 0 -> 988 bytes
 addons/nkeditor/assets/plugins/emoticons/images/65.gif                          | Bin 0 -> 5285 bytes
 addons/nkeditor/assets/plugins/emoticons/images/66.gif                          | Bin 0 -> 1159 bytes
 addons/nkeditor/assets/plugins/emoticons/images/67.gif                          | Bin 0 -> 2746 bytes
 addons/nkeditor/assets/plugins/emoticons/images/68.gif                          | Bin 0 -> 4148 bytes
 addons/nkeditor/assets/plugins/emoticons/images/69.gif                          | Bin 0 -> 1015 bytes
 addons/nkeditor/assets/plugins/emoticons/images/7.gif                           | Bin 0 -> 3929 bytes
 addons/nkeditor/assets/plugins/emoticons/images/70.gif                          | Bin 0 -> 1162 bytes
 addons/nkeditor/assets/plugins/emoticons/images/71.gif                          | Bin 0 -> 824 bytes
 addons/nkeditor/assets/plugins/emoticons/images/72.gif                          | Bin 0 -> 3679 bytes
 addons/nkeditor/assets/plugins/emoticons/images/73.gif                          | Bin 0 -> 2195 bytes
 addons/nkeditor/assets/plugins/emoticons/images/74.gif                          | Bin 0 -> 2454 bytes
 addons/nkeditor/assets/plugins/emoticons/images/75.gif                          | Bin 0 -> 1222 bytes
 addons/nkeditor/assets/plugins/emoticons/images/76.gif                          | Bin 0 -> 1211 bytes
 addons/nkeditor/assets/plugins/emoticons/images/77.gif                          | Bin 0 -> 1151 bytes
 addons/nkeditor/assets/plugins/emoticons/images/78.gif                          | Bin 0 -> 1565 bytes
 addons/nkeditor/assets/plugins/emoticons/images/79.gif                          | Bin 0 -> 1518 bytes
 addons/nkeditor/assets/plugins/emoticons/images/8.gif                           | Bin 0 -> 4679 bytes
 addons/nkeditor/assets/plugins/emoticons/images/80.gif                          | Bin 0 -> 1537 bytes
 addons/nkeditor/assets/plugins/emoticons/images/81.gif                          | Bin 0 -> 1591 bytes
 addons/nkeditor/assets/plugins/emoticons/images/82.gif                          | Bin 0 -> 1547 bytes
 addons/nkeditor/assets/plugins/emoticons/images/83.gif                          | Bin 0 -> 1591 bytes
 addons/nkeditor/assets/plugins/emoticons/images/84.gif                          | Bin 0 -> 3424 bytes
 addons/nkeditor/assets/plugins/emoticons/images/85.gif                          | Bin 0 -> 1581 bytes
 addons/nkeditor/assets/plugins/emoticons/images/86.gif                          | Bin 0 -> 1519 bytes
 addons/nkeditor/assets/plugins/emoticons/images/87.gif                          | Bin 0 -> 1558 bytes
 addons/nkeditor/assets/plugins/emoticons/images/88.gif                          | Bin 0 -> 2134 bytes
 addons/nkeditor/assets/plugins/emoticons/images/89.gif                          | Bin 0 -> 1219 bytes
 addons/nkeditor/assets/plugins/emoticons/images/9.gif                           | Bin 0 -> 3298 bytes
 addons/nkeditor/assets/plugins/emoticons/images/90.gif                          | Bin 0 -> 2743 bytes
 addons/nkeditor/assets/plugins/emoticons/images/91.gif                          | Bin 0 -> 654 bytes
 addons/nkeditor/assets/plugins/emoticons/images/92.gif                          | Bin 0 -> 1377 bytes
 addons/nkeditor/assets/plugins/emoticons/images/93.gif                          | Bin 0 -> 1119 bytes
 addons/nkeditor/assets/plugins/emoticons/images/94.gif                          | Bin 0 -> 3426 bytes
 addons/nkeditor/assets/plugins/emoticons/images/95.gif                          | Bin 0 -> 3011 bytes
 addons/nkeditor/assets/plugins/emoticons/images/96.gif                          | Bin 0 -> 1796 bytes
 addons/nkeditor/assets/plugins/emoticons/images/97.gif                          | Bin 0 -> 5300 bytes
 addons/nkeditor/assets/plugins/emoticons/images/98.gif                          | Bin 0 -> 1629 bytes
 addons/nkeditor/assets/plugins/emoticons/images/99.gif                          | Bin 0 -> 2261 bytes
 addons/nkeditor/assets/plugins/emoticons/images/static.gif                      | Bin 0 -> 35504 bytes
 addons/nkeditor/assets/plugins/filemanager/FManager.js                          |  307 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/filemanager/FManager.min.js                      |    2 ++
 addons/nkeditor/assets/plugins/filemanager/css/filemanager.min.css              |    0
 addons/nkeditor/assets/plugins/filemanager/filemanager.js                       |   35 +++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/fixtoolbar/fixtoolbar.js                         |   35 +++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/flash/flash.js                                   |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/graft/css/images/addimg.png                      | Bin 0 -> 628 bytes
 addons/nkeditor/assets/plugins/graft/css/images/blur.png                        | Bin 0 -> 3376 bytes
 addons/nkeditor/assets/plugins/graft/css/images/brush.png                       | Bin 0 -> 608 bytes
 addons/nkeditor/assets/plugins/graft/css/images/delimg.png                      | Bin 0 -> 516 bytes
 addons/nkeditor/assets/plugins/graft/css/images/delimgH.png                     | Bin 0 -> 578 bytes
 addons/nkeditor/assets/plugins/graft/css/images/empty.png                       | Bin 0 -> 519 bytes
 addons/nkeditor/assets/plugins/graft/css/images/emptyH.png                      | Bin 0 -> 657 bytes
 addons/nkeditor/assets/plugins/graft/css/images/eraser.png                      | Bin 0 -> 43271 bytes
 addons/nkeditor/assets/plugins/graft/css/images/init.png                        | Bin 0 -> 695 bytes
 addons/nkeditor/assets/plugins/graft/css/images/redo.png                        | Bin 0 -> 454 bytes
 addons/nkeditor/assets/plugins/graft/css/images/redoH.png                       | Bin 0 -> 536 bytes
 addons/nkeditor/assets/plugins/graft/css/images/save.png                        | Bin 0 -> 837 bytes
 addons/nkeditor/assets/plugins/graft/css/images/scale.png                       | Bin 0 -> 435 bytes
 addons/nkeditor/assets/plugins/graft/css/images/scaleH.png                      | Bin 0 -> 330 bytes
 addons/nkeditor/assets/plugins/graft/css/images/size.png                        | Bin 0 -> 775 bytes
 addons/nkeditor/assets/plugins/graft/css/images/undo.png                        | Bin 0 -> 444 bytes
 addons/nkeditor/assets/plugins/graft/css/images/undoH.png                       | Bin 0 -> 511 bytes
 addons/nkeditor/assets/plugins/graft/css/scrawl.css                             |  204 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/graft/css/scrawl.css.map                         |    7 +++++++
 addons/nkeditor/assets/plugins/graft/css/scrawl.scss                            |  284 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/graft/graft.js                                   |  189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/graft/index.html                                 |  134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/graft/scrawl.js                                  |  262 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/image/image.js                                   |  340 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/image/images/align_left.gif                      | Bin 0 -> 639 bytes
 addons/nkeditor/assets/plugins/image/images/align_right.gif                     | Bin 0 -> 636 bytes
 addons/nkeditor/assets/plugins/image/images/align_top.gif                       | Bin 0 -> 625 bytes
 addons/nkeditor/assets/plugins/image/images/refresh.png                         | Bin 0 -> 800 bytes
 addons/nkeditor/assets/plugins/insertfile/insertfile.js                         |  141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/lineheight/lineheight.js                         |   38 ++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/link/link.js                                     |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/map/map.html                                     |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/map/map.js                                       |  137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/media/media.js                                   |  186 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/multiimage/BUpload.js                            |  625 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/multiimage/BUpload.min.js                        |    2 ++
 addons/nkeditor/assets/plugins/multiimage/css/icons/aep.png                     | Bin 0 -> 11058 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/asp.png                     | Bin 0 -> 27562 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/avi.png                     | Bin 0 -> 11778 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/c.png                       | Bin 0 -> 7341 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/conf.png                    | Bin 0 -> 12352 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/css.png                     | Bin 0 -> 26823 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/default.png                 | Bin 0 -> 27900 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/doc.png                     | Bin 0 -> 14939 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/eml.png                     | Bin 0 -> 13584 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/eps.png                     | Bin 0 -> 10488 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/fla.png                     | Bin 0 -> 11240 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/htm.png                     | Bin 0 -> 26753 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/idn.png                     | Bin 0 -> 10993 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/ini.png                     | Bin 0 -> 9847 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/java.png                    | Bin 0 -> 26203 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/js.png                      | Bin 0 -> 9156 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/jsf.png                     | Bin 0 -> 10661 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/markdown.png                | Bin 0 -> 9053 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/mdb.png                     | Bin 0 -> 15587 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/midi.png                    | Bin 0 -> 10479 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/mov.png                     | Bin 0 -> 11855 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/mp3.png                     | Bin 0 -> 12130 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/mpeg.png                    | Bin 0 -> 14349 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/pdf.png                     | Bin 0 -> 12064 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/php.png                     | Bin 0 -> 11551 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/ppt.png                     | Bin 0 -> 14255 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/psd.png                     | Bin 0 -> 11360 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/pst.png                     | Bin 0 -> 14430 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/pub.png                     | Bin 0 -> 15185 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/py.png                      | Bin 0 -> 24844 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/rb.png                      | Bin 0 -> 25872 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/rmvb.png                    | Bin 0 -> 14349 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/scss.png                    | Bin 0 -> 10890 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/sql.png                     | Bin 0 -> 26862 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/tif.png                     | Bin 0 -> 11254 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/txt.png                     | Bin 0 -> 9035 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/vsd.png                     | Bin 0 -> 14362 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/wav.png                     | Bin 0 -> 18838 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/wma.png                     | Bin 0 -> 12844 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/wmv.png                     | Bin 0 -> 12468 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/xls.png                     | Bin 0 -> 15671 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/xml.png                     | Bin 0 -> 26594 bytes
 addons/nkeditor/assets/plugins/multiimage/css/icons/zip.png                     | Bin 0 -> 10319 bytes
 addons/nkeditor/assets/plugins/multiimage/css/images/dialog-title-bg.png        | Bin 0 -> 938 bytes
 addons/nkeditor/assets/plugins/multiimage/css/images/icons-all.gif              | Bin 0 -> 3750 bytes
 addons/nkeditor/assets/plugins/multiimage/css/images/icons.png                  | Bin 0 -> 2678 bytes
 addons/nkeditor/assets/plugins/multiimage/css/images/image.png                  | Bin 0 -> 1672 bytes
 addons/nkeditor/assets/plugins/multiimage/css/images/loader.gif                 | Bin 0 -> 1787 bytes
 addons/nkeditor/assets/plugins/multiimage/css/images/progress.png               | Bin 0 -> 1269 bytes
 addons/nkeditor/assets/plugins/multiimage/css/images/success.png                | Bin 0 -> 1621 bytes
 addons/nkeditor/assets/plugins/multiimage/css/upload.css                        |  552 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/multiimage/css/upload.css.map                    |    7 +++++++
 addons/nkeditor/assets/plugins/multiimage/css/upload.min.css                    |    1 +
 addons/nkeditor/assets/plugins/multiimage/css/upload.scss                       |  642 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/multiimage/multiimage.js                         |   90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/multiimage/template/template.html                |   95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/pagebreak/pagebreak.js                           |   27 +++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/plainpaste/plainpaste.js                         |   41 +++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/preview/preview.js                               |  134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/quickformat/quickformat.js                       |   81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/quote/quote.js                                   |   12 ++++++++++++
 addons/nkeditor/assets/plugins/table/table.js                                   |  746 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/template/html/1.html                             |   14 ++++++++++++++
 addons/nkeditor/assets/plugins/template/html/2.html                             |   42 ++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/template/html/3.html                             |   36 ++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/template/template.js                             |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/plugins/wordpaste/wordpaste.js                           |   79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/app.css                                           |   96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/black/editor.css                                  |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/black/editor.css.map                              |    7 +++++++
 addons/nkeditor/assets/themes/black/editor.min.css                              |    1 +
 addons/nkeditor/assets/themes/black/editor.scss                                 |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/black/images/nkeditor.png                         | Bin 0 -> 14650 bytes
 addons/nkeditor/assets/themes/black/images/nkeditor.svg                         |  260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/blue/editor.css                                   |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/blue/editor.css.map                               |    7 +++++++
 addons/nkeditor/assets/themes/blue/editor.min.css                               |    1 +
 addons/nkeditor/assets/themes/blue/editor.scss                                  |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/blue/images/nkeditor.png                          | Bin 0 -> 15428 bytes
 addons/nkeditor/assets/themes/blue/images/nkeditor.svg                          |  260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/common/anchor.gif                                 | Bin 0 -> 371 bytes
 addons/nkeditor/assets/themes/common/blank.gif                                  | Bin 0 -> 43 bytes
 addons/nkeditor/assets/themes/common/common.css                                 |  605 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/common/common.css.map                             |    7 +++++++
 addons/nkeditor/assets/themes/common/common.scss                                |  830 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/common/dialog-title-bg.png                        | Bin 0 -> 938 bytes
 addons/nkeditor/assets/themes/common/flash.gif                                  | Bin 0 -> 1089 bytes
 addons/nkeditor/assets/themes/common/flash.png                                  | Bin 0 -> 1133 bytes
 addons/nkeditor/assets/themes/common/flash.svg                                  |    1 +
 addons/nkeditor/assets/themes/common/icons-all.gif                              | Bin 0 -> 3750 bytes
 addons/nkeditor/assets/themes/common/loading.gif                                | Bin 0 -> 2608 bytes
 addons/nkeditor/assets/themes/common/media.gif                                  | Bin 0 -> 1036 bytes
 addons/nkeditor/assets/themes/common/play.png                                   | Bin 0 -> 1130 bytes
 addons/nkeditor/assets/themes/common/play.svg                                   |    1 +
 addons/nkeditor/assets/themes/common/rm.gif                                     | Bin 0 -> 989 bytes
 addons/nkeditor/assets/themes/default/editor.css                                | 1398 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/default/editor.min.css                            |    1 +
 addons/nkeditor/assets/themes/default/images/background.png                     | Bin 0 -> 1410 bytes
 addons/nkeditor/assets/themes/default/images/default.png                        | Bin 0 -> 8299 bytes
 addons/nkeditor/assets/themes/default/images/scrawl.png                         | Bin 0 -> 919 bytes
 addons/nkeditor/assets/themes/grey/editor.css                                   |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/grey/editor.css.map                               |    7 +++++++
 addons/nkeditor/assets/themes/grey/editor.min.css                               |    1 +
 addons/nkeditor/assets/themes/grey/editor.scss                                  |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/grey/images/nkeditor.png                          | Bin 0 -> 14637 bytes
 addons/nkeditor/assets/themes/grey/images/nkeditor.svg                          |  260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/primary/editor.css                                |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/primary/editor.css.map                            |    7 +++++++
 addons/nkeditor/assets/themes/primary/editor.min.css                            |    1 +
 addons/nkeditor/assets/themes/primary/editor.scss                               |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/assets/themes/primary/images/nkeditor.png                       | Bin 0 -> 15396 bytes
 addons/nkeditor/assets/themes/primary/images/nkeditor.svg                       |  260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/bootstrap.js                                                    |  285 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/config.php                                                      |   78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/controller/Index.php                                            |   99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/info.ini                                                        |    8 ++++++++
 addons/nkeditor/license.txt                                                     |  502 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/nkeditor/nodejs/word.js                                                  |   91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/qiniu/Qiniu.php                                                          |  101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/qiniu/bootstrap.js                                                       |   21 +++++++++++++++++++++
 addons/qiniu/config.php                                                         |  236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/qiniu/controller/Index.php                                               |  202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 addons/qiniu/info.ini                                                           |    8 ++++++++
 addons/qiniu/library/Auth.php                                                   |  160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 application/admin/command/Install/install.lock                                  |    1 +
 application/admin/controller/Banner.php                                         |   76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 application/admin/controller/Command.php                                        |  219 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 application/admin/controller/Index.php                                          |    8 ++++----
 application/admin/lang/zh-cn/banner.php                                         |    8 ++++++++
 application/admin/lang/zh-cn/command.php                                        |   16 ++++++++++++++++
 application/admin/model/Banner.php                                              |   40 ++++++++++++++++++++++++++++++++++++++++
 application/admin/model/Command.php                                             |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 application/admin/validate/Banner.php                                           |   27 +++++++++++++++++++++++++++
 application/admin/validate/Command.php                                          |   27 +++++++++++++++++++++++++++
 application/admin/view/banner/add.html                                          |   24 ++++++++++++++++++++++++
 application/admin/view/banner/edit.html                                         |   24 ++++++++++++++++++++++++
 application/admin/view/banner/index.html                                        |   35 +++++++++++++++++++++++++++++++++++
 application/admin/view/command/add.html                                         |  400 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 application/admin/view/command/detail.html                                      |   42 ++++++++++++++++++++++++++++++++++++++++++
 application/admin/view/command/index.html                                       |   25 +++++++++++++++++++++++++
 application/admin/view/common/menu.html                                         |    8 ++++----
 application/config.php                                                          |    2 +-
 application/database.php                                                        |    8 ++++----
 application/extra/addons.php                                                    |   12 ++++++++++++
 public/XzuemHTJfG.php                                                           |   38 ++++++++++++++++++++++++++++++++++++++
 public/admin.php                                                                |   38 --------------------------------------
 public/assets/addons/nkeditor/css/common.css                                    |    5 +++++
 public/assets/addons/nkeditor/img/download.png                                  | Bin 0 -> 1141 bytes
 public/assets/addons/nkeditor/img/downloading.png                               | Bin 0 -> 8849 bytes
 public/assets/addons/nkeditor/js/customplugin.js                                |   74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/lang/ar.js                                        |  242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/lang/en.js                                        |  243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/lang/ja-JP.js                                     |  234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/lang/ko.js                                        |  246 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/lang/ru.js                                        |  242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/lang/zh-CN.js                                     |  267 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/lang/zh-TW.js                                     |  243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/nkeditor.js                                       | 9532 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/nkeditor.min.js                                   |    1 +
 public/assets/addons/nkeditor/plugins/anchor/anchor.js                          |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/autoheight/autoheight.js                  |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/baidumap/baidumap.js                      |   91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/baidumap/index.html                       |  102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/baidumap/map.html                         |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/clearhtml/clearhtml.js                    |   29 +++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/code/code.js                              |   64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/code/pretty.js                            |   18 ++++++++++++++++++
 public/assets/addons/nkeditor/plugins/code/prism.css                            |  292 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/code/prism.js                             |   26 ++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/emoticons/emoticons.js                    |  129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/emoticons/images/0.gif                    | Bin 0 -> 1810 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/1.gif                    | Bin 0 -> 1582 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/10.gif                   | Bin 0 -> 3716 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/100.gif                  | Bin 0 -> 1780 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/101.gif                  | Bin 0 -> 2443 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/102.gif                  | Bin 0 -> 1446 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/103.gif                  | Bin 0 -> 2166 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/104.gif                  | Bin 0 -> 2169 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/105.gif                  | Bin 0 -> 1277 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/106.gif                  | Bin 0 -> 1041 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/107.gif                  | Bin 0 -> 1058 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/108.gif                  | Bin 0 -> 1046 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/109.gif                  | Bin 0 -> 1081 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/11.gif                   | Bin 0 -> 8033 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/110.gif                  | Bin 0 -> 1082 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/111.gif                  | Bin 0 -> 1039 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/112.gif                  | Bin 0 -> 1111 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/113.gif                  | Bin 0 -> 1015 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/114.gif                  | Bin 0 -> 1003 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/115.gif                  | Bin 0 -> 1061 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/116.gif                  | Bin 0 -> 996 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/117.gif                  | Bin 0 -> 1041 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/118.gif                  | Bin 0 -> 1012 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/119.gif                  | Bin 0 -> 1101 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/12.gif                   | Bin 0 -> 2247 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/120.gif                  | Bin 0 -> 1008 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/121.gif                  | Bin 0 -> 1060 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/122.gif                  | Bin 0 -> 999 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/123.gif                  | Bin 0 -> 1055 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/124.gif                  | Bin 0 -> 1022 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/125.gif                  | Bin 0 -> 1013 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/126.gif                  | Bin 0 -> 1030 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/127.gif                  | Bin 0 -> 956 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/128.gif                  | Bin 0 -> 1022 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/129.gif                  | Bin 0 -> 972 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/13.gif                   | Bin 0 -> 1736 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/130.gif                  | Bin 0 -> 980 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/131.gif                  | Bin 0 -> 945 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/132.gif                  | Bin 0 -> 936 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/133.gif                  | Bin 0 -> 1012 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/134.gif                  | Bin 0 -> 968 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/14.gif                   | Bin 0 -> 4006 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/15.gif                   | Bin 0 -> 1562 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/16.gif                   | Bin 0 -> 1413 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/17.gif                   | Bin 0 -> 3366 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/18.gif                   | Bin 0 -> 8137 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/19.gif                   | Bin 0 -> 8135 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/2.gif                    | Bin 0 -> 1804 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/20.gif                   | Bin 0 -> 1808 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/21.gif                   | Bin 0 -> 1864 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/22.gif                   | Bin 0 -> 3010 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/23.gif                   | Bin 0 -> 1950 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/24.gif                   | Bin 0 -> 2257 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/25.gif                   | Bin 0 -> 2446 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/26.gif                   | Bin 0 -> 4014 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/27.gif                   | Bin 0 -> 2893 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/28.gif                   | Bin 0 -> 3262 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/29.gif                   | Bin 0 -> 5861 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/3.gif                    | Bin 0 -> 1852 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/30.gif                   | Bin 0 -> 1780 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/31.gif                   | Bin 0 -> 5174 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/32.gif                   | Bin 0 -> 7189 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/33.gif                   | Bin 0 -> 4317 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/34.gif                   | Bin 0 -> 2140 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/35.gif                   | Bin 0 -> 13392 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/36.gif                   | Bin 0 -> 1417 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/37.gif                   | Bin 0 -> 1195 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/38.gif                   | Bin 0 -> 1674 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/39.gif                   | Bin 0 -> 1798 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/4.gif                    | Bin 0 -> 1977 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/40.gif                   | Bin 0 -> 10092 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/41.gif                   | Bin 0 -> 3368 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/42.gif                   | Bin 0 -> 13367 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/43.gif                   | Bin 0 -> 4327 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/44.gif                   | Bin 0 -> 1571 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/45.gif                   | Bin 0 -> 4692 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/46.gif                   | Bin 0 -> 5162 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/47.gif                   | Bin 0 -> 3685 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/48.gif                   | Bin 0 -> 1755 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/49.gif                   | Bin 0 -> 6361 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/5.gif                    | Bin 0 -> 1866 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/50.gif                   | Bin 0 -> 3073 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/51.gif                   | Bin 0 -> 3731 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/52.gif                   | Bin 0 -> 1532 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/53.gif                   | Bin 0 -> 2056 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/54.gif                   | Bin 0 -> 2362 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/55.gif                   | Bin 0 -> 1582 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/56.gif                   | Bin 0 -> 1170 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/57.gif                   | Bin 0 -> 5072 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/58.gif                   | Bin 0 -> 2596 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/59.gif                   | Bin 0 -> 1533 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/6.gif                    | Bin 0 -> 3556 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/60.gif                   | Bin 0 -> 2667 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/61.gif                   | Bin 0 -> 1136 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/62.gif                   | Bin 0 -> 1269 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/63.gif                   | Bin 0 -> 971 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/64.gif                   | Bin 0 -> 988 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/65.gif                   | Bin 0 -> 5285 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/66.gif                   | Bin 0 -> 1159 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/67.gif                   | Bin 0 -> 2746 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/68.gif                   | Bin 0 -> 4148 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/69.gif                   | Bin 0 -> 1015 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/7.gif                    | Bin 0 -> 3929 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/70.gif                   | Bin 0 -> 1162 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/71.gif                   | Bin 0 -> 824 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/72.gif                   | Bin 0 -> 3679 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/73.gif                   | Bin 0 -> 2195 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/74.gif                   | Bin 0 -> 2454 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/75.gif                   | Bin 0 -> 1222 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/76.gif                   | Bin 0 -> 1211 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/77.gif                   | Bin 0 -> 1151 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/78.gif                   | Bin 0 -> 1565 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/79.gif                   | Bin 0 -> 1518 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/8.gif                    | Bin 0 -> 4679 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/80.gif                   | Bin 0 -> 1537 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/81.gif                   | Bin 0 -> 1591 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/82.gif                   | Bin 0 -> 1547 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/83.gif                   | Bin 0 -> 1591 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/84.gif                   | Bin 0 -> 3424 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/85.gif                   | Bin 0 -> 1581 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/86.gif                   | Bin 0 -> 1519 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/87.gif                   | Bin 0 -> 1558 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/88.gif                   | Bin 0 -> 2134 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/89.gif                   | Bin 0 -> 1219 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/9.gif                    | Bin 0 -> 3298 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/90.gif                   | Bin 0 -> 2743 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/91.gif                   | Bin 0 -> 654 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/92.gif                   | Bin 0 -> 1377 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/93.gif                   | Bin 0 -> 1119 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/94.gif                   | Bin 0 -> 3426 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/95.gif                   | Bin 0 -> 3011 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/96.gif                   | Bin 0 -> 1796 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/97.gif                   | Bin 0 -> 5300 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/98.gif                   | Bin 0 -> 1629 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/99.gif                   | Bin 0 -> 2261 bytes
 public/assets/addons/nkeditor/plugins/emoticons/images/static.gif               | Bin 0 -> 35504 bytes
 public/assets/addons/nkeditor/plugins/filemanager/FManager.js                   |  307 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/filemanager/FManager.min.js               |    2 ++
 public/assets/addons/nkeditor/plugins/filemanager/css/filemanager.min.css       |    0
 public/assets/addons/nkeditor/plugins/filemanager/filemanager.js                |   35 +++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/fixtoolbar/fixtoolbar.js                  |   35 +++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/flash/flash.js                            |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/graft/css/images/addimg.png               | Bin 0 -> 628 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/blur.png                 | Bin 0 -> 3376 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/brush.png                | Bin 0 -> 608 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/delimg.png               | Bin 0 -> 516 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/delimgH.png              | Bin 0 -> 578 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/empty.png                | Bin 0 -> 519 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/emptyH.png               | Bin 0 -> 657 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/eraser.png               | Bin 0 -> 43271 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/init.png                 | Bin 0 -> 695 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/redo.png                 | Bin 0 -> 454 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/redoH.png                | Bin 0 -> 536 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/save.png                 | Bin 0 -> 837 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/scale.png                | Bin 0 -> 435 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/scaleH.png               | Bin 0 -> 330 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/size.png                 | Bin 0 -> 775 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/undo.png                 | Bin 0 -> 444 bytes
 public/assets/addons/nkeditor/plugins/graft/css/images/undoH.png                | Bin 0 -> 511 bytes
 public/assets/addons/nkeditor/plugins/graft/css/scrawl.css                      |  204 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/graft/css/scrawl.css.map                  |    7 +++++++
 public/assets/addons/nkeditor/plugins/graft/css/scrawl.scss                     |  284 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/graft/graft.js                            |  189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/graft/index.html                          |  134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/graft/scrawl.js                           |  262 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/image/image.js                            |  340 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/image/images/align_left.gif               | Bin 0 -> 639 bytes
 public/assets/addons/nkeditor/plugins/image/images/align_right.gif              | Bin 0 -> 636 bytes
 public/assets/addons/nkeditor/plugins/image/images/align_top.gif                | Bin 0 -> 625 bytes
 public/assets/addons/nkeditor/plugins/image/images/refresh.png                  | Bin 0 -> 800 bytes
 public/assets/addons/nkeditor/plugins/insertfile/insertfile.js                  |  141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/lineheight/lineheight.js                  |   38 ++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/link/link.js                              |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/map/map.html                              |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/map/map.js                                |  137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/media/media.js                            |  186 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/multiimage/BUpload.js                     |  625 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/multiimage/BUpload.min.js                 |    2 ++
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/aep.png              | Bin 0 -> 11058 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/asp.png              | Bin 0 -> 27562 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/avi.png              | Bin 0 -> 11778 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/c.png                | Bin 0 -> 7341 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/conf.png             | Bin 0 -> 12352 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/css.png              | Bin 0 -> 26823 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/default.png          | Bin 0 -> 27900 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/doc.png              | Bin 0 -> 14939 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/eml.png              | Bin 0 -> 13584 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/eps.png              | Bin 0 -> 10488 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/fla.png              | Bin 0 -> 11240 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/htm.png              | Bin 0 -> 26753 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/idn.png              | Bin 0 -> 10993 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/ini.png              | Bin 0 -> 9847 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/java.png             | Bin 0 -> 26203 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/js.png               | Bin 0 -> 9156 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/jsf.png              | Bin 0 -> 10661 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/markdown.png         | Bin 0 -> 9053 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/mdb.png              | Bin 0 -> 15587 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/midi.png             | Bin 0 -> 10479 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/mov.png              | Bin 0 -> 11855 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/mp3.png              | Bin 0 -> 12130 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/mpeg.png             | Bin 0 -> 14349 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/pdf.png              | Bin 0 -> 12064 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/php.png              | Bin 0 -> 11551 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/ppt.png              | Bin 0 -> 14255 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/psd.png              | Bin 0 -> 11360 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/pst.png              | Bin 0 -> 14430 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/pub.png              | Bin 0 -> 15185 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/py.png               | Bin 0 -> 24844 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/rb.png               | Bin 0 -> 25872 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/rmvb.png             | Bin 0 -> 14349 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/scss.png             | Bin 0 -> 10890 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/sql.png              | Bin 0 -> 26862 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/tif.png              | Bin 0 -> 11254 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/txt.png              | Bin 0 -> 9035 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/vsd.png              | Bin 0 -> 14362 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/wav.png              | Bin 0 -> 18838 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/wma.png              | Bin 0 -> 12844 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/wmv.png              | Bin 0 -> 12468 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/xls.png              | Bin 0 -> 15671 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/xml.png              | Bin 0 -> 26594 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/icons/zip.png              | Bin 0 -> 10319 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/images/dialog-title-bg.png | Bin 0 -> 938 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/images/icons-all.gif       | Bin 0 -> 3750 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/images/icons.png           | Bin 0 -> 2678 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/images/image.png           | Bin 0 -> 1672 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/images/loader.gif          | Bin 0 -> 1787 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/images/progress.png        | Bin 0 -> 1269 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/images/success.png         | Bin 0 -> 1621 bytes
 public/assets/addons/nkeditor/plugins/multiimage/css/upload.css                 |  552 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/multiimage/css/upload.css.map             |    7 +++++++
 public/assets/addons/nkeditor/plugins/multiimage/css/upload.min.css             |    1 +
 public/assets/addons/nkeditor/plugins/multiimage/css/upload.scss                |  642 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/multiimage/multiimage.js                  |   90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/multiimage/template/template.html         |   95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/pagebreak/pagebreak.js                    |   27 +++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/plainpaste/plainpaste.js                  |   41 +++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/preview/preview.js                        |  134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/quickformat/quickformat.js                |   81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/quote/quote.js                            |   12 ++++++++++++
 public/assets/addons/nkeditor/plugins/table/table.js                            |  746 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/template/html/1.html                      |   14 ++++++++++++++
 public/assets/addons/nkeditor/plugins/template/html/2.html                      |   42 ++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/template/html/3.html                      |   36 ++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/template/template.js                      |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/plugins/wordpaste/wordpaste.js                    |   79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/app.css                                    |   96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/black/editor.css                           |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/black/editor.css.map                       |    7 +++++++
 public/assets/addons/nkeditor/themes/black/editor.min.css                       |    1 +
 public/assets/addons/nkeditor/themes/black/editor.scss                          |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/black/images/nkeditor.png                  | Bin 0 -> 14650 bytes
 public/assets/addons/nkeditor/themes/black/images/nkeditor.svg                  |  260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/blue/editor.css                            |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/blue/editor.css.map                        |    7 +++++++
 public/assets/addons/nkeditor/themes/blue/editor.min.css                        |    1 +
 public/assets/addons/nkeditor/themes/blue/editor.scss                           |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/blue/images/nkeditor.png                   | Bin 0 -> 15428 bytes
 public/assets/addons/nkeditor/themes/blue/images/nkeditor.svg                   |  260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/common/anchor.gif                          | Bin 0 -> 371 bytes
 public/assets/addons/nkeditor/themes/common/blank.gif                           | Bin 0 -> 43 bytes
 public/assets/addons/nkeditor/themes/common/common.css                          |  605 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/common/common.css.map                      |    7 +++++++
 public/assets/addons/nkeditor/themes/common/common.scss                         |  830 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/common/dialog-title-bg.png                 | Bin 0 -> 938 bytes
 public/assets/addons/nkeditor/themes/common/flash.gif                           | Bin 0 -> 1089 bytes
 public/assets/addons/nkeditor/themes/common/flash.png                           | Bin 0 -> 1133 bytes
 public/assets/addons/nkeditor/themes/common/flash.svg                           |    1 +
 public/assets/addons/nkeditor/themes/common/icons-all.gif                       | Bin 0 -> 3750 bytes
 public/assets/addons/nkeditor/themes/common/loading.gif                         | Bin 0 -> 2608 bytes
 public/assets/addons/nkeditor/themes/common/media.gif                           | Bin 0 -> 1036 bytes
 public/assets/addons/nkeditor/themes/common/play.png                            | Bin 0 -> 1130 bytes
 public/assets/addons/nkeditor/themes/common/play.svg                            |    1 +
 public/assets/addons/nkeditor/themes/common/rm.gif                              | Bin 0 -> 989 bytes
 public/assets/addons/nkeditor/themes/default/editor.css                         | 1398 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/default/editor.min.css                     |    1 +
 public/assets/addons/nkeditor/themes/default/images/background.png              | Bin 0 -> 1410 bytes
 public/assets/addons/nkeditor/themes/default/images/default.png                 | Bin 0 -> 8299 bytes
 public/assets/addons/nkeditor/themes/default/images/scrawl.png                  | Bin 0 -> 919 bytes
 public/assets/addons/nkeditor/themes/grey/editor.css                            |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/grey/editor.css.map                        |    7 +++++++
 public/assets/addons/nkeditor/themes/grey/editor.min.css                        |    1 +
 public/assets/addons/nkeditor/themes/grey/editor.scss                           |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/grey/images/nkeditor.png                   | Bin 0 -> 14637 bytes
 public/assets/addons/nkeditor/themes/grey/images/nkeditor.svg                   |  260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/primary/editor.css                         |  822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/primary/editor.css.map                     |    7 +++++++
 public/assets/addons/nkeditor/themes/primary/editor.min.css                     |    1 +
 public/assets/addons/nkeditor/themes/primary/editor.scss                        |  387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/addons/nkeditor/themes/primary/images/nkeditor.png                | Bin 0 -> 15396 bytes
 public/assets/addons/nkeditor/themes/primary/images/nkeditor.svg                |  260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/js/addons.js                                                      |  308 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 public/assets/js/backend/banner.js                                              |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 public/assets/js/backend/command.js                                             |  234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/uploads/20191127/79e122b17786dbf0365a1018e27872d7.png                    | Bin 0 -> 61603 bytes
 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php                            |    2 +-
 683 files changed, 58634 insertions(+), 53 deletions(-)
 create mode 100644 addons/command/Command.php
 create mode 100644 addons/command/application/admin/controller/Command.php
 create mode 100644 addons/command/application/admin/lang/zh-cn/command.php
 create mode 100644 addons/command/application/admin/model/Command.php
 create mode 100644 addons/command/application/admin/validate/Command.php
 create mode 100644 addons/command/application/admin/view/command/add.html
 create mode 100644 addons/command/application/admin/view/command/detail.html
 create mode 100644 addons/command/application/admin/view/command/index.html
 create mode 100644 addons/command/config.php
 create mode 100644 addons/command/controller/Index.php
 create mode 100644 addons/command/info.ini
 create mode 100644 addons/command/install.sql
 create mode 100644 addons/command/library/Output.php
 create mode 100644 addons/command/public/assets/js/backend/command.js
 create mode 100644 addons/nkeditor/Nkeditor.php
 create mode 100644 addons/nkeditor/README.md
 create mode 100644 addons/nkeditor/assets/css/common.css
 create mode 100644 addons/nkeditor/assets/img/download.png
 create mode 100644 addons/nkeditor/assets/img/downloading.png
 create mode 100644 addons/nkeditor/assets/js/customplugin.js
 create mode 100644 addons/nkeditor/assets/lang/ar.js
 create mode 100644 addons/nkeditor/assets/lang/en.js
 create mode 100644 addons/nkeditor/assets/lang/ja-JP.js
 create mode 100644 addons/nkeditor/assets/lang/ko.js
 create mode 100644 addons/nkeditor/assets/lang/ru.js
 create mode 100644 addons/nkeditor/assets/lang/zh-CN.js
 create mode 100644 addons/nkeditor/assets/lang/zh-TW.js
 create mode 100644 addons/nkeditor/assets/nkeditor.js
 create mode 100644 addons/nkeditor/assets/nkeditor.min.js
 create mode 100644 addons/nkeditor/assets/plugins/anchor/anchor.js
 create mode 100644 addons/nkeditor/assets/plugins/autoheight/autoheight.js
 create mode 100644 addons/nkeditor/assets/plugins/baidumap/baidumap.js
 create mode 100644 addons/nkeditor/assets/plugins/baidumap/index.html
 create mode 100644 addons/nkeditor/assets/plugins/baidumap/map.html
 create mode 100644 addons/nkeditor/assets/plugins/clearhtml/clearhtml.js
 create mode 100644 addons/nkeditor/assets/plugins/code/code.js
 create mode 100644 addons/nkeditor/assets/plugins/code/pretty.js
 create mode 100644 addons/nkeditor/assets/plugins/code/prism.css
 create mode 100644 addons/nkeditor/assets/plugins/code/prism.js
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/emoticons.js
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/0.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/1.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/10.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/100.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/101.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/102.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/103.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/104.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/105.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/106.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/107.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/108.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/109.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/11.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/110.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/111.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/112.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/113.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/114.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/115.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/116.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/117.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/118.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/119.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/12.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/120.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/121.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/122.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/123.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/124.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/125.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/126.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/127.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/128.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/129.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/13.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/130.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/131.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/132.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/133.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/134.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/14.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/15.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/16.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/17.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/18.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/19.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/2.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/20.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/21.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/22.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/23.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/24.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/25.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/26.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/27.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/28.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/29.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/3.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/30.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/31.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/32.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/33.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/34.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/35.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/36.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/37.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/38.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/39.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/4.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/40.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/41.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/42.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/43.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/44.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/45.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/46.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/47.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/48.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/49.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/5.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/50.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/51.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/52.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/53.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/54.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/55.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/56.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/57.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/58.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/59.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/6.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/60.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/61.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/62.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/63.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/64.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/65.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/66.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/67.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/68.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/69.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/7.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/70.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/71.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/72.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/73.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/74.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/75.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/76.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/77.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/78.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/79.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/8.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/80.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/81.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/82.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/83.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/84.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/85.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/86.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/87.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/88.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/89.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/9.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/90.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/91.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/92.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/93.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/94.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/95.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/96.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/97.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/98.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/99.gif
 create mode 100644 addons/nkeditor/assets/plugins/emoticons/images/static.gif
 create mode 100644 addons/nkeditor/assets/plugins/filemanager/FManager.js
 create mode 100644 addons/nkeditor/assets/plugins/filemanager/FManager.min.js
 create mode 100644 addons/nkeditor/assets/plugins/filemanager/css/filemanager.min.css
 create mode 100644 addons/nkeditor/assets/plugins/filemanager/filemanager.js
 create mode 100644 addons/nkeditor/assets/plugins/fixtoolbar/fixtoolbar.js
 create mode 100644 addons/nkeditor/assets/plugins/flash/flash.js
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/addimg.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/blur.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/brush.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/delimg.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/delimgH.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/empty.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/emptyH.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/eraser.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/init.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/redo.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/redoH.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/save.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/scale.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/scaleH.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/size.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/undo.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/images/undoH.png
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/scrawl.css
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/scrawl.css.map
 create mode 100644 addons/nkeditor/assets/plugins/graft/css/scrawl.scss
 create mode 100644 addons/nkeditor/assets/plugins/graft/graft.js
 create mode 100644 addons/nkeditor/assets/plugins/graft/index.html
 create mode 100644 addons/nkeditor/assets/plugins/graft/scrawl.js
 create mode 100644 addons/nkeditor/assets/plugins/image/image.js
 create mode 100644 addons/nkeditor/assets/plugins/image/images/align_left.gif
 create mode 100644 addons/nkeditor/assets/plugins/image/images/align_right.gif
 create mode 100644 addons/nkeditor/assets/plugins/image/images/align_top.gif
 create mode 100644 addons/nkeditor/assets/plugins/image/images/refresh.png
 create mode 100644 addons/nkeditor/assets/plugins/insertfile/insertfile.js
 create mode 100644 addons/nkeditor/assets/plugins/lineheight/lineheight.js
 create mode 100644 addons/nkeditor/assets/plugins/link/link.js
 create mode 100644 addons/nkeditor/assets/plugins/map/map.html
 create mode 100644 addons/nkeditor/assets/plugins/map/map.js
 create mode 100644 addons/nkeditor/assets/plugins/media/media.js
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/BUpload.js
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/BUpload.min.js
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/aep.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/asp.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/avi.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/c.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/conf.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/css.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/default.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/doc.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/eml.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/eps.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/fla.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/htm.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/idn.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/ini.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/java.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/js.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/jsf.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/markdown.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/mdb.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/midi.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/mov.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/mp3.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/mpeg.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/pdf.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/php.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/ppt.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/psd.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/pst.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/pub.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/py.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/rb.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/rmvb.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/scss.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/sql.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/tif.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/txt.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/vsd.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/wav.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/wma.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/wmv.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/xls.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/xml.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/icons/zip.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/images/dialog-title-bg.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/images/icons-all.gif
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/images/icons.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/images/image.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/images/loader.gif
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/images/progress.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/images/success.png
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/upload.css
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/upload.css.map
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/upload.min.css
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/css/upload.scss
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/multiimage.js
 create mode 100644 addons/nkeditor/assets/plugins/multiimage/template/template.html
 create mode 100644 addons/nkeditor/assets/plugins/pagebreak/pagebreak.js
 create mode 100644 addons/nkeditor/assets/plugins/plainpaste/plainpaste.js
 create mode 100644 addons/nkeditor/assets/plugins/preview/preview.js
 create mode 100644 addons/nkeditor/assets/plugins/quickformat/quickformat.js
 create mode 100644 addons/nkeditor/assets/plugins/quote/quote.js
 create mode 100644 addons/nkeditor/assets/plugins/table/table.js
 create mode 100644 addons/nkeditor/assets/plugins/template/html/1.html
 create mode 100644 addons/nkeditor/assets/plugins/template/html/2.html
 create mode 100644 addons/nkeditor/assets/plugins/template/html/3.html
 create mode 100644 addons/nkeditor/assets/plugins/template/template.js
 create mode 100644 addons/nkeditor/assets/plugins/wordpaste/wordpaste.js
 create mode 100644 addons/nkeditor/assets/themes/app.css
 create mode 100644 addons/nkeditor/assets/themes/black/editor.css
 create mode 100644 addons/nkeditor/assets/themes/black/editor.css.map
 create mode 100644 addons/nkeditor/assets/themes/black/editor.min.css
 create mode 100644 addons/nkeditor/assets/themes/black/editor.scss
 create mode 100644 addons/nkeditor/assets/themes/black/images/nkeditor.png
 create mode 100644 addons/nkeditor/assets/themes/black/images/nkeditor.svg
 create mode 100644 addons/nkeditor/assets/themes/blue/editor.css
 create mode 100644 addons/nkeditor/assets/themes/blue/editor.css.map
 create mode 100644 addons/nkeditor/assets/themes/blue/editor.min.css
 create mode 100644 addons/nkeditor/assets/themes/blue/editor.scss
 create mode 100644 addons/nkeditor/assets/themes/blue/images/nkeditor.png
 create mode 100644 addons/nkeditor/assets/themes/blue/images/nkeditor.svg
 create mode 100644 addons/nkeditor/assets/themes/common/anchor.gif
 create mode 100644 addons/nkeditor/assets/themes/common/blank.gif
 create mode 100644 addons/nkeditor/assets/themes/common/common.css
 create mode 100644 addons/nkeditor/assets/themes/common/common.css.map
 create mode 100644 addons/nkeditor/assets/themes/common/common.scss
 create mode 100644 addons/nkeditor/assets/themes/common/dialog-title-bg.png
 create mode 100644 addons/nkeditor/assets/themes/common/flash.gif
 create mode 100644 addons/nkeditor/assets/themes/common/flash.png
 create mode 100644 addons/nkeditor/assets/themes/common/flash.svg
 create mode 100644 addons/nkeditor/assets/themes/common/icons-all.gif
 create mode 100644 addons/nkeditor/assets/themes/common/loading.gif
 create mode 100644 addons/nkeditor/assets/themes/common/media.gif
 create mode 100644 addons/nkeditor/assets/themes/common/play.png
 create mode 100644 addons/nkeditor/assets/themes/common/play.svg
 create mode 100644 addons/nkeditor/assets/themes/common/rm.gif
 create mode 100644 addons/nkeditor/assets/themes/default/editor.css
 create mode 100644 addons/nkeditor/assets/themes/default/editor.min.css
 create mode 100644 addons/nkeditor/assets/themes/default/images/background.png
 create mode 100644 addons/nkeditor/assets/themes/default/images/default.png
 create mode 100644 addons/nkeditor/assets/themes/default/images/scrawl.png
 create mode 100644 addons/nkeditor/assets/themes/grey/editor.css
 create mode 100644 addons/nkeditor/assets/themes/grey/editor.css.map
 create mode 100644 addons/nkeditor/assets/themes/grey/editor.min.css
 create mode 100644 addons/nkeditor/assets/themes/grey/editor.scss
 create mode 100644 addons/nkeditor/assets/themes/grey/images/nkeditor.png
 create mode 100644 addons/nkeditor/assets/themes/grey/images/nkeditor.svg
 create mode 100644 addons/nkeditor/assets/themes/primary/editor.css
 create mode 100644 addons/nkeditor/assets/themes/primary/editor.css.map
 create mode 100644 addons/nkeditor/assets/themes/primary/editor.min.css
 create mode 100644 addons/nkeditor/assets/themes/primary/editor.scss
 create mode 100644 addons/nkeditor/assets/themes/primary/images/nkeditor.png
 create mode 100644 addons/nkeditor/assets/themes/primary/images/nkeditor.svg
 create mode 100644 addons/nkeditor/bootstrap.js
 create mode 100644 addons/nkeditor/config.php
 create mode 100644 addons/nkeditor/controller/Index.php
 create mode 100644 addons/nkeditor/info.ini
 create mode 100644 addons/nkeditor/license.txt
 create mode 100644 addons/nkeditor/nodejs/word.js
 create mode 100644 addons/qiniu/Qiniu.php
 create mode 100644 addons/qiniu/bootstrap.js
 create mode 100644 addons/qiniu/config.php
 create mode 100644 addons/qiniu/controller/Index.php
 create mode 100644 addons/qiniu/info.ini
 create mode 100644 addons/qiniu/library/Auth.php
 create mode 100644 application/admin/command/Install/install.lock
 create mode 100644 application/admin/controller/Banner.php
 create mode 100644 application/admin/controller/Command.php
 create mode 100644 application/admin/lang/zh-cn/banner.php
 create mode 100644 application/admin/lang/zh-cn/command.php
 create mode 100644 application/admin/model/Banner.php
 create mode 100644 application/admin/model/Command.php
 create mode 100644 application/admin/validate/Banner.php
 create mode 100644 application/admin/validate/Command.php
 create mode 100644 application/admin/view/banner/add.html
 create mode 100644 application/admin/view/banner/edit.html
 create mode 100644 application/admin/view/banner/index.html
 create mode 100644 application/admin/view/command/add.html
 create mode 100644 application/admin/view/command/detail.html
 create mode 100644 application/admin/view/command/index.html
 create mode 100644 public/XzuemHTJfG.php
 delete mode 100644 public/admin.php
 create mode 100644 public/assets/addons/nkeditor/css/common.css
 create mode 100644 public/assets/addons/nkeditor/img/download.png
 create mode 100644 public/assets/addons/nkeditor/img/downloading.png
 create mode 100644 public/assets/addons/nkeditor/js/customplugin.js
 create mode 100644 public/assets/addons/nkeditor/lang/ar.js
 create mode 100644 public/assets/addons/nkeditor/lang/en.js
 create mode 100644 public/assets/addons/nkeditor/lang/ja-JP.js
 create mode 100644 public/assets/addons/nkeditor/lang/ko.js
 create mode 100644 public/assets/addons/nkeditor/lang/ru.js
 create mode 100644 public/assets/addons/nkeditor/lang/zh-CN.js
 create mode 100644 public/assets/addons/nkeditor/lang/zh-TW.js
 create mode 100644 public/assets/addons/nkeditor/nkeditor.js
 create mode 100644 public/assets/addons/nkeditor/nkeditor.min.js
 create mode 100644 public/assets/addons/nkeditor/plugins/anchor/anchor.js
 create mode 100644 public/assets/addons/nkeditor/plugins/autoheight/autoheight.js
 create mode 100644 public/assets/addons/nkeditor/plugins/baidumap/baidumap.js
 create mode 100644 public/assets/addons/nkeditor/plugins/baidumap/index.html
 create mode 100644 public/assets/addons/nkeditor/plugins/baidumap/map.html
 create mode 100644 public/assets/addons/nkeditor/plugins/clearhtml/clearhtml.js
 create mode 100644 public/assets/addons/nkeditor/plugins/code/code.js
 create mode 100644 public/assets/addons/nkeditor/plugins/code/pretty.js
 create mode 100644 public/assets/addons/nkeditor/plugins/code/prism.css
 create mode 100644 public/assets/addons/nkeditor/plugins/code/prism.js
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/emoticons.js
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/0.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/1.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/10.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/100.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/101.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/102.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/103.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/104.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/105.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/106.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/107.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/108.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/109.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/11.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/110.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/111.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/112.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/113.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/114.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/115.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/116.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/117.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/118.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/119.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/12.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/120.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/121.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/122.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/123.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/124.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/125.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/126.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/127.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/128.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/129.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/13.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/130.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/131.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/132.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/133.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/134.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/14.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/15.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/16.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/17.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/18.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/19.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/2.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/20.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/21.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/22.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/23.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/24.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/25.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/26.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/27.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/28.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/29.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/3.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/30.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/31.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/32.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/33.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/34.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/35.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/36.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/37.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/38.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/39.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/4.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/40.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/41.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/42.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/43.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/44.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/45.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/46.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/47.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/48.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/49.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/5.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/50.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/51.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/52.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/53.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/54.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/55.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/56.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/57.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/58.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/59.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/6.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/60.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/61.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/62.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/63.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/64.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/65.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/66.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/67.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/68.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/69.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/7.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/70.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/71.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/72.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/73.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/74.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/75.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/76.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/77.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/78.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/79.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/8.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/80.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/81.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/82.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/83.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/84.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/85.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/86.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/87.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/88.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/89.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/9.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/90.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/91.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/92.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/93.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/94.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/95.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/96.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/97.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/98.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/99.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/emoticons/images/static.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/filemanager/FManager.js
 create mode 100644 public/assets/addons/nkeditor/plugins/filemanager/FManager.min.js
 create mode 100644 public/assets/addons/nkeditor/plugins/filemanager/css/filemanager.min.css
 create mode 100644 public/assets/addons/nkeditor/plugins/filemanager/filemanager.js
 create mode 100644 public/assets/addons/nkeditor/plugins/fixtoolbar/fixtoolbar.js
 create mode 100644 public/assets/addons/nkeditor/plugins/flash/flash.js
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/addimg.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/blur.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/brush.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/delimg.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/delimgH.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/empty.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/emptyH.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/eraser.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/init.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/redo.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/redoH.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/save.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/scale.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/scaleH.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/size.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/undo.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/images/undoH.png
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/scrawl.css
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/scrawl.css.map
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/css/scrawl.scss
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/graft.js
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/index.html
 create mode 100644 public/assets/addons/nkeditor/plugins/graft/scrawl.js
 create mode 100644 public/assets/addons/nkeditor/plugins/image/image.js
 create mode 100644 public/assets/addons/nkeditor/plugins/image/images/align_left.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/image/images/align_right.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/image/images/align_top.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/image/images/refresh.png
 create mode 100644 public/assets/addons/nkeditor/plugins/insertfile/insertfile.js
 create mode 100644 public/assets/addons/nkeditor/plugins/lineheight/lineheight.js
 create mode 100644 public/assets/addons/nkeditor/plugins/link/link.js
 create mode 100644 public/assets/addons/nkeditor/plugins/map/map.html
 create mode 100644 public/assets/addons/nkeditor/plugins/map/map.js
 create mode 100644 public/assets/addons/nkeditor/plugins/media/media.js
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/BUpload.js
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/BUpload.min.js
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/aep.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/asp.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/avi.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/c.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/conf.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/css.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/default.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/doc.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/eml.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/eps.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/fla.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/htm.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/idn.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/ini.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/java.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/js.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/jsf.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/markdown.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/mdb.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/midi.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/mov.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/mp3.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/mpeg.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/pdf.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/php.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/ppt.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/psd.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/pst.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/pub.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/py.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/rb.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/rmvb.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/scss.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/sql.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/tif.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/txt.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/vsd.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/wav.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/wma.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/wmv.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/xls.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/xml.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/icons/zip.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/images/dialog-title-bg.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/images/icons-all.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/images/icons.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/images/image.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/images/loader.gif
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/images/progress.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/images/success.png
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/upload.css
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/upload.css.map
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/upload.min.css
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/css/upload.scss
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/multiimage.js
 create mode 100644 public/assets/addons/nkeditor/plugins/multiimage/template/template.html
 create mode 100644 public/assets/addons/nkeditor/plugins/pagebreak/pagebreak.js
 create mode 100644 public/assets/addons/nkeditor/plugins/plainpaste/plainpaste.js
 create mode 100644 public/assets/addons/nkeditor/plugins/preview/preview.js
 create mode 100644 public/assets/addons/nkeditor/plugins/quickformat/quickformat.js
 create mode 100644 public/assets/addons/nkeditor/plugins/quote/quote.js
 create mode 100644 public/assets/addons/nkeditor/plugins/table/table.js
 create mode 100644 public/assets/addons/nkeditor/plugins/template/html/1.html
 create mode 100644 public/assets/addons/nkeditor/plugins/template/html/2.html
 create mode 100644 public/assets/addons/nkeditor/plugins/template/html/3.html
 create mode 100644 public/assets/addons/nkeditor/plugins/template/template.js
 create mode 100644 public/assets/addons/nkeditor/plugins/wordpaste/wordpaste.js
 create mode 100644 public/assets/addons/nkeditor/themes/app.css
 create mode 100644 public/assets/addons/nkeditor/themes/black/editor.css
 create mode 100644 public/assets/addons/nkeditor/themes/black/editor.css.map
 create mode 100644 public/assets/addons/nkeditor/themes/black/editor.min.css
 create mode 100644 public/assets/addons/nkeditor/themes/black/editor.scss
 create mode 100644 public/assets/addons/nkeditor/themes/black/images/nkeditor.png
 create mode 100644 public/assets/addons/nkeditor/themes/black/images/nkeditor.svg
 create mode 100644 public/assets/addons/nkeditor/themes/blue/editor.css
 create mode 100644 public/assets/addons/nkeditor/themes/blue/editor.css.map
 create mode 100644 public/assets/addons/nkeditor/themes/blue/editor.min.css
 create mode 100644 public/assets/addons/nkeditor/themes/blue/editor.scss
 create mode 100644 public/assets/addons/nkeditor/themes/blue/images/nkeditor.png
 create mode 100644 public/assets/addons/nkeditor/themes/blue/images/nkeditor.svg
 create mode 100644 public/assets/addons/nkeditor/themes/common/anchor.gif
 create mode 100644 public/assets/addons/nkeditor/themes/common/blank.gif
 create mode 100644 public/assets/addons/nkeditor/themes/common/common.css
 create mode 100644 public/assets/addons/nkeditor/themes/common/common.css.map
 create mode 100644 public/assets/addons/nkeditor/themes/common/common.scss
 create mode 100644 public/assets/addons/nkeditor/themes/common/dialog-title-bg.png
 create mode 100644 public/assets/addons/nkeditor/themes/common/flash.gif
 create mode 100644 public/assets/addons/nkeditor/themes/common/flash.png
 create mode 100644 public/assets/addons/nkeditor/themes/common/flash.svg
 create mode 100644 public/assets/addons/nkeditor/themes/common/icons-all.gif
 create mode 100644 public/assets/addons/nkeditor/themes/common/loading.gif
 create mode 100644 public/assets/addons/nkeditor/themes/common/media.gif
 create mode 100644 public/assets/addons/nkeditor/themes/common/play.png
 create mode 100644 public/assets/addons/nkeditor/themes/common/play.svg
 create mode 100644 public/assets/addons/nkeditor/themes/common/rm.gif
 create mode 100644 public/assets/addons/nkeditor/themes/default/editor.css
 create mode 100644 public/assets/addons/nkeditor/themes/default/editor.min.css
 create mode 100644 public/assets/addons/nkeditor/themes/default/images/background.png
 create mode 100644 public/assets/addons/nkeditor/themes/default/images/default.png
 create mode 100644 public/assets/addons/nkeditor/themes/default/images/scrawl.png
 create mode 100644 public/assets/addons/nkeditor/themes/grey/editor.css
 create mode 100644 public/assets/addons/nkeditor/themes/grey/editor.css.map
 create mode 100644 public/assets/addons/nkeditor/themes/grey/editor.min.css
 create mode 100644 public/assets/addons/nkeditor/themes/grey/editor.scss
 create mode 100644 public/assets/addons/nkeditor/themes/grey/images/nkeditor.png
 create mode 100644 public/assets/addons/nkeditor/themes/grey/images/nkeditor.svg
 create mode 100644 public/assets/addons/nkeditor/themes/primary/editor.css
 create mode 100644 public/assets/addons/nkeditor/themes/primary/editor.css.map
 create mode 100644 public/assets/addons/nkeditor/themes/primary/editor.min.css
 create mode 100644 public/assets/addons/nkeditor/themes/primary/editor.scss
 create mode 100644 public/assets/addons/nkeditor/themes/primary/images/nkeditor.png
 create mode 100644 public/assets/addons/nkeditor/themes/primary/images/nkeditor.svg
 create mode 100644 public/assets/js/backend/banner.js
 create mode 100644 public/assets/js/backend/command.js
 create mode 100644 public/uploads/20191127/79e122b17786dbf0365a1018e27872d7.png

diff --git a/addons/command/Command.php b/addons/command/Command.php
new file mode 100644
index 0000000..71126b4
--- /dev/null
+++ b/addons/command/Command.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace addons\command;
+
+use app\common\library\Menu;
+use think\Addons;
+
+/**
+ * 在线命令插件
+ */
+class Command extends Addons
+{
+
+    /**
+     * 插件安装方法
+     * @return bool
+     */
+    public function install()
+    {
+        $menu = [
+            [
+                'name'    => 'command',
+                'title'   => '在线命令管理',
+                'icon'    => 'fa fa-terminal',
+                'sublist' => [
+                    ['name' => 'command/index', 'title' => '查看'],
+                    ['name' => 'command/add', 'title' => '添加'],
+                    ['name' => 'command/detail', 'title' => '详情'],
+                    ['name' => 'command/execute', 'title' => '运行'],
+                    ['name' => 'command/del', 'title' => '删除'],
+                    ['name' => 'command/multi', 'title' => '批量更新'],
+                ]
+            ]
+        ];
+        Menu::create($menu);
+        return true;
+    }
+
+    /**
+     * 插件卸载方法
+     * @return bool
+     */
+    public function uninstall()
+    {
+        Menu::delete('command');
+        return true;
+    }
+
+    /**
+     * 插件启用方法
+     * @return bool
+     */
+    public function enable()
+    {
+        Menu::enable('command');
+        return true;
+    }
+
+    /**
+     * 插件禁用方法
+     * @return bool
+     */
+    public function disable()
+    {
+        Menu::disable('command');
+        return true;
+    }
+
+}
diff --git a/addons/command/application/admin/controller/Command.php b/addons/command/application/admin/controller/Command.php
new file mode 100644
index 0000000..64669b6
--- /dev/null
+++ b/addons/command/application/admin/controller/Command.php
@@ -0,0 +1,219 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\common\controller\Backend;
+use think\Config;
+use think\console\Input;
+use think\Db;
+use think\Exception;
+
+/**
+ * 在线命令管理
+ *
+ * @icon fa fa-circle-o
+ */
+class Command extends Backend
+{
+
+    /**
+     * Command模型对象
+     */
+    protected $model = null;
+    protected $noNeedRight = ['get_controller_list', 'get_field_list'];
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('Command');
+        $this->view->assign("statusList", $this->model->getStatusList());
+    }
+
+    /**
+     * 添加
+     */
+    public function add()
+    {
+
+        $tableList = [];
+        $list = \think\Db::query("SHOW TABLES");
+        foreach ($list as $key => $row) {
+            $tableList[reset($row)] = reset($row);
+        }
+
+        $this->view->assign("tableList", $tableList);
+        return $this->view->fetch();
+    }
+
+    /**
+     * 获取字段列表
+     * @internal
+     */
+    public function get_field_list()
+    {
+        $dbname = Config::get('database.database');
+        $prefix = Config::get('database.prefix');
+        $table = $this->request->request('table');
+        //从数据库中获取表字段信息
+        $sql = "SELECT * FROM `information_schema`.`columns` "
+            . "WHERE TABLE_SCHEMA = ? AND table_name = ? "
+            . "ORDER BY ORDINAL_POSITION";
+        //加载主表的列
+        $columnList = Db::query($sql, [$dbname, $table]);
+        $fieldlist = [];
+        foreach ($columnList as $index => $item) {
+            $fieldlist[] = $item['COLUMN_NAME'];
+        }
+        $this->success("", null, ['fieldlist' => $fieldlist]);
+    }
+
+    /**
+     * 获取控制器列表
+     * @internal
+     */
+    public function get_controller_list()
+    {
+        $adminPath = dirname(__DIR__) . DS;
+        $controllerDir = $adminPath . 'controller' . DS;
+        $files = new \RecursiveIteratorIterator(
+            new \RecursiveDirectoryIterator($controllerDir), \RecursiveIteratorIterator::LEAVES_ONLY
+        );
+        $list = [];
+        foreach ($files as $name => $file) {
+            if (!$file->isDir()) {
+                $filePath = $file->getRealPath();
+                $name = str_replace($controllerDir, '', $filePath);
+                $name = str_replace(DS, "/", $name);
+                $list[] = ['id' => $name, 'name' => $name];
+            }
+        }
+        $pageNumber = $this->request->request("pageNumber");
+        $pageSize = $this->request->request("pageSize");
+        return json(['list' => array_slice($list, ($pageNumber - 1) * $pageSize, $pageSize), 'total' => count($list)]);
+    }
+
+    /**
+     * 详情
+     */
+    public function detail($ids)
+    {
+        $row = $this->model->get($ids);
+        if (!$row)
+            $this->error(__('No Results were found'));
+        $this->view->assign("row", $row);
+        return $this->view->fetch();
+    }
+
+    /**
+     * 执行
+     */
+    public function execute($ids)
+    {
+        $row = $this->model->get($ids);
+        if (!$row)
+            $this->error(__('No Results were found'));
+        $result = $this->doexecute($row['type'], json_decode($row['params'], true));
+        $this->success("", null, ['result' => $result]);
+    }
+
+    /**
+     * 执行命令
+     */
+    public function command($action = '')
+    {
+        $commandtype = $this->request->request("commandtype");
+        $params = $this->request->request();
+        $allowfields = [
+            'crud' => 'table,controller,model,fields,force,local,delete,menu',
+            'menu' => 'controller,delete',
+            'min'  => 'module,resource,optimize',
+            'api'  => 'url,module,output,template,force,title,author,class,language',
+        ];
+        $argv = [];
+        $allowfields = isset($allowfields[$commandtype]) ? explode(',', $allowfields[$commandtype]) : [];
+        $allowfields = array_filter(array_intersect_key($params, array_flip($allowfields)));
+        if (isset($params['local']) && !$params['local']) {
+            $allowfields['local'] = $params['local'];
+        } else {
+            unset($allowfields['local']);
+        }
+        foreach ($allowfields as $key => $param) {
+            $argv[] = "--{$key}=" . (is_array($param) ? implode(',', $param) : $param);
+        }
+        if ($commandtype == 'crud') {
+            $extend = 'setcheckboxsuffix,enumradiosuffix,imagefield,filefield,intdatesuffix,switchsuffix,citysuffix,selectpagesuffix,selectpagessuffix,ignorefields,sortfield,editorsuffix,headingfilterfield';
+            $extendArr = explode(',', $extend);
+            foreach ($params as $index => $item) {
+                if (in_array($index, $extendArr)) {
+                    foreach (explode(',', $item) as $key => $value) {
+                        if ($value) {
+                            $argv[] = "--{$index}={$value}";
+                        }
+                    }
+                }
+            }
+            $isrelation = (int)$this->request->request('isrelation');
+            if ($isrelation && isset($params['relation'])) {
+                foreach ($params['relation'] as $index => $relation) {
+                    foreach ($relation as $key => $value) {
+                        $argv[] = "--{$key}=" . (is_array($value) ? implode(',', $value) : $value);
+                    }
+                }
+            }
+        } else if ($commandtype == 'menu') {
+            if (isset($params['allcontroller']) && $params['allcontroller']) {
+                $argv[] = "--controller=all-controller";
+            } else {
+                foreach (explode(',', $params['controllerfile']) as $index => $param) {
+                    if ($param) {
+                        $argv[] = "--controller=" . substr($param, 0, -4);
+                    }
+                }
+            }
+        } else if ($commandtype == 'min') {
+
+        } else if ($commandtype == 'api') {
+
+        } else {
+
+        }
+        if ($action == 'execute') {
+            $result = $this->doexecute($commandtype, $argv);
+            $this->success("", null, ['result' => $result]);
+        } else {
+            $this->success("", null, ['command' => "php think {$commandtype} " . implode(' ', $argv)]);
+        }
+
+        return;
+    }
+
+    protected function doexecute($commandtype, $argv)
+    {
+        $commandName = "\\app\\admin\\command\\" . ucfirst($commandtype);
+        $input = new Input($argv);
+        $output = new \addons\command\library\Output();
+        $command = new $commandName($commandtype);
+        $data = [
+            'type'        => $commandtype,
+            'params'      => json_encode($argv),
+            'command'     => "php think {$commandtype} " . implode(' ', $argv),
+            'executetime' => time(),
+        ];
+        $this->model->save($data);
+        try {
+            $command->run($input, $output);
+            $result = implode("\n", $output->getMessage());
+            $this->model->status = 'successed';
+        } catch (Exception $e) {
+            $result = implode("\n", $output->getMessage()) . "\n";
+            $result .= $e->getMessage();
+            $this->model->status = 'failured';
+        }
+        $result = trim($result);
+        $this->model->content = $result;
+        $this->model->save();
+        return $result;
+    }
+
+
+}
diff --git a/addons/command/application/admin/lang/zh-cn/command.php b/addons/command/application/admin/lang/zh-cn/command.php
new file mode 100644
index 0000000..b010250
--- /dev/null
+++ b/addons/command/application/admin/lang/zh-cn/command.php
@@ -0,0 +1,16 @@
+<?php
+
+return [
+    'Id'            => 'ID',
+    'Type'          => '类型',
+    'Params'        => '参数',
+    'Command'       => '命令',
+    'Content'       => '返回结果',
+    'Executetime'   => '执行时间',
+    'Createtime'    => '创建时间',
+    'Updatetime'    => '更新时间',
+    'Execute again' => '再次执行',
+    'Successed'     => '成功',
+    'Failured'      => '失败',
+    'Status'        => '状态'
+];
diff --git a/addons/command/application/admin/model/Command.php b/addons/command/application/admin/model/Command.php
new file mode 100644
index 0000000..131e0bd
--- /dev/null
+++ b/addons/command/application/admin/model/Command.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace app\admin\model;
+
+use think\Model;
+
+class Command extends Model
+{
+    // 表名
+    protected $name = 'command';
+
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+
+    // 追加属性
+    protected $append = [
+        'executetime_text',
+        'type_text',
+        'status_text'
+    ];
+
+
+    public function getStatusList()
+    {
+        return ['successed' => __('Successed'), 'failured' => __('Failured')];
+    }
+
+
+    public function getExecutetimeTextAttr($value, $data)
+    {
+        $value = $value ? $value : $data['executetime'];
+        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
+    }
+
+    public function getTypeTextAttr($value, $data)
+    {
+        $value = $value ? $value : $data['type'];
+        $list = ['crud' => '一键生成CRUD', 'menu' => '一键生成菜单', 'min' => '一键压缩打包', 'api' => '一键生成文档'];
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+    public function getStatusTextAttr($value, $data)
+    {
+        $value = $value ? $value : $data['status'];
+        $list = $this->getStatusList();
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+    protected function setExecutetimeAttr($value)
+    {
+        return $value && !is_numeric($value) ? strtotime($value) : $value;
+    }
+
+
+}
diff --git a/addons/command/application/admin/validate/Command.php b/addons/command/application/admin/validate/Command.php
new file mode 100644
index 0000000..9da8fa6
--- /dev/null
+++ b/addons/command/application/admin/validate/Command.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\validate;
+
+use think\Validate;
+
+class Command extends Validate
+{
+    /**
+     * 验证规则
+     */
+    protected $rule = [
+    ];
+    /**
+     * 提示消息
+     */
+    protected $message = [
+    ];
+    /**
+     * 验证场景
+     */
+    protected $scene = [
+        'add'  => [],
+        'edit' => [],
+    ];
+
+}
diff --git a/addons/command/application/admin/view/command/add.html b/addons/command/application/admin/view/command/add.html
new file mode 100644
index 0000000..bb69b43
--- /dev/null
+++ b/addons/command/application/admin/view/command/add.html
@@ -0,0 +1,400 @@
+<style>
+    .relation-item {margin-top:10px;}
+    legend {padding-bottom:5px;font-size:14px;font-weight:600;}
+    label {font-weight:normal;}
+    .form-control{padding:6px 8px;}
+    #extend-zone .col-xs-2 {margin-top:10px;padding-right:0;}
+    #extend-zone .col-xs-2:nth-child(6n+0) {padding-right:15px;}
+</style>
+<div class="panel panel-default panel-intro">
+    <div class="panel-heading">
+        <ul class="nav nav-tabs">
+            <li class="active"><a href="#crud" data-toggle="tab">{:__('一键生成CRUD')}</a></li>
+            <li><a href="#menu" data-toggle="tab">{:__('一键生成菜单')}</a></li>
+            <li><a href="#min" data-toggle="tab">{:__('一键压缩打包')}</a></li>
+            <li><a href="#api" data-toggle="tab">{:__('一键生成API文档')}</a></li>
+        </ul>
+    </div>
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="crud">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <form role="form">
+                            <input type="hidden" name="commandtype" value="crud" />
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <input checked="" name="isrelation" type="hidden" value="0">
+                                        <label class="control-label" data-toggle="tooltip" title="当前只支持生成1对1关联模型,选中后请配置关联表和字段">
+                                            <input name="isrelation" type="checkbox" value="1">
+                                            关联模型
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="local" type="hidden" value="1">
+                                        <label class="control-label" data-toggle="tooltip" title="默认模型生成在application/admin/model目录下,选中后将生成在application/common/model目录下">
+                                            <input name="local" type="checkbox" value="0"> 全局模型类
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="delete" type="hidden" value="0">
+                                        <label class="control-label" data-toggle="tooltip" title="删除CRUD生成的相关文件">
+                                            <input name="delete" type="checkbox" value="1"> 删除模式
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="force" type="hidden" value="0">
+                                        <label class="control-label" data-toggle="tooltip" title="选中后,如果已经存在同名文件将被覆盖。如果是删除将不再提醒">
+                                            <input name="force" type="checkbox" value="1">
+                                            强制覆盖模式
+                                        </label>
+                                    </div>
+                                    <!--
+                                    <div class="col-xs-3">
+                                        <input checked="" name="menu" type="hidden" value="0">
+                                        <label class="control-label" data-toggle="tooltip" title="选中后,将同时生成后台菜单规则">
+                                            <input name="menu" type="checkbox" value="1">
+                                            生成菜单
+                                        </label>
+                                    </div>
+                                    -->
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <legend>主表设置</legend>
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <label>请选择主表</label>
+                                        {:build_select('table',$tableList,null,['class'=>'form-control selectpicker']);}
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>自定义控制器名</label>
+                                        <input type="text" class="form-control" name="controller" data-toggle="tooltip" title="默认根据表名自动生成,如果需要放在二级目录请手动填写" placeholder="支持目录层级,以/分隔">
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>自定义模型名</label>
+                                        <input type="text" class="form-control" name="model" data-toggle="tooltip" title="默认根据表名自动生成" placeholder="不支持目录层级">
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>请选择显示字段(默认全部)</label>
+                                        <select name="fields[]" id="fields" multiple style="height:30px;" class="form-control selectpicker"></select>
+                                    </div>
+
+                                </div>
+
+                            </div>
+
+                            <div class="form-group hide" id="relation-zone">
+                                <legend>关联表设置</legend>
+
+                                <div class="row" style="margin-top:15px;">
+                                    <div class="col-xs-12">
+                                        <a href="javascript:;" class="btn btn-primary btn-sm btn-newrelation" data-index="1">追加关联模型</a>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <hr>
+                            <div class="form-group" id="extend-zone">
+                                <legend>字段识别设置 <span style="font-size:12px;font-weight: normal;">(与之匹配的字段都将生成相应组件)</span></legend>
+                                <div class="row">
+                                    <div class="col-xs-2">
+                                        <label>复选框后缀</label>
+                                        <input type="text" class="form-control" name="setcheckboxsuffix" placeholder="默认为set类型" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>单选框后缀</label>
+                                        <input type="text" class="form-control" name="enumradiosuffix" placeholder="默认为enum类型" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>图片类型后缀</label>
+                                        <input type="text" class="form-control" name="imagefield" placeholder="默认为image,images,avatar,avatars" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>文件类型后缀</label>
+                                        <input type="text" class="form-control" name="filefield" placeholder="默认为file,files" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>日期时间后缀</label>
+                                        <input type="text" class="form-control" name="intdatesuffix" placeholder="默认为time" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>开关后缀</label>
+                                        <input type="text" class="form-control" name="switchsuffix" placeholder="默认为switch" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>城市选择后缀</label>
+                                        <input type="text" class="form-control" name="citysuffix" placeholder="默认为city" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>动态下拉后缀(单)</label>
+                                        <input type="text" class="form-control" name="selectpagesuffix" placeholder="默认为_id" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>动态下拉后缀(多)</label>
+                                        <input type="text" class="form-control" name="selectpagessuffix" placeholder="默认为_ids" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>忽略的字段</label>
+                                        <input type="text" class="form-control" name="ignorefields" placeholder="默认无" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>排序字段</label>
+                                        <input type="text" class="form-control" name="sortfield" placeholder="默认为weigh" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>富文本编辑器</label>
+                                        <input type="text" class="form-control" name="editorsuffix" placeholder="默认为content" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>选项卡过滤字段</label>
+                                        <input type="text" class="form-control" name="headingfilterfield" placeholder="默认为status" />
+                                    </div>
+
+                                </div>
+
+                            </div>
+
+                            <div class="form-group">
+                                <legend>生成命令行</legend>
+                                <textarea class="form-control" data-toggle="tooltip" title="如果在线执行命令失败,可以将命令复制到命令行进行执行" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>返回结果</legend>
+                                <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                    <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
+                                    <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
+                            </div>
+
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="tab-pane fade" id="menu">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <form role="form">
+                            <input type="hidden" name="commandtype" value="menu" />
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <input checked="" name="allcontroller" type="hidden" value="0">
+                                        <label class="control-label">
+                                            <input name="allcontroller" data-toggle="collapse" data-target="#controller" type="checkbox" value="1"> 一键生成全部控制器
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="delete" type="hidden" value="0">
+                                        <label class="control-label">
+                                            <input name="delete" type="checkbox" value="1"> 删除模式
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="force" type="hidden" value="0">
+                                        <label class="control-label">
+                                            <input name="force" type="checkbox" value="1"> 强制覆盖模式
+                                        </label>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group in" id="controller">
+                                <legend>控制器设置</legend>
+
+                                <div class="row" style="margin-top:15px;">
+                                    <div class="col-xs-12">
+                                        <input type="text" name="controllerfile" class="form-control selectpage" style="width:720px;" data-source="command/get_controller_list" data-multiple="true" name="controller" placeholder="请选择控制器" />
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>生成命令行</legend>
+                                <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>返回结果</legend>
+                                <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
+                                <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
+                            </div>
+
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="tab-pane fade" id="min">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <form role="form">
+                            <input type="hidden" name="commandtype" value="min" />
+                            <div class="form-group">
+                                <legend>基础设置</legend>
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <label>请选择压缩模块</label>
+                                        <select name="module" class="form-control selectpicker">
+                                            <option value="all" selected>全部</option>
+                                            <option value="backend">后台Backend</option>
+                                            <option value="frontend">前台Frontend</option>
+                                        </select>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>请选择压缩资源</label>
+                                        <select name="resource" class="form-control selectpicker">
+                                            <option value="all" selected>全部</option>
+                                            <option value="js">JS</option>
+                                            <option value="css">CSS</option>
+                                        </select>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>请选择压缩模式</label>
+                                        <select name="optimize" class="form-control selectpicker">
+                                            <option value="">无</option>
+                                            <option value="uglify">uglify</option>
+                                            <option value="closure">closure</option>
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group in">
+                                <legend>控制器设置</legend>
+
+                                <div class="row" style="margin-top:15px;">
+                                    <div class="col-xs-12">
+
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>生成命令行</legend>
+                                <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>返回结果</legend>
+                                <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
+                                <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
+                            </div>
+
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="tab-pane fade" id="api">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <form role="form">
+                            <input type="hidden" name="commandtype" value="api" />
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <input checked="" name="force" type="hidden" value="0">
+                                        <label class="control-label">
+                                            <input name="force" type="checkbox" value="1">
+                                            覆盖模式
+                                        </label>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <legend>文档设置</legend>
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <label>请输入接口URL</label>
+                                        <input type="text" name="url" class="form-control" placeholder="API URL,可留空" />
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>接口生成文件</label>
+                                        <input type="text" name="output" class="form-control" placeholder="留空则使用api.html" />
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>模板文件</label>
+                                        <input type="text" name="template" class="form-control" placeholder="如果不清楚请留空" />
+                                    </div>
+                                </div>
+                                <div class="row" style="margin-top:10px;">
+                                    <div class="col-xs-3">
+                                        <label>文档标题</label>
+                                        <input type="text" name="title" class="form-control" placeholder="默认为FastAdmin" />
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>文档作者</label>
+                                        <input type="text" name="author" class="form-control" placeholder="默认为FastAdmin" />
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>文档语言</label>
+                                        <select name="language" class="form-control">
+                                            <option value="" selected>请选择语言</option>
+                                            <option value="zh-cn">中文</option>
+                                            <option value="en">英文</option>
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>生成命令行</legend>
+                                <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>返回结果</legend>
+                                <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
+                                <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
+                            </div>
+
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script id="relationtpl" type="text/html">
+    <div class="row relation-item">
+        <div class="col-xs-2">
+            <label>请选择关联表</label>
+            <select name="relation[<%=index%>][relation]" class="form-control relationtable"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>请选择关联类型</label>
+            <select name="relation[<%=index%>][relationmode]" class="form-control relationmode"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>关联外键</label>
+            <select name="relation[<%=index%>][relationforeignkey]" class="form-control relationforeignkey"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>关联主键</label>
+            <select name="relation[<%=index%>][relationprimarykey]" class="form-control relationprimarykey"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>请选择显示字段</label>
+            <select name="relation[<%=index%>][relationfields][]" multiple class="form-control relationfields"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>&nbsp;</label>
+            <a href="javascript:;" class="btn btn-danger btn-block btn-removerelation">移除</a>
+        </div>
+    </div>
+</script>
\ No newline at end of file
diff --git a/addons/command/application/admin/view/command/detail.html b/addons/command/application/admin/view/command/detail.html
new file mode 100644
index 0000000..24bf12d
--- /dev/null
+++ b/addons/command/application/admin/view/command/detail.html
@@ -0,0 +1,42 @@
+<table class="table table-striped">
+    <thead>
+    <tr>
+        <th>{:__('Title')}</th>
+        <th>{:__('Content')}</th>
+    </tr>
+    </thead>
+    <tbody>
+    <tr>
+        <td>{:__('Type')}</td>
+        <td>{$row.type}({$row.type_text})</td>
+    </tr>
+    <tr>
+        <td>{:__('Params')}</td>
+        <td>{$row.params}</td>
+    </tr>
+    <tr>
+        <td>{:__('Command')}</td>
+        <td>{$row.command}</td>
+    </tr>
+    <tr>
+        <td>{:__('Content')}</td>
+        <td>
+            <textarea class="form-control" name="" id="" cols="60" rows="10">{$row.content}</textarea>
+        </td>
+    </tr>
+    <tr>
+        <td>{:__('Executetime')}</td>
+        <td>{$row.executetime|datetime}</td>
+    </tr>
+    <tr>
+        <td>{:__('Status')}</td>
+        <td>{$row.status_text}</td>
+    </tr>
+    </tbody>
+</table>
+<div class="hide layer-footer">
+    <label class="control-label col-xs-12 col-sm-2"></label>
+    <div class="col-xs-12 col-sm-8">
+        <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
+    </div>
+</div>
\ No newline at end of file
diff --git a/addons/command/application/admin/view/command/index.html b/addons/command/application/admin/view/command/index.html
new file mode 100644
index 0000000..3b4f823
--- /dev/null
+++ b/addons/command/application/admin/view/command/index.html
@@ -0,0 +1,25 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
+                        <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('command/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
+                        <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('command/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover" 
+                           data-operate-detail="{:$auth->check('command/detail')}"
+                           data-operate-execute="{:$auth->check('command/execute')}"
+                           data-operate-del="{:$auth->check('command/del')}"
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
diff --git a/addons/command/config.php b/addons/command/config.php
new file mode 100644
index 0000000..b625128
--- /dev/null
+++ b/addons/command/config.php
@@ -0,0 +1,4 @@
+<?php
+
+return [
+];
diff --git a/addons/command/controller/Index.php b/addons/command/controller/Index.php
new file mode 100644
index 0000000..fa88cef
--- /dev/null
+++ b/addons/command/controller/Index.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace addons\command\controller;
+
+use think\addons\Controller;
+
+class Index extends Controller
+{
+
+    public function index()
+    {
+        $this->error("当前插件暂无前台页面");
+    }
+
+}
diff --git a/addons/command/info.ini b/addons/command/info.ini
new file mode 100644
index 0000000..5214fc4
--- /dev/null
+++ b/addons/command/info.ini
@@ -0,0 +1,8 @@
+name = command
+title = 在线命令
+intro = 可在线执行FastAdmin的命令行相关命令
+author = Karson
+website = http://www.fastadmin.net
+version = 1.0.5
+state = 1
+url = /addons/command.html
diff --git a/addons/command/install.sql b/addons/command/install.sql
new file mode 100644
index 0000000..ea58444
--- /dev/null
+++ b/addons/command/install.sql
@@ -0,0 +1,12 @@
+CREATE TABLE IF NOT EXISTS `__PREFIX__command`  (
+  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `type` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '类型',
+  `params` varchar(1500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '参数',
+  `command` varchar(1500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '命令',
+  `content` text COMMENT '返回结果',
+  `executetime` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '执行时间',
+  `createtime` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
+  `updatetime` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
+  `status` enum('successed','failured') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'failured' COMMENT '状态',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '在线命令表' ROW_FORMAT = Compact;
\ No newline at end of file
diff --git a/addons/command/library/Output.php b/addons/command/library/Output.php
new file mode 100644
index 0000000..aba7982
--- /dev/null
+++ b/addons/command/library/Output.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace addons\command\library;
+
+/**
+ * Class Output
+ */
+class Output extends \think\console\Output
+{
+
+    protected $message = [];
+
+    public function __construct($driver = 'console')
+    {
+        parent::__construct($driver);
+    }
+
+    protected function block($style, $message)
+    {
+        $this->message[] = $message;
+    }
+
+    public function getMessage()
+    {
+        return $this->message;
+    }
+
+}
diff --git a/addons/command/public/assets/js/backend/command.js b/addons/command/public/assets/js/backend/command.js
new file mode 100644
index 0000000..f31d8f4
--- /dev/null
+++ b/addons/command/public/assets/js/backend/command.js
@@ -0,0 +1,234 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function ($, undefined, Backend, Table, Form, Template) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'command/index',
+                    add_url: 'command/add',
+                    edit_url: '',
+                    del_url: 'command/del',
+                    multi_url: 'command/multi',
+                    table: 'command',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'id',
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id')},
+                        {field: 'type', title: __('Type'), formatter: Table.api.formatter.search},
+                        {field: 'type_text', title: __('Type')},
+                        {
+                            field: 'command', title: __('Command'), formatter: function (value, row, index) {
+                                return '<input type="text" class="form-control" value="' + value + '">';
+                            }
+                        },
+                        {
+                            field: 'executetime',
+                            title: __('Executetime'),
+                            operate: 'RANGE',
+                            addclass: 'datetimerange',
+                            formatter: Table.api.formatter.datetime
+                        },
+                        {
+                            field: 'createtime',
+                            title: __('Createtime'),
+                            operate: 'RANGE',
+                            addclass: 'datetimerange',
+                            formatter: Table.api.formatter.datetime
+                        },
+                        {
+                            field: 'updatetime',
+                            title: __('Updatetime'),
+                            operate: 'RANGE',
+                            addclass: 'datetimerange',
+                            formatter: Table.api.formatter.datetime
+                        },
+                        {
+                            field: 'status',
+                            title: __('Status'),
+                            table: table,
+                            custom: {"successed": 'success', "failured": 'danger'},
+                            searchList: {"successed": __('Successed'), "failured": __('Failured')},
+                            formatter: Table.api.formatter.status
+                        },
+                        {
+                            field: 'operate',
+                            title: __('Operate'),
+                            buttons: [
+                                {
+                                    name: 'execute',
+                                    title: __('Execute again'),
+                                    text: __('Execute again'),
+                                    url: 'command/execute',
+                                    icon: 'fa fa-repeat',
+                                    classname: 'btn btn-success btn-xs btn-execute btn-ajax',
+                                    success: function (data) {
+                                        Layer.alert("<textarea class='form-control' cols='60' rows='5'>" + data.result + "</textarea>", {
+                                            title: __("执行结果"),
+                                            shadeClose: true
+                                        });
+                                        table.bootstrapTable('refresh');
+                                        return false;
+                                    }
+                                },
+                                {
+                                    name: 'execute',
+                                    title: __('Detail'),
+                                    text: __('Detail'),
+                                    url: 'command/detail',
+                                    icon: 'fa fa-list',
+                                    classname: 'btn btn-info btn-xs btn-execute btn-dialog'
+                                }
+                            ],
+                            table: table,
+                            events: Table.api.events.operate,
+                            formatter: Table.api.formatter.operate
+                        }
+                    ]
+                ]
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            require(['bootstrap-select', 'bootstrap-select-lang']);
+            var mainfields = [];
+            var relationfields = {};
+            var maintable = [];
+            var relationtable = [];
+            var relationmode = ["belongsto", "hasone"];
+
+            var renderselect = function (select, data) {
+                var html = [];
+                for (var i = 0; i < data.length; i++) {
+                    html.push("<option value='" + data[i] + "'>" + data[i] + "</option>");
+                }
+                $(select).html(html.join(""));
+                select.trigger("change");
+                if (select.data("selectpicker")) {
+                    select.selectpicker('refresh');
+                }
+                return select;
+            };
+
+            $("select[name=table] option").each(function () {
+                maintable.push($(this).val());
+            });
+            $(document).on('change', "input[name='isrelation']", function () {
+                $("#relation-zone").toggleClass("hide", !$(this).prop("checked"));
+            });
+            $(document).on('change', "select[name='table']", function () {
+                var that = this;
+                Fast.api.ajax({
+                    url: "command/get_field_list",
+                    data: {table: $(that).val()},
+                }, function (data, ret) {
+                    mainfields = data.fieldlist;
+                    $("#relation-zone .relation-item").remove();
+                    renderselect($("#fields"), mainfields);
+                    return false;
+                });
+                return false;
+            });
+            $(document).on('click', "a.btn-newrelation", function () {
+                var that = this;
+                var index = parseInt($(that).data("index")) + 1;
+                var content = Template("relationtpl", {index: index});
+                content = $(content.replace(/\[index\]/, index));
+                $(this).data("index", index);
+                $(content).insertBefore($(that).closest(".row"));
+                $('select', content).selectpicker();
+                var exists = [$("select[name='table']").val()];
+                $("select.relationtable").each(function () {
+                    exists.push($(this).val());
+                });
+                relationtable = [];
+                $.each(maintable, function (i, j) {
+                    if ($.inArray(j, exists) < 0) {
+                        relationtable.push(j);
+                    }
+                });
+                renderselect($("select.relationtable", content), relationtable);
+                $("select.relationtable", content).trigger("change");
+            });
+            $(document).on('click', "a.btn-removerelation", function () {
+                $(this).closest(".row").remove();
+            });
+            $(document).on('change', "#relation-zone select.relationmode", function () {
+                var table = $("select.relationtable", $(this).closest(".row")).val();
+                var that = this;
+                Fast.api.ajax({
+                    url: "command/get_field_list",
+                    data: {table: table},
+                }, function (data, ret) {
+                    renderselect($(that).closest(".row").find("select.relationprimarykey"), $(that).val() == 'belongsto' ? data.fieldlist : mainfields);
+                    renderselect($(that).closest(".row").find("select.relationforeignkey"), $(that).val() == 'hasone' ? data.fieldlist : mainfields);
+                    return false;
+                });
+            });
+            $(document).on('change', "#relation-zone select.relationtable", function () {
+                var that = this;
+                Fast.api.ajax({
+                    url: "command/get_field_list",
+                    data: {table: $(that).val()},
+                }, function (data, ret) {
+                    renderselect($(that).closest(".row").find("select.relationmode"), relationmode);
+                    renderselect($(that).closest(".row").find("select.relationfields"), mainfields)
+                    renderselect($(that).closest(".row").find("select.relationforeignkey"), data.fieldlist)
+                    renderselect($(that).closest(".row").find("select.relationfields"), data.fieldlist)
+                    return false;
+                });
+            });
+            $(document).on('click', ".btn-command", function () {
+                var form = $(this).closest("form");
+                var textarea = $("textarea[rel=command]", form);
+                textarea.val('');
+                Fast.api.ajax({
+                    url: "command/command/action/command",
+                    data: form.serialize(),
+                }, function (data, ret) {
+                    textarea.val(data.command);
+                    return false;
+                });
+            });
+            $(document).on('click', ".btn-execute", function () {
+                var form = $(this).closest("form");
+                var textarea = $("textarea[rel=result]", form);
+                textarea.val('');
+                Fast.api.ajax({
+                    url: "command/command/action/execute",
+                    data: form.serialize(),
+                }, function (data, ret) {
+                    textarea.val(data.result);
+                    window.parent.$(".toolbar .btn-refresh").trigger('click');
+                    top.window.Fast.api.refreshmenu();
+                    return false;
+                }, function () {
+                    window.parent.$(".toolbar .btn-refresh").trigger('click');
+                });
+            });
+            $("select[name='table']").trigger("change");
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});
diff --git a/addons/nkeditor/Nkeditor.php b/addons/nkeditor/Nkeditor.php
new file mode 100644
index 0000000..b8f252a
--- /dev/null
+++ b/addons/nkeditor/Nkeditor.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace addons\nkeditor;
+
+use app\common\library\Menu;
+use think\Addons;
+
+/**
+ * 富文本编辑器插件
+ */
+class Nkeditor extends Addons
+{
+
+    /**
+     * 插件安装方法
+     * @return bool
+     */
+    public function install()
+    {
+
+        return true;
+    }
+
+    /**
+     * 插件卸载方法
+     * @return bool
+     */
+    public function uninstall()
+    {
+
+        return true;
+    }
+
+    /**
+     * 插件启用方法
+     * @return bool
+     */
+    public function enable()
+    {
+
+        return true;
+    }
+
+    /**
+     * 插件禁用方法
+     * @return bool
+     */
+    public function disable()
+    {
+
+        return true;
+    }
+
+    /**
+     * @param $params
+     */
+    public function configInit(&$params)
+    {
+        $config = $this->getConfig();
+        $params['nkeditor'] = ['theme' => $config['theme'], 'wordimageserver' => $config['wordimageserver']];
+    }
+
+}
diff --git a/addons/nkeditor/README.md b/addons/nkeditor/README.md
new file mode 100644
index 0000000..6ee75c7
--- /dev/null
+++ b/addons/nkeditor/README.md
@@ -0,0 +1,17 @@
+# NKeditor
+NKedtior是基于 kindeditor 进行二次开发的项目
+kindeditor 是一款优秀的开源在线编辑器。轻量级且功能强大,代码量却不到百度的ueditor编辑器的一半。可惜已经4年没有更新了,由于业务的需求我们在kindeditor的基础上开发了 NKeditor, 主要做了一下工作:
+1. 调整编辑器和弹出 dialog 的样式,美化了UI
+2. 重写图片上传和批量图片上传插件,使用 html5 上传代替了 flash,实现了待上传图片预览,优化用户体验
+3. 修复一些已知的bug,如 ajax 提交无法获取内容等
+4. 新增涂鸦等功能
+
+再次感谢 kindeditor 的开发者,为我们提供了如此优秀的在线编辑器,让我们能在前人的基础上继续贡献自己的微薄之力。
+
+# 开源说明
+本插件基于Nkeditor进行二次开发,修改的核心文件已开源于 https://gitee.com/karson/kindeditor 
+
+# 特别感谢
+[Kindeditor](https://gitee.com/luolonghao/kindeditor)
+[Nkeditor](https://gitee.com/blackfox/kindeditor)
+
diff --git a/addons/nkeditor/assets/css/common.css b/addons/nkeditor/assets/css/common.css
new file mode 100644
index 0000000..12fa84e
--- /dev/null
+++ b/addons/nkeditor/assets/css/common.css
@@ -0,0 +1,5 @@
+
+.ke-container-black .ke-toolbar .ke-icon-remoteimage {
+    background-image: url(../img/download.png);
+    background-size: 16px 16px;
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/img/download.png b/addons/nkeditor/assets/img/download.png
new file mode 100644
index 0000000..1945ae7
Binary files /dev/null and b/addons/nkeditor/assets/img/download.png differ
diff --git a/addons/nkeditor/assets/img/downloading.png b/addons/nkeditor/assets/img/downloading.png
new file mode 100644
index 0000000..1d6cbd1
Binary files /dev/null and b/addons/nkeditor/assets/img/downloading.png differ
diff --git a/addons/nkeditor/assets/js/customplugin.js b/addons/nkeditor/assets/js/customplugin.js
new file mode 100644
index 0000000..79075e9
--- /dev/null
+++ b/addons/nkeditor/assets/js/customplugin.js
@@ -0,0 +1,74 @@
+define(['nkeditor-core'], function (Nkeditor) {
+    Nkeditor.plugin('multiimage', function (K) {
+        var self = this, name = 'multiimage', lang = self.lang(name + '.'),
+            allowImages = K.undef(self.allowImages, false);
+
+        var click = function () {
+
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<div class=""><div class="ke-inline-block ke-upload-button">' +
+                '<form class="ke-upload-area ke-form nice-validator n-default" method="post" enctype="multipart/form-data" style="width: 266px;margin:50px auto;">' +
+                '<span class="ke-button-common"><input type="button" class="ke-button-common ke-button" value="批量上传图片" style="width:128px;"></span><input type="file" class="ke-upload-file" name="imgFiles" multiple style="width:128px;left:0;right:inherit" tabindex="-1">' +
+                '<span class="ke-button-common" style="margin-left:10px;"><input type="button" class="ke-button-common ke-button ke-select-image" style="width:128px;" value="从图片空间选择"></span>' +
+                '</form>' +
+                '</div></span></div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 450,
+                    height: 260,
+                    title: self.lang(name),
+                    body: html,
+                    noBtn: {
+                        name: self.lang('no'),
+                        click: function (e) {
+                            self.hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div;
+            $("input[name=imgFiles]", div).change(function () {
+                dialog.showLoading();
+                var files = $(this).prop('files');
+                $.each(files, function (i, file) {
+                    self.beforeUpload.call(self, function (data) {
+                        self.exec('insertimage', Fast.api.cdnurl(data.data.url));
+                    }, file);
+                });
+                setTimeout(function () {
+                    self.hideDialog().focus();
+                }, 0);
+            });
+            $(".ke-select-image", div).click(function () {
+                self.loadPlugin('filemanager', function () {
+                    self.plugin.filemanagerDialog({
+                        dirName: 'image',
+                        multiple: true,
+                        clickFn: function (urls) {
+                            $.each(urls, function(i, url){
+                                self.exec('insertimage', url);
+                            });
+                        }
+                    });
+                });
+                self.hideDialog().focus();
+                // parent.Fast.api.open("general/attachment/select?element_id=&multiple=true&mimetype=*", __('Choose'), {
+                //     callback: function (data) {
+                //         var urlArr = data.url.split(/\,/);
+                //         $.each(urlArr, function () {
+                //             var url = Fast.api.cdnurl(this);
+                //             self.exec('insertimage', url);
+                //         });
+                //     }
+                // });
+            });
+        };
+        self.clickToolbar(name, click);
+    });
+
+    return Nkeditor;
+});
diff --git a/addons/nkeditor/assets/lang/ar.js b/addons/nkeditor/assets/lang/ar.js
new file mode 100644
index 0000000..6eb4b7e
--- /dev/null
+++ b/addons/nkeditor/assets/lang/ar.js
@@ -0,0 +1,242 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* Arabic Translation By daif alotaibi (http://daif.net/)
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'عرض المصدر',
+	preview : 'معاينة الصفحة',
+	undo : 'تراجع(Ctrl+Z)',
+	redo : 'إعادة التراجع(Ctrl+Y)',
+	cut : 'قص(Ctrl+X)',
+	copy : 'نسخ(Ctrl+C)',
+	paste : 'لصق(Ctrl+V)',
+	plainpaste : 'لصق كنص عادي',
+	wordpaste : 'لصق من مايكروسفت ورد',
+	selectall : 'تحديد الكل',
+	justifyleft : 'محاذاه لليسار',
+	justifycenter : 'محاذاه للوسط',
+	justifyright : 'محاذاه لليمين',
+	justifyfull : 'محاذاه تلقائية',
+	insertorderedlist : 'قائمة مرقمه',
+	insertunorderedlist : 'قائمة نقطية',
+	indent : 'إزاحه النص',
+	outdent : 'إلغاء الازاحة',
+	subscript : 'أسفل النص',
+	superscript : 'أعلى النص',
+	formatblock : 'Paragraph format',
+	fontname : 'نوع الخط',
+	fontsize : 'حجم الخط',
+	forecolor : 'لون النص',
+	hilitecolor : 'لون خلفية النص',
+	bold : 'عريض(Ctrl+B)',
+	italic : 'مائل(Ctrl+I)',
+	underline : 'خط تحت النص(Ctrl+U)',
+	strikethrough : 'خط على النص',
+	removeformat : 'إزالة التنسيق',
+	image : 'إدراج صورة',
+	multiimage : 'Multi image',
+	flash : 'إدراج فلاش',
+	media : 'إدراج وسائط متعددة',
+	table : 'إدراج جدول',
+	tablecell : 'خلية',
+	hr : 'إدراج خط أفقي',
+	emoticons : 'إدراج وجه ضاحك',
+	link : 'رابط',
+	unlink : 'إزالة الرابط',
+	fullscreen : 'محرر ملئ الشاشة',
+	about : 'حول',
+	print : 'طباعة',
+	filemanager : 'مدير الملفات',
+	code : 'إدراج نص برمجي',
+	map : 'خرائط قووقل',
+	baidumap : 'خرائط قووقل',
+	lineheight : 'إرتفاع السطر',
+	clearhtml : 'مسح كود HTML',
+	pagebreak : 'إدراج فاصل صفحات',
+	quickformat : 'تنسيق سريع',
+	insertfile : 'إدراج ملف',
+	template : 'إدراج قالب',
+	anchor : 'رابط',
+	yes : 'موافق',
+	no : 'إلغاء',
+	close : 'إغلاق',
+	editImage : 'خصائص الصورة',
+	deleteImage : 'حذفالصورة',
+	editFlash : 'خصائص الفلاش',
+	deleteFlash : 'حذف الفلاش',
+	editMedia : 'خصائص الوسائط',
+	deleteMedia : 'حذف الوسائط',
+	editLink : 'خصائص الرابط',
+	deleteLink : 'إزالة الرابط',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'خصائص الجدول',
+	tablecellprop : 'خصائص الخلية',
+	tableinsert : 'إدراج جدول',
+	tabledelete : 'حذف جدول',
+	tablecolinsertleft : 'إدراج عمود لليسار',
+	tablecolinsertright : 'إدراج عمود لليسار',
+	tablerowinsertabove : 'إدراج صف للأعلى',
+	tablerowinsertbelow : 'إدراج صف للأسفل',
+	tablerowmerge : 'دمج للأسفل',
+	tablecolmerge : 'دمج لليمين',
+	tablerowsplit : 'تقسم الصف',
+	tablecolsplit : 'تقسيم العمود',
+	tablecoldelete : 'حذف العمود',
+	tablerowdelete : 'حذف الصف',
+	noColor : 'إفتراضي',
+	pleaseSelectFile : 'Please select file.',
+	invalidImg : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: jpg,gif,bmp,png",
+	invalidMedia : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "العرض يجب أن يكون رقم.",
+	invalidHeight : "الإرتفاع يجب أن يكون رقم.",
+	invalidBorder : "عرض الحد يجب أن يكون رقم.",
+	invalidUrl : "الرجاء إدخال رابط حيح.",
+	invalidRows : 'صفوف غير صحيح.',
+	invalidCols : 'أعمدة غير صحيحة.',
+	invalidPadding : 'The padding must be number.',
+	invalidSpacing : 'The spacing must be number.',
+	invalidJson : 'Invalid JSON string.',
+	uploadSuccess : 'تم رفع الملف بنجاح.',
+	cutError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+X).',
+	copyError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+C).',
+	pasteError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+V).',
+	ajaxLoading : 'Loading ...',
+	uploadLoading : 'Uploading ...',
+	uploadError : 'Upload Error',
+	'plainpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.',
+	'wordpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'الرابط',
+	'link.linkType' : 'الهدف',
+	'link.newWindow' : 'نافذة جديدة',
+	'link.selfWindow' : 'نفس النافذة',
+	'flash.url' : 'الرابط',
+	'flash.width' : 'العرض',
+	'flash.height' : 'الإرتفاع',
+	'flash.upload' : 'رفع',
+	'flash.viewServer' : 'أستعراض',
+	'media.url' : 'الرابط',
+	'media.width' : 'العرض',
+	'media.height' : 'الإرتفاع',
+	'media.autostart' : 'تشغيل تلقائي',
+	'media.upload' : 'رفع',
+	'media.viewServer' : 'أستعراض',
+	'image.remoteImage' : 'إدراج الرابط',
+	'image.localImage' : 'رفع',
+	'image.remoteUrl' : 'الرابط',
+	'image.localUrl' : 'الملف',
+	'image.size' : 'الحجم',
+	'image.width' : 'العرض',
+	'image.height' : 'الإرتفاع',
+	'image.resetSize' : 'إستعادة الأبعاد',
+	'image.align' : 'محاذاة',
+	'image.defaultAlign' : 'الإفتراضي',
+	'image.leftAlign' : 'اليسار',
+	'image.rightAlign' : 'اليمين',
+	'image.imgTitle' : 'العنوان',
+	'image.upload' : 'أستعراض',
+	'image.viewServer' : 'أستعراض',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : 'فارغ',
+	'filemanager.moveup' : 'المجلد الأب',
+	'filemanager.viewType' : 'العرض: ',
+	'filemanager.viewImage' : 'مصغرات',
+	'filemanager.listImage' : 'قائمة',
+	'filemanager.orderType' : 'الترتيب: ',
+	'filemanager.fileName' : 'بالإسم',
+	'filemanager.fileSize' : 'بالحجم',
+	'filemanager.fileType' : 'بالنوع',
+	'insertfile.url' : 'الرابط',
+	'insertfile.title' : 'العنوان',
+	'insertfile.upload' : 'رفع',
+	'insertfile.viewServer' : 'أستعراض',
+	'table.cells' : 'خلايا',
+	'table.rows' : 'صفوف',
+	'table.cols' : 'أعمدة',
+	'table.size' : 'الأبعاد',
+	'table.width' : 'العرض',
+	'table.height' : 'الإرتفاع',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'الخارج',
+	'table.padding' : 'الداخل',
+	'table.spacing' : 'الفراغات',
+	'table.align' : 'محاذاه',
+	'table.textAlign' : 'افقى',
+	'table.verticalAlign' : 'رأسي',
+	'table.alignDefault' : 'إفتراضي',
+	'table.alignLeft' : 'يسار',
+	'table.alignCenter' : 'وسط',
+	'table.alignRight' : 'يمين',
+	'table.alignTop' : 'أعلى',
+	'table.alignMiddle' : 'منتصف',
+	'table.alignBottom' : 'أسفل',
+	'table.alignBaseline' : 'Baseline',
+	'table.border' : 'الحدود',
+	'table.borderWidth' : 'العرض',
+	'table.borderColor' : 'اللون',
+	'table.backgroundColor' : 'الخلفية',
+	'map.address' : 'العنوان: ',
+	'map.search' : 'بحث',
+	'baidumap.address' : 'العنوان: ',
+	'baidumap.search' : 'بحث',
+	'baidumap.insertDynamicMap' : 'Dynamic Map',
+	'anchor.name' : 'إسم الرابط',
+	'formatblock.formatBlock' : {
+		h1 : 'عنوان 1',
+		h2 : 'عنوان 2',
+		h3 : 'عنوان 3',
+		h4 : 'عنوان 4',
+		p : 'عادي'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : 'إرتفاع السطر 1'},
+		{'1.5' : 'إرتفاع السطر 1.5'},
+		{'2' : 'إرتفاع السطر 2'},
+		{'2.5' : 'إرتفاع السطر 2.5'},
+		{'3' : 'إرتفاع السطر 3'}
+	],
+	'template.selectTemplate' : 'قالب',
+	'template.replaceContent' : 'إستبدال المحتوى الحالي',
+	'template.fileList' : {
+		'1.html' : 'صورة ونص',
+		'2.html' : 'جدول',
+		'3.html' : 'قائمة'
+	}
+}, 'ar');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ar';
\ No newline at end of file
diff --git a/addons/nkeditor/assets/lang/en.js b/addons/nkeditor/assets/lang/en.js
new file mode 100644
index 0000000..dbaa616
--- /dev/null
+++ b/addons/nkeditor/assets/lang/en.js
@@ -0,0 +1,243 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'Source',
+	preview : 'Preview',
+	undo : 'Undo(Ctrl+Z)',
+	redo : 'Redo(Ctrl+Y)',
+	cut : 'Cut(Ctrl+X)',
+	copy : 'Copy(Ctrl+C)',
+	paste : 'Paste(Ctrl+V)',
+	plainpaste : 'Paste as plain text',
+	wordpaste : 'Paste from Word',
+	selectall : 'Select all',
+	justifyleft : 'Align left',
+	justifycenter : 'Align center',
+	justifyright : 'Align right',
+	justifyfull : 'Align full',
+	insertorderedlist : 'Ordered list',
+	insertunorderedlist : 'Unordered list',
+	indent : 'Increase indent',
+	outdent : 'Decrease indent',
+	subscript : 'Subscript',
+	superscript : 'Superscript',
+	formatblock : 'Paragraph format',
+	fontname : 'Font family',
+	fontsize : 'Font size',
+	forecolor : 'Text color',
+	hilitecolor : 'Highlight color',
+	bold : 'Bold(Ctrl+B)',
+	italic : 'Italic(Ctrl+I)',
+	underline : 'Underline(Ctrl+U)',
+	strikethrough : 'Strikethrough',
+	removeformat : 'Remove format',
+	image : 'Image',
+	multiimage : 'Multi image',
+	flash : 'Flash',
+	media : 'Embeded media',
+	table : 'Table',
+	tablecell : 'Cell',
+	hr : 'Insert horizontal line',
+	emoticons : 'Insert emoticon',
+	link : 'Link',
+	unlink : 'Unlink',
+	fullscreen : 'Toggle fullscreen mode',
+	about : 'About',
+	print : 'Print',
+	filemanager : 'File Manager',
+	code : 'Insert code',
+	map : 'Google Maps',
+	baidumap : 'Baidu Maps',
+	lineheight : 'Line height',
+	clearhtml : 'Clear HTML code',
+	pagebreak : 'Insert Page Break',
+	quickformat : 'Quick Format',
+	insertfile : 'Insert file',
+	template : 'Insert Template',
+	anchor : 'Anchor',
+	yes : 'OK',
+	no : 'Cancel',
+	close : 'Close',
+	editImage : 'Image properties',
+	deleteImage : 'Delete image',
+	editFlash : 'Flash properties',
+	deleteFlash : 'Delete flash',
+	editMedia : 'Media properties',
+	deleteMedia : 'Delete media',
+	editLink : 'Link properties',
+	deleteLink : 'Unlink',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'Table properties',
+	tablecellprop : 'Cell properties',
+	tableinsert : 'Insert table',
+	tabledelete : 'Delete table',
+	tablecolinsertleft : 'Insert column left',
+	tablecolinsertright : 'Insert column right',
+	tablerowinsertabove : 'Insert row above',
+	tablerowinsertbelow : 'Insert row below',
+	tablerowmerge : 'Merge down',
+	tablecolmerge : 'Merge right',
+	tablerowsplit : 'Split row',
+	tablecolsplit : 'Split column',
+	tablecoldelete : 'Delete column',
+	tablerowdelete : 'Delete row',
+	noColor : 'Default',
+	pleaseSelectFile : 'Please select file.',
+	invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png",
+	invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "The width must be number.",
+	invalidHeight : "The height must be number.",
+	invalidBorder : "The border must be number.",
+	invalidUrl : "Please type valid URL.",
+	invalidRows : 'Invalid rows.',
+	invalidCols : 'Invalid columns.',
+	invalidPadding : 'The padding must be number.',
+	invalidSpacing : 'The spacing must be number.',
+	invalidJson : 'Invalid JSON string.',
+	uploadSuccess : 'Upload success.',
+	cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.',
+	copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.',
+	pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.',
+	ajaxLoading : 'Loading ...',
+	uploadLoading : 'Uploading ...',
+	uploadError : 'Upload Error',
+	'plainpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
+	'wordpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'URL',
+	'link.linkType' : 'Target',
+	'link.newWindow' : 'New window',
+	'link.selfWindow' : 'Same window',
+	'flash.url' : 'URL',
+	'flash.width' : 'Width',
+	'flash.height' : 'Height',
+	'flash.upload' : 'Upload',
+	'flash.viewServer' : 'Browse',
+	'media.url' : 'URL',
+	'media.width' : 'Width',
+	'media.height' : 'Height',
+	'media.autostart' : 'Auto start',
+	'media.upload' : 'Upload',
+	'media.viewServer' : 'Browse',
+	'image.remoteImage' : 'Insert URL',
+	'image.localImage' : 'Upload',
+	'image.remoteUrl' : 'URL',
+	'image.localUrl' : 'File',
+	'image.size' : 'Size',
+	'image.width' : 'Width',
+	'image.height' : 'Height',
+	'image.resetSize' : 'Reset dimensions',
+	'image.align' : 'Align',
+	'image.defaultAlign' : 'Default',
+	'image.leftAlign' : 'Left',
+	'image.rightAlign' : 'Right',
+	'image.imgTitle' : 'Title',
+	'image.upload' : 'Browse',
+	'image.viewServer' : 'Browse',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : 'Blank',
+	'filemanager.moveup' : 'Parent folder',
+	'filemanager.viewType' : 'Display: ',
+	'filemanager.viewImage' : 'Thumbnails',
+	'filemanager.listImage' : 'List',
+	'filemanager.orderType' : 'Sorting: ',
+	'filemanager.fileName' : 'By name',
+	'filemanager.fileSize' : 'By size',
+	'filemanager.fileType' : 'By type',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'Title',
+	'insertfile.upload' : 'Upload',
+	'insertfile.viewServer' : 'Browse',
+	'table.cells' : 'Cells',
+	'table.rows' : 'Rows',
+	'table.cols' : 'Columns',
+	'table.size' : 'Dimensions',
+	'table.width' : 'Width',
+	'table.height' : 'Height',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'Space',
+	'table.padding' : 'Padding',
+	'table.spacing' : 'Spacing',
+	'table.align' : 'Align',
+	'table.textAlign' : 'Horizontal',
+	'table.verticalAlign' : 'Vertical',
+	'table.alignDefault' : 'Default',
+	'table.alignLeft' : 'Left',
+	'table.alignCenter' : 'Center',
+	'table.alignRight' : 'Right',
+	'table.alignTop' : 'Top',
+	'table.alignMiddle' : 'Middle',
+	'table.alignBottom' : 'Bottom',
+	'table.alignBaseline' : 'Baseline',
+	'table.border' : 'Border',
+	'table.borderWidth' : 'Width',
+	'table.borderColor' : 'Color',
+	'table.backgroundColor' : 'Background',
+	'map.address' : 'Address: ',
+	'map.search' : 'Search',
+	'baidumap.address' : 'Address: ',
+	'baidumap.search' : 'Search',
+	'baidumap.insertDynamicMap' : 'Dynamic Map',
+	'anchor.name' : 'Anchor name',
+	'formatblock.formatBlock' : {
+		h1 : 'Heading 1',
+		h2 : 'Heading 2',
+		h3 : 'Heading 3',
+		h4 : 'Heading 4',
+		p : 'Normal'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : 'Line height 1'},
+		{'1.5' : 'Line height 1.5'},
+		{'2' : 'Line height 2'},
+		{'2.5' : 'Line height 2.5'},
+		{'3' : 'Line height 3'}
+	],
+	'template.selectTemplate' : 'Template',
+	'template.replaceContent' : 'Replace current content',
+	'template.fileList' : {
+		'1.html' : 'Image and Text',
+		'2.html' : 'Table',
+		'3.html' : 'List'
+	}
+}, 'en');
+
+//自动加载代码美化的js插件
+// KindEditor.loadScript(KindEditor.options.pluginsPath+"code/prettify.js");
+// KindEditor.each(KindEditor.options.items, function(i, name) {
+// 	if (name == 'code') {
+// 		KindEditor.options.items[i] = 'map';
+// 	}
+// });
+KindEditor.options.langType = 'en';
diff --git a/addons/nkeditor/assets/lang/ja-JP.js b/addons/nkeditor/assets/lang/ja-JP.js
new file mode 100644
index 0000000..7806d08
--- /dev/null
+++ b/addons/nkeditor/assets/lang/ja-JP.js
@@ -0,0 +1,234 @@
+/*******************************************************************************
+* @author 您的名字 お名前
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'HTMLコード',
+	preview : 'プレビュー',
+	undo : '戻る(Ctrl+Z)',
+	redo : '進む(Ctrl+Y)',
+	cut : 'カット(Ctrl+X)',
+	copy : 'コピー(Ctrl+C)',
+	paste : '貼り付け(Ctrl+V)',
+	plainpaste : 'フォーマットされていないテキストとして貼り付ける',
+	wordpaste : '「word」ドからペースト',
+	selectall : 'すべて選択(Ctrl+A)',
+	justifyleft : '左揃え',
+	justifycenter : '中央揃え',
+	justifyright : '右揃え',
+	justifyfull : '両端揃え',
+	insertorderedlist : '番号',
+	insertunorderedlist : '箇条書き',
+	indent : 'インデントを増やす',
+	outdent : 'インデントを減らす',
+	subscript : '下付き',
+	superscript : '上付き',
+	formatblock : '段落',
+	fontname : 'フォント',
+	fontsize : 'フォントサイズ',
+	forecolor : 'フォントカラー',
+	hilitecolor : 'テキストの背景',
+	bold : '太字(Ctrl+B)',
+	italic : '斜体(Ctrl+I)',
+	underline : '下線(Ctrl+U)',
+	strikethrough : '取り消し線',
+	removeformat : 'フォーマットを削除',
+	image : '画像',
+	multiimage : '一括画像アップロード',
+	flash : 'Flash',
+	media : 'ビデオとオーディオ',
+	table : 'テーブル',
+	tablecell : 'セル',
+	hr : '水平線を挿入する',
+	emoticons : '絵文字を挿入する',
+	link : 'ハイパーリンク',
+	unlink : 'ハイパーリンクをキャンセル',
+	fullscreen : 'フルスクリーン表示',
+	about : 'について',
+	print : 'プリント(Ctrl+P)',
+	filemanager : 'ファイルスペース',
+	code : 'プログラムコードを挿入',
+	map : 'Googleマップ',
+	baidumap : 'Baiduマップ',
+	lineheight : '行間隔',
+	clearhtml : 'HTMLコードをクリア',
+	pagebreak : 'ページ区切りの挿入',
+	quickformat : 'ワンクリックレイアウト',
+	insertfile : 'ファイルの挿入',
+	template : 'テンプレートの挿入',
+	anchor : 'アンカー',
+	yes : 'はい',
+	no : 'いいえ',
+	close : '閉じる',
+	editImage : 'イメージプロパティ',
+	deleteImage : 'イメージを削除',
+	editFlash : 'Flashプロパティ',
+	deleteFlash : 'Flashを削除',
+	editMedia : 'ビデオとオーディオのプロパティ',
+	deleteMedia : 'ビデオとオーディオを削除',
+	editLink : 'ハイパーリンク属性',
+	deleteLink : 'ハイパーリンクを削除',
+	editAnchor : 'アンカー属性',
+	deleteAnchor : 'アンカーを削除',
+	tableprop : 'テーブル属性',
+	tablecellprop : 'セル属性',
+	tableinsert : 'テーブルを挿入',
+	tabledelete : 'テーブルを削除',
+	tablecolinsertleft : '左に列を挿入する',
+	tablecolinsertright : '右に列を挿入する',
+	tablerowinsertabove : '上に行を挿入する',
+	tablerowinsertbelow : '下に行を挿入する',
+	tablerowmerge : '下にセルをマージする',
+	tablecolmerge : '右にセルをマージする',
+	tablerowsplit : '行を分割',
+	tablecolsplit : '列を分割',
+	tablecoldelete : '列を削除',
+	tablerowdelete : '行を削除',
+	noColor : '色なし',
+	pleaseSelectFile : 'ファイルを選択してください。',
+	invalidImg : "有効なURLアドレスを入力してください。\ n jpg、gif、bmp、png形式のみが許可されています。",
+	invalidMedia : "有効なURLアドレスを入力してください。swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb形式のみが許可されています。",
+	invalidWidth : "幅は数字でなければなりません。",
+	invalidHeight : "高さは数字でなければなりません。",
+	invalidBorder : "ボーダーは数字でなければなりません。",
+	invalidUrl : "有効なURLアドレスを入力してください。",
+	invalidRows : '行数は必須項目で、0以上の数字を入力してください。',
+	invalidCols : '列数は必須項目で、0以上の数字を入力してください。',
+	invalidPadding : 'マージンは数字でなければなりません。',
+	invalidSpacing : 'スペースは数字でなければなりません。',
+	invalidJson : 'サーバーエラー。',
+	uploadSuccess : 'アップロード成功。',
+	cutError : 'ブラウザのセキュリティ設定によってカット操作を使用できないので、ショートカットキー(Ctrl + X)を使用してください。',
+	copyError : 'ブラウザのセキュリティ設定によってコピー操作をできないので、ショートカットキー(Ctrl + C)を使用してください。',
+	pasteError : 'ブラウザのセキュリティ設定によって貼り付け操作をできないので、ショートカットキー(Ctrl + V)を使用してください。',
+	ajaxLoading : '読み込み中、お待ちください...',
+	uploadLoading : 'アップロード、しばらくお待ちください...',
+	uploadError : 'アップロードエラー',
+	'plainpaste.comment' : 'ショートカットキー(Ctrl + V)でコンテンツを下のボックスに貼り付けてください。',
+	'wordpaste.comment' : 'ショートカットキー(Ctrl + V)でコンテンツを下のボックスに貼り付けてください。',
+	'code.pleaseInput' : 'プログラムコードを入力してください。 ',
+	'link.url' : 'URL',
+	'link.linkType' : 'タイプを開く',
+	'link.newWindow' : '新しいウィンドウ',
+	'link.selfWindow' : '現在のウィンドウ',
+	'flash.url' : 'URL',
+	'flash.width' : '幅',
+	'flash.height' : '高さ',
+	'flash.upload' : 'アップロード',
+	'flash.viewServer' : 'ファイルスペース',
+	'media.url' : 'URL',
+	'media.width' : '幅',
+	'media.height' : '高さ',
+	'media.autostart' : '自動再生',
+	'media.upload' : 'アップロード',
+	'media.viewServer' : 'ファイルスペース',
+	'image.remoteImage' : 'ネットワークイメージ',
+	'image.localImage' : 'ローカルアップロード',
+	'image.remoteUrl' : 'イメージアドレス  ',
+	'image.localUrl' : 'アップロードファイル',
+	'image.size' : 'イメージサイズ',
+	'image.width' : '幅',
+	'image.height' : '高さ',
+	'image.resetSize' : 'リセットサイズ',
+	'image.align' : '配置',
+	'image.defaultAlign' : 'デフォルト',
+	'image.leftAlign' : '左揃え',
+	'image.rightAlign' : '右揃え',
+	'image.imgTitle' : '画像の説明',
+	'image.upload' : 'ブラウズ...',
+	'image.viewServer' : 'イメージスペース',
+	'multiimage.uploadDesc' : 'ユーザーが<%= uploadLimit%>画像を同時にアップロードできますが、画像の容量は<%= sizeLimit%>を超えることができません',
+	'multiimage.startUpload' : 'アップロード',
+	'multiimage.clearAll' : 'すべてクリア',
+	'multiimage.insertAll' : 'すべて挿入',
+	'multiimage.queueLimitExceeded' : 'ファイルの数が上限を超えています。',
+	'multiimage.fileExceedsSizeLimit' : 'ファイルサイズが制限を超えています。',
+	'multiimage.zeroByteFile' : '空のファイルをアップロードできません。   ',
+	'multiimage.invalidFiletype' : 'ファイル形式は正しくありません。',
+	'multiimage.unknownError' : 'エラー、アップロードできません。',
+	'multiimage.pending' : 'アップロード待ち',
+	'multiimage.uploadError' : 'アップロード失敗',
+	'filemanager.emptyFolder' : '空のフォルダ',
+	'filemanager.moveup' : '前のフォルダに移動',
+	'filemanager.viewType' : '表示モード:',
+	'filemanager.viewImage' : 'サムネイル',
+	'filemanager.listImage' : '詳細',
+	'filemanager.orderType' : '並べ替え:',
+	'filemanager.fileName' : 'ネーム',
+	'filemanager.fileSize' : 'サイズ',
+	'filemanager.fileType' : 'タイプ',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'ファイルの説明',
+	'insertfile.upload' : 'アップロード',
+	'insertfile.viewServer' : 'ファイルスペース',
+	'table.cells' : 'セル番号',
+	'table.rows' : '行数',
+	'table.cols' : '列数',
+	'table.size' : 'サイズ',
+	'table.width' : '幅',
+	'table.height' : '高さ',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'テーブルスペース',
+	'table.padding' : 'パッディング',
+	'table.spacing' : 'スペース',
+	'table.align' : '配置',
+	'table.textAlign' : '水平配置',
+	'table.verticalAlign' : '垂直配置',
+	'table.alignDefault' : 'デフォルト',
+	'table.alignLeft' : '左揃え',
+	'table.alignCenter' : '中央揃え',
+	'table.alignRight' : '右揃え',
+	'table.alignTop' : 'トップ',
+	'table.alignMiddle' : 'ミドル',
+	'table.alignBottom' : 'ボトム',
+	'table.alignBaseline' : 'ベースライン',
+	'table.border' : 'ボーダー',
+	'table.borderWidth' : 'ボーダー',
+	'table.borderColor' : 'カラー',
+	'table.backgroundColor' : '背景色',
+	'map.address' : 'アドレス: ',
+	'map.search' : '検索',
+	'baidumap.address' : 'アドレス: ',
+	'baidumap.search' : '検索',
+	'baidumap.insertDynamicMap' : 'ダイナミックマップの挿入',
+	'anchor.name' : 'アンカー名',
+		
+	'formatblock.formatBlock' : {
+		h1 : '見出し1',
+		h2 : '見出し2',
+		h3 : '見出し3',
+		h4 : '見出し4',
+		p : '正 文'
+	},
+	'fontname.fontName' : {
+		'SimSun' : '明朝体',
+		'NSimSun' : '新宋体',
+		'FangSong_GB2312' : '仿宋_GB2312',
+		'KaiTi_GB2312' : '楷書体_GB2312',
+		'SimHei' : 'ゴチック体',
+		'Microsoft YaHei' : 'Msyh',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '行間1倍'},
+		{'1.5' : '行間1.5倍'},
+		{'2' : '行間2倍'},
+		{'2.5' : '行間2.5倍'},
+		{'3' : '行間3倍'}
+	],
+	'template.selectTemplate' : 'オプションテンプレート',
+	'template.replaceContent' : '現在のコンテンツを置き換える',
+	'template.fileList' : {
+		'1.html' : 'イメージとテキスト',
+		'2.html' : '表',
+		'3.html' : '段落番号'
+	}
+}, 'ja-JP');
+
+KindEditor.options.langType = 'ja-JP';
\ No newline at end of file
diff --git a/addons/nkeditor/assets/lang/ko.js b/addons/nkeditor/assets/lang/ko.js
new file mode 100644
index 0000000..bf5eb22
--- /dev/null
+++ b/addons/nkeditor/assets/lang/ko.js
@@ -0,0 +1,246 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Composite <ukjinplant@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '소스',
+	preview : '미리보기',
+	undo : '작업취소(Ctrl+Z)',
+	redo : '작업재개(Ctrl+Y)',
+	cut : '잘라내기(Ctrl+X)',
+	copy : '복사(Ctrl+C)',
+	paste : '붙여넣기(Ctrl+V)',
+	plainpaste : '일반 텍스트로 붙여넣기',
+	wordpaste : '워드 문서로 붙여넣기',
+	selectall : '전체 선택',
+	justifyleft : '왼쪽 정렬',
+	justifycenter : '가운데 정렬',
+	justifyright : '오른쪽 정렬',
+	justifyfull : '양쪽 정렬',
+	insertorderedlist : '순서 목록',
+	insertunorderedlist : '비순서 목록',
+	indent : '들여쓰기',
+	outdent : '내어쓰기',
+	subscript : '아랫첨자',
+	superscript : '윗첨자',
+	formatblock : '문단 형식',
+	fontname : '글꼴',
+	fontsize : '글자 크기',
+	forecolor : '글자색',
+	hilitecolor : '강조색',
+	bold : '굵게(Ctrl+B)',
+	italic : '이텔릭(Ctrl+I)',
+	underline : '빝줄(Ctrl+U)',
+	strikethrough : '취소선',
+	removeformat : '형식 제거',
+	image : '이미지 추가',
+	multiimage : '여러 이미지 추가',
+	flash : '플래시 추가',
+	media : '미디어 추가',
+	table : '표',
+	tablecell : '열',
+	hr : '구분선 추가',
+	emoticons : '이모티콘 추가',
+	link : '링크',
+	unlink : '링크 제거',
+	fullscreen : '전체 화면 모드',
+	about : '이 에디터는...',
+	print : '인쇄',
+	filemanager : '파일 관리자',
+	code : '코드 추가',
+	map : '구글 맵 추가',
+	baidumap : '바이두 맵 추가',
+	lineheight : '행 간격',
+	clearhtml : 'HTML 코드 정리',
+	pagebreak : '페이지 구분 추가',
+	quickformat : '빠른 형식',
+	insertfile : '파일 추가',
+	template : '템플릿 추가',
+	anchor : '책갈피',
+	yes : '확인',
+	no : '취소',
+	close : '닫기',
+	editImage : '이미지 속성',
+	deleteImage : '이미지 삭제',
+	editFlash : '플래시 속성',
+	deleteFlash : '플래시 삭제',
+	editMedia : '미디어 속성',
+	deleteMedia : '미디어 삭제',
+	editLink : '링크 속성',
+	deleteLink : '링크 삭제',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : '표 속성',
+	tablecellprop : '열 속성',
+	tableinsert : '표 추가',
+	tabledelete : '표 삭제',
+	tablecolinsertleft : '왼쪽으로 열 추가',
+	tablecolinsertright : '오른쪽으로 열 추가',
+	tablerowinsertabove : '위쪽으로 열 추가',
+	tablerowinsertbelow : '아래쪽으로 열 추가',
+	tablerowmerge : '아래로 병합',
+	tablecolmerge : '오른쪽으로 병합',
+	tablerowsplit : '행 나누기',
+	tablecolsplit : '열 나누기',
+	tablecoldelete : '열 삭제',
+	tablerowdelete : '행 삭제',
+	noColor : '기본색',
+	pleaseSelectFile : '파일 선택',
+	invalidImg : "올바른 주소를 입력하세요.\njpg,gif,bmp,png 형식이 가능합니다.",
+	invalidMedia : "올바른 주소를 입력하세요.\nswf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb 형식이 가능합니다.",
+	invalidWidth : "넓이 값은 숫자여야 합니다.",
+	invalidHeight : "높이 값은 숫자여야 합니다.",
+	invalidBorder : "굵기 값은 숫자여야 합니다.",
+	invalidUrl : "올바른 주소를 입력하세요.",
+	invalidRows : '올바른 행이 아닙니다.',
+	invalidCols : '올바른 열이 아닙니다.',
+	invalidPadding : '안쪽 여백 값은 숫자여야 합니다.',
+	invalidSpacing : '간격 길이 값은 숫자여야 합니다.',
+	invalidJson : '올바른 JSON 형식이 아닙니다.',
+	uploadSuccess : '업로드가 완료되었습니다.',
+	cutError : '브라우저가 잘라내기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	copyError : '브라우저가 복사 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	pasteError : '브라우저가 붙여넣기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	ajaxLoading : '불러오는 중 ...',
+	uploadLoading : '업로드 중 ...',
+	uploadError : '업로드 오류',
+	'plainpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 텍스트를 붙여넣으세요.',
+	'wordpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 워드 텍스트를 붙여넣으세요.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : '주소',
+	'link.linkType' : '창',
+	'link.newWindow' : '새 창',
+	'link.selfWindow' : '현재 창',
+	'flash.url' : '주소',
+	'flash.width' : '넓이',
+	'flash.height' : '높이',
+	'flash.upload' : '업로드',
+	'flash.viewServer' : '찾아보기',
+	'media.url' : '주소',
+	'media.width' : '넓이',
+	'media.height' : '높이',
+	'media.autostart' : '자동 시작',
+	'media.upload' : '업로드',
+	'media.viewServer' : '찾아보기',
+	'image.remoteImage' : '외부 이미지',
+	'image.localImage' : '내부 이미지',
+	'image.remoteUrl' : '주소',
+	'image.localUrl' : '파일',
+	'image.size' : '크기',
+	'image.width' : '넓이',
+	'image.height' : '높이',
+	'image.resetSize' : '기본 크기로',
+	'image.align' : '정렬',
+	'image.defaultAlign' : '기본',
+	'image.leftAlign' : '왼쪽',
+	'image.rightAlign' : '오른쪽',
+	'image.imgTitle' : '제목',
+	'image.upload' : '찾아보기',
+	'image.viewServer' : '찾아보기',
+	'multiimage.uploadDesc' : '최대 이미지 개수: <%=uploadLimit%>개, 개당 이미지 크기: <%=sizeLimit%>',
+	'multiimage.startUpload' : '업로드 시작',
+	'multiimage.clearAll' : '모두 삭제',
+	'multiimage.insertAll' : '모두 삽입',
+	'multiimage.queueLimitExceeded' : '업로드 개수가 초과되었습니다.',
+	'multiimage.fileExceedsSizeLimit' : '업로드 크기가 초과되었습니다.',
+	'multiimage.zeroByteFile' : '파일 크기가 없습니다.',
+	'multiimage.invalidFiletype' : '올바른 이미지가 아닙니다.',
+	'multiimage.unknownError' : '알 수 없는 업로드 오류가 발생하였습니다.',
+	'multiimage.pending' : '처리 중 ...',
+	'multiimage.uploadError' : '업로드 오류',
+	'filemanager.emptyFolder' : '빈 폴더',
+	'filemanager.moveup' : '위로',
+	'filemanager.viewType' : '보기 방식: ',
+	'filemanager.viewImage' : '미리 보기',
+	'filemanager.listImage' : '목록',
+	'filemanager.orderType' : '정렬 방식: ',
+	'filemanager.fileName' : '이름별',
+	'filemanager.fileSize' : '크기별',
+	'filemanager.fileType' : '종류별',
+	'insertfile.url' : '주소',
+	'insertfile.title' : '제목',
+	'insertfile.upload' : '업로드',
+	'insertfile.viewServer' : '찾아보기',
+	'table.cells' : '열',
+	'table.rows' : '행',
+	'table.cols' : '열',
+	'table.size' : '표 크기',
+	'table.width' : '넓이',
+	'table.height' : '높이',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '간격',
+	'table.padding' : '안쪽여백',
+	'table.spacing' : '간격',
+	'table.align' : '정렬',
+	'table.textAlign' : '수직',
+	'table.verticalAlign' : '수평',
+	'table.alignDefault' : '기본',
+	'table.alignLeft' : '왼쪽',
+	'table.alignCenter' : '가운데',
+	'table.alignRight' : '오른쪽',
+	'table.alignTop' : '위쪽',
+	'table.alignMiddle' : '중간',
+	'table.alignBottom' : '아래쪽',
+	'table.alignBaseline' : '글자기준',
+	'table.border' : '테두리',
+	'table.borderWidth' : '크기',
+	'table.borderColor' : '색상',
+	'table.backgroundColor' : '배경',
+	'map.address' : '주소: ',
+	'map.search' : '검색',
+	'baidumap.address' : '주소: ',
+	'baidumap.search' : '검색',
+	'baidumap.insertDynamicMap' : '동적 지도',
+	'anchor.name' : '책갈피명',
+	'formatblock.formatBlock' : {
+		h1 : '제목 1',
+		h2 : '제목 2',
+		h3 : '제목 3',
+		h4 : '제목 4',
+		p : '본문'
+	},
+	'fontname.fontName' : {
+		'Gulim' : '굴림',
+		'Dotum' : '돋움',
+		'Batang' : '바탕',
+		'Gungsuh' : '궁서',
+		'Malgun Gothic' : '맑은 고딕',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '행간 1'},
+		{'1.5' : '행간 1.5'},
+		{'2' : '행간 2'},
+		{'2.5' : '행간 2.5'},
+		{'3' : '행간 3'}
+	],
+	'template.selectTemplate' : '템플릿',
+	'template.replaceContent' : '내용 바꾸기',
+	'template.fileList' : {
+		'1.html' : '이미지와 텍스트',
+		'2.html' : '표',
+		'3.html' : '목록'
+	}
+}, 'ko');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ko';
diff --git a/addons/nkeditor/assets/lang/ru.js b/addons/nkeditor/assets/lang/ru.js
new file mode 100644
index 0000000..dda10bf
--- /dev/null
+++ b/addons/nkeditor/assets/lang/ru.js
@@ -0,0 +1,242 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* Translated to Russian by Valery Votintsev (http://codersclub.org/)
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'Source',
+	preview : 'Preview',
+	undo : 'Отмена(Ctrl+Z)',
+	redo : 'Повтор(Ctrl+Y)',
+	cut : 'Вырезать(Ctrl+X)',
+	copy : 'Копировать(Ctrl+C)',
+	paste : 'Вставить(Ctrl+V)',
+	plainpaste : 'Вставить как простой текст',
+	wordpaste : 'Вставить из Word',
+	selectall : 'Выбрать все',
+	justifyleft : 'Выравнивание влево',
+	justifycenter : 'Выравнивание по центру',
+	justifyright : 'Выравнивание вправо',
+	justifyfull : 'Выравнивание по обеим сторонам',
+	insertorderedlist : 'Нумерованый список',
+	insertunorderedlist : 'Ненумерованый список',
+	indent : 'Добавить отступ',
+	outdent : 'Убрать отступ',
+	subscript : 'Надстрочный',
+	superscript : 'Подстрочный',
+	formatblock : 'Формат параграфа',
+	fontname : 'Шрифт',
+	fontsize : 'Размер',
+	forecolor : 'Цвет текста',
+	hilitecolor : 'Цвет фона',
+	bold : 'Жирный(Ctrl+B)',
+	italic : 'Наклонный(Ctrl+I)',
+	underline : 'Подчёркнутый(Ctrl+U)',
+	strikethrough : 'Перечёркнутый',
+	removeformat : 'Удалить формат',
+	image : 'Изображение',
+	multiimage : 'Мульти-загрузка',
+	flash : 'Flash',
+	media : 'Встроенные данные',
+	table : 'Таблица',
+	tablecell : 'Ячейка',
+	hr : 'Горизонтальный разделитель',
+	emoticons : 'Смайл',
+	link : 'Ссылка',
+	unlink : 'Убрать ссылку',
+	fullscreen : 'На весь экран',
+	about : 'О программе',
+	print : 'Печать',
+	filemanager : 'Файлы',
+	code : 'Код',
+	map : 'Карта Google',
+	baidumap : 'Карта Baidu',
+	lineheight : 'Межстрочный интервал',
+	clearhtml : 'Очистить HTML код',
+	pagebreak : 'Разрыв страницы',
+	quickformat : 'Быстрый формат',
+	insertfile : 'Вставить файл',
+	template : 'Вставить шаблон',
+	anchor : 'Якорь',
+	yes : 'OK',
+	no : 'Отмена',
+	close : 'Закрыть',
+	editImage : 'Свойства изображения',
+	deleteImage : 'Удалить изображение',
+	editFlash : 'Свойства Flash',
+	deleteFlash : 'Удалить Flash',
+	editMedia : 'Свойства Media',
+	deleteMedia : 'Удалить Media',
+	editLink : 'Свойства ссылки',
+	deleteLink : 'Удалить ссылку',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'Свойства таблицы',
+	tablecellprop : 'Свойства ячейки',
+	tableinsert : 'Вставить таблицу',
+	tabledelete : 'Удалить таблицу',
+	tablecolinsertleft : 'Добавить столбец слева',
+	tablecolinsertright : 'Добавить столбец справа',
+	tablerowinsertabove : 'Добавить строку выше',
+	tablerowinsertbelow : 'Добавить строку ниже',
+	tablerowmerge : 'Объединить вниз',
+	tablecolmerge : 'Объединить вправо',
+	tablerowsplit : 'Разделить строку',
+	tablecolsplit : 'Разделить столбец',
+	tablecoldelete : 'Удалить столбец',
+	tablerowdelete : 'Удалить строку',
+	noColor : 'По умолчанию',
+	pleaseSelectFile : 'Выберите файл.',
+	invalidImg : "Укажите корректный URL изображения.\nРазрешённые форматы: jpg,gif,bmp,png",
+	invalidMedia : "Укажите корректный тип медиа-объекта.\nРазрешённые типы: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "Ширина должна быть числом.",
+	invalidHeight : "Высота должна быть числом.",
+	invalidBorder : "Ширина рамки должна быть числом.",
+	invalidUrl : "Укажите корректный URL.",
+	invalidRows : 'Неверные строки.',
+	invalidCols : 'Неверные столбцы.',
+	invalidPadding : 'padding должен быть числом.',
+	invalidSpacing : 'spacing должен быть числом.',
+	invalidJson : 'Неверная JSON строка.',
+	uploadSuccess : 'Загрузка завершена.',
+	cutError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+X).',
+	copyError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+C).',
+	pasteError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	ajaxLoading : 'Загрузка ...',
+	uploadLoading : 'Загрузка ...',
+	uploadError : 'Сбой загрузки',
+	'plainpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	'wordpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	'code.pleaseInput' : 'Введите код.',
+	'link.url' : 'URL',
+	'link.linkType' : 'Открывать ссылку',
+	'link.newWindow' : 'в новом окне',
+	'link.selfWindow' : 'в том же окне',
+	'flash.url' : 'URL',
+	'flash.width' : 'Ширина',
+	'flash.height' : 'Высота',
+	'flash.upload' : 'Загрузить',
+	'flash.viewServer' : 'Выбрать',
+	'media.url' : 'URL',
+	'media.width' : 'Ширина',
+	'media.height' : 'Высота',
+	'media.autostart' : 'Автостарт',
+	'media.upload' : 'Загрузить',
+	'media.viewServer' : 'Выбрать',
+	'image.remoteImage' : 'Вставить URL изображения',
+	'image.localImage' : 'Загрузить',
+	'image.remoteUrl' : 'URL',
+	'image.localUrl' : 'Файл',
+	'image.size' : 'Размер',
+	'image.width' : 'Ширина',
+	'image.height' : 'Высота',
+	'image.resetSize' : 'Сбросить размеры',
+	'image.align' : 'Выравнивание',
+	'image.defaultAlign' : 'По умолчанию',
+	'image.leftAlign' : 'Влево',
+	'image.rightAlign' : 'Вправо',
+	'image.imgTitle' : 'Название',
+	'image.upload' : 'Загрузить',
+	'image.viewServer' : 'Выбрать',
+	'multiimage.uploadDesc' : 'Максимальное кол-во изображений: <%=uploadLimit%>, Максимальный размер одного изображения: <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Начать загрузку',
+	'multiimage.clearAll' : 'Очистить все',
+	'multiimage.insertAll' : 'Вставить все',
+	'multiimage.queueLimitExceeded' : 'Превышен лимит очереди.',
+	'multiimage.fileExceedsSizeLimit' : 'Превышен максимальный размер файла.',
+	'multiimage.zeroByteFile' : 'Файл нулевой длины.',
+	'multiimage.invalidFiletype' : 'Недопустимый тип файла.',
+	'multiimage.unknownError' : 'Непредвиденная ошибка загрузки.',
+	'multiimage.pending' : 'Ожидает ...',
+	'multiimage.uploadError' : 'Ошибка загрузки',
+	'filemanager.emptyFolder' : 'Папка пуста',
+	'filemanager.moveup' : 'Наверх',
+	'filemanager.viewType' : 'Тип показа: ',
+	'filemanager.viewImage' : 'Превьюшки',
+	'filemanager.listImage' : 'Список',
+	'filemanager.orderType' : 'Сортировка: ',
+	'filemanager.fileName' : 'По имени',
+	'filemanager.fileSize' : 'По размеру',
+	'filemanager.fileType' : 'По типу',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'Название',
+	'insertfile.upload' : 'Загрузить',
+	'insertfile.viewServer' : 'Выбрать',
+	'table.cells' : 'Ячейки',
+	'table.rows' : 'Строки',
+	'table.cols' : 'Столбцы',
+	'table.size' : 'Размеры',
+	'table.width' : 'Ширина',
+	'table.height' : 'Высота',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'Space',
+	'table.padding' : 'Padding',
+	'table.spacing' : 'Spacing',
+	'table.align' : 'Выравнивание',
+	'table.textAlign' : 'По горизонтали',
+	'table.verticalAlign' : 'По вертикали',
+	'table.alignDefault' : 'По умолчанию',
+	'table.alignLeft' : 'Влево',
+	'table.alignCenter' : 'По центру',
+	'table.alignRight' : 'Вправо',
+	'table.alignTop' : 'Вверх',
+	'table.alignMiddle' : 'Посередине',
+	'table.alignBottom' : 'Вниз',
+	'table.alignBaseline' : 'По базовой линии',
+	'table.border' : 'Рамка',
+	'table.borderWidth' : 'Ширина',
+	'table.borderColor' : 'Цвет',
+	'table.backgroundColor' : 'Цвет фона',
+	'map.address' : 'Адрес: ',
+	'map.search' : 'Поиск',
+	'baidumap.address' : 'Адрес: ',
+	'baidumap.search' : 'Поиск',
+	'baidumap.insertDynamicMap' : 'Динамическая карта',
+	'anchor.name' : 'Имя якоря',
+	'formatblock.formatBlock' : {
+		h1 : 'Заголовок 1',
+		h2 : 'Заголовок 2',
+		h3 : 'Заголовок 3',
+		h4 : 'Заголовок 4',
+		p : 'Обычный текст'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '1'},
+		{'1.5' : '1.5'},
+		{'2' : '2'},
+		{'2.5' : '2.5'},
+		{'3' : '3'}
+	],
+	'template.selectTemplate' : 'Шаблон',
+	'template.replaceContent' : 'Заменить текущий шаблон',
+	'template.fileList' : {
+		'1.html' : 'Текст и изображения',
+		'2.html' : 'Таблица',
+		'3.html' : 'Список'
+	}
+}, 'en');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ru';
diff --git a/addons/nkeditor/assets/lang/zh-CN.js b/addons/nkeditor/assets/lang/zh-CN.js
new file mode 100644
index 0000000..405e2f4
--- /dev/null
+++ b/addons/nkeditor/assets/lang/zh-CN.js
@@ -0,0 +1,267 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'HTML代码',
+	preview : '预览',
+	undo : '后退(Ctrl+Z)',
+	redo : '前进(Ctrl+Y)',
+	cut : '剪切(Ctrl+X)',
+	copy : '复制(Ctrl+C)',
+	paste : '粘贴(Ctrl+V)',
+	plainpaste : '粘贴为无格式文本',
+	wordpaste : '从Word粘贴',
+	selectall : '全选(Ctrl+A)',
+	justifyleft : '左对齐',
+	justifycenter : '居中',
+	justifyright : '右对齐',
+	justifyfull : '两端对齐',
+	insertorderedlist : '编号',
+	insertunorderedlist : '项目符号',
+	indent : '增加缩进',
+	outdent : '减少缩进',
+	subscript : '下标',
+	superscript : '上标',
+	formatblock : '段落',
+	fontname : '字体',
+	fontsize : '文字大小',
+	forecolor : '文字颜色',
+	hilitecolor : '文字背景',
+	bold : '粗体(Ctrl+B)',
+	italic : '斜体(Ctrl+I)',
+	underline : '下划线(Ctrl+U)',
+	strikethrough : '删除线',
+	removeformat : '删除格式',
+	image : '图片',
+	multiimage : '批量图片上传',
+	graft : '涂鸦',
+	flash : 'Flash',
+	media : '视音频',
+	table : '表格',
+	tablecell : '单元格',
+	hr : '插入横线',
+	emoticons : '插入表情',
+	link : '超级链接',
+	unlink : '取消超级链接',
+	fullscreen : '全屏显示',
+	about : '关于',
+	print : '打印(Ctrl+P)',
+	filemanager : '文件空间',
+	code : '插入程序代码',
+	quote : '插入引用',
+	map : 'Google地图',
+	baidumap : '百度地图',
+	lineheight : '行距',
+	clearhtml : '清理HTML代码',
+	pagebreak : '插入分页符',
+	quickformat : '一键排版',
+	insertfile : '插入文件',
+	template : '插入模板',
+	anchor : '锚点',
+	yes : '确定',
+	no : '取消',
+	close : '关闭',
+	editImage : '图片属性',
+	deleteImage : '删除图片',
+	editFlash : 'Flash属性',
+	deleteFlash : '删除Flash',
+	editMedia : '视音频属性',
+	deleteMedia : '删除视音频',
+	editLink : '超级链接属性',
+	deleteLink : '取消超级链接',
+	editAnchor : '锚点属性',
+	deleteAnchor : '删除锚点',
+	tableprop : '表格属性',
+	tablecellprop : '单元格属性',
+	tableinsert : '插入表格',
+	tabledelete : '删除表格',
+	tablecolinsertleft : '左侧插入列',
+	tablecolinsertright : '右侧插入列',
+	tablerowinsertabove : '上方插入行',
+	tablerowinsertbelow : '下方插入行',
+	tablerowmerge : '向下合并单元格',
+	tablecolmerge : '向右合并单元格',
+	tablerowsplit : '拆分行',
+	tablecolsplit : '拆分列',
+	tablecoldelete : '删除列',
+	tablerowdelete : '删除行',
+	noColor : '无颜色',
+	pleaseSelectFile : '请选择文件。',
+	invalidImg : "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。",
+	invalidMedia : "请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
+	invalidWidth : "宽度必须为数字。",
+	invalidHeight : "高度必须为数字。",
+	invalidBorder : "边框必须为数字。",
+	invalidUrl : "请输入有效的URL地址。",
+	invalidRows : '行数为必选项,只允许输入大于0的数字。',
+	invalidCols : '列数为必选项,只允许输入大于0的数字。',
+	invalidPadding : '边距必须为数字。',
+	invalidSpacing : '间距必须为数字。',
+	invalidJson : '服务器发生故障。',
+	uploadSuccess : '上传成功。',
+	cutError : '您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。',
+	copyError : '您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。',
+	pasteError : '您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。',
+	ajaxLoading : '加载中,请稍候 ...',
+	uploadLoading : '上传中,请稍候 ...',
+	uploadError : '上传错误',
+
+	'plainpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+	'wordpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+	'code.pleaseInput' : '请输入程序代码。',
+	'link.url' : 'URL',
+	'link.linkType' : '打开类型',
+	'link.newWindow' : '新窗口',
+	'link.selfWindow' : '当前窗口',
+	'flash.url' : 'URL',
+	'flash.width' : '宽度',
+	'flash.height' : '高度',
+	'flash.upload' : '上传',
+	'flash.viewServer' : '文件空间',
+	'media.url' : 'URL',
+	'media.width' : '宽度',
+	'media.height' : '高度',
+	'media.autostart' : '自动播放',
+	'media.upload' : '上传',
+	'media.viewServer' : '文件空间',
+	'image.remoteImage' : '网络图片',
+	'image.localImage' : '本地上传',
+	'image.remoteUrl' : '图片地址',
+	'image.localUrl' : '上传文件',
+	'image.size' : '图片大小',
+	'image.width' : '宽',
+	'image.height' : '高',
+	'image.resetSize' : '重置大小',
+	'image.align' : '对齐方式',
+	'image.defaultAlign' : '默认方式',
+	'image.leftAlign' : '左对齐',
+	'image.rightAlign' : '右对齐',
+	'image.imgTitle' : '图片说明',
+	'image.upload' : '浏览...',
+	'image.viewServer' : '图片空间',
+
+	'multiimage.title' : '多图上传',
+	'multiimage.uploadDesc' : '共选择了 <%=numSelect%> 张图片,共 <%=totalSize%>, 还可以添加 <%=numLeft%> 张图片.',
+	'multiimage.startUpload' : '开始上传',
+	'multiimage.noListUrl' : '无法获取图片,请先配置 fileManagerJson.',
+	'multiimage.noSearchUrl' : '无法进行图片搜索,请先配置 imageSearchJson.',
+	'multiimage.noDataText' : '(⊙o⊙)亲,没有多数据了。',
+	'multiimage.closeText' : '关闭对话框',
+	'multiimage.confirmBtnText' : '确定',
+	'multiimage.cancelBtnText' : '取消',
+	'multiimage.loadMoreData' : '往下拉动滚动条可以加载更多数据.',
+	'multiimage.depJQueryError' : '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+	'multiimage.localUpload' : '本地上传',
+	'multiimage.fileServer' : '文件服务器',
+	'multiimage.imgSearch' : '图片搜索',
+	'multiimage.selectFile' : '点击选择图片',
+	'multiimage.continueAdd' : '继续添加',
+	'multiimage.searchBtn' : '搜索一下',
+	'multiimage.searchPlaceholder' : '请输入搜索关键词',
+	'multiimage.searchClear' : '清空搜索',
+	'multiimage.noFileAdded' : '请至少添加一个文件!',
+	'multiimage.uploading' : '正在上传',
+	'multiimage.fileNotUpload' : '您还有文件没有上传!',
+	'multiimage.uploadLimit' : '您本次最多上传 <%=uploadLimit%> 个文件.',
+	'multiimage.sizeLimit' : '文件大小不能超过 <%=sizeLimit%> KB.',
+	'multiimage.invalidExt' : '非法的文件后缀 <%=invalidExt%>.',
+	'multiimage.remove' : '删除',
+	'multiimage.rotateRight' : '向右旋转',
+	'multiimage.rotateLeft' : '向左旋转',
+	'multiimage.uploadFail' : '发生异常,上传失败!',
+	'multiimage.noFileSelected' : '请至少选择一个文件或一张图片.',
+
+	'filemanager.noDataText' : '(⊙o⊙)亲,没有多数据了。',
+	'filemanager.title' : '文件服务器',
+	'filemanager.noListUrl' : '无法获取图片,请先配置 fileManagerJson.',
+	'filemanager.closeText' : '关闭对话框',
+	'filemanager.confirmBtnText' : '确定',
+	'filemanager.cancelBtnText' : '取消',
+	'filemanager.loadMoreData' : '往下拉动滚动条可以加载更多数据.',
+	'filemanager.depJQueryError' : '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+	'filemanager.fileType' : '类型',
+
+	'graft.btnText' : '保存并插入涂鸦',
+	'graft.uploadSuccess' : '涂鸦上传成功',
+	'graft.uploadFaild' : '涂鸦上传失败',
+	'graft.empty' : '您没有在画布上绘制任何图像',
+
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '文件说明',
+	'insertfile.upload' : '上传',
+	'insertfile.viewServer' : '文件空间',
+	'table.cells' : '单元格数',
+	'table.rows' : '行数',
+	'table.cols' : '列数',
+	'table.size' : '大小',
+	'table.width' : '宽度',
+	'table.height' : '高度',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '边距间距',
+	'table.padding' : '边距',
+	'table.spacing' : '间距',
+	'table.align' : '对齐方式',
+	'table.textAlign' : '水平对齐',
+	'table.verticalAlign' : '垂直对齐',
+	'table.alignDefault' : '默认',
+	'table.alignLeft' : '左对齐',
+	'table.alignCenter' : '居中',
+	'table.alignRight' : '右对齐',
+	'table.alignTop' : '顶部',
+	'table.alignMiddle' : '中部',
+	'table.alignBottom' : '底部',
+	'table.alignBaseline' : '基线',
+	'table.border' : '边框',
+	'table.borderWidth' : '宽度',
+	'table.borderColor' : '颜色',
+	'table.backgroundColor' : '背景颜色',
+	'map.address' : '地址: ',
+	'map.search' : '搜索',
+	'baidumap.address' : '地址: ',
+	'baidumap.search' : '搜索',
+	'baidumap.insertDynamicMap' : '插入动态地图',
+	'anchor.name' : '锚点名称',
+	'formatblock.formatBlock' : {
+		h1 : '标题 1',
+		h2 : '标题 2',
+		h3 : '标题 3',
+		h4 : '标题 4',
+		p : '正 文'
+	},
+	'fontname.fontName' : {
+		'SimSun' : '宋体',
+		'NSimSun' : '新宋体',
+		'FangSong' : '仿宋',
+		'KaiTi' : '楷体',
+		'SimHei' : '黑体',
+		'Microsoft YaHei' : '微软雅黑',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '单倍行距'},
+		{'1.5' : '1.5倍行距'},
+		{'2' : '2倍行距'},
+		{'2.5' : '2.5倍行距'},
+		{'3' : '3倍行距'}
+	],
+	'template.selectTemplate' : '可选模板',
+	'template.replaceContent' : '替换当前内容',
+	'template.fileList' : {
+		'1.html' : '图片和文字',
+		'2.html' : '表格',
+		'3.html' : '项目编号'
+	}
+}, 'zh-CN');
+KindEditor.options.langType = 'zh-CN';
diff --git a/addons/nkeditor/assets/lang/zh-TW.js b/addons/nkeditor/assets/lang/zh-TW.js
new file mode 100644
index 0000000..4946898
--- /dev/null
+++ b/addons/nkeditor/assets/lang/zh-TW.js
@@ -0,0 +1,243 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '原始碼',
+	preview : '預覽',
+	undo : '復原(Ctrl+Z)',
+	redo : '重複(Ctrl+Y)',
+	cut : '剪下(Ctrl+X)',
+	copy : '複製(Ctrl+C)',
+	paste : '貼上(Ctrl+V)',
+	plainpaste : '貼為純文字格式',
+	wordpaste : '自Word貼上',
+	selectall : '全選(Ctrl+A)',
+	justifyleft : '靠左對齊',
+	justifycenter : '置中',
+	justifyright : '靠右對齊',
+	justifyfull : '左右對齊',
+	insertorderedlist : '編號清單',
+	insertunorderedlist : '項目清單',
+	indent : '增加縮排',
+	outdent : '減少縮排',
+	subscript : '下標',
+	superscript : '上標',
+	formatblock : '標題',
+	fontname : '字體',
+	fontsize : '文字大小',
+	forecolor : '文字顏色',
+	hilitecolor : '背景顏色',
+	bold : '粗體(Ctrl+B)',
+	italic : '斜體(Ctrl+I)',
+	underline : '底線(Ctrl+U)',
+	strikethrough : '刪除線',
+	removeformat : '清除格式',
+	image : '影像',
+	multiimage : '批量影像上傳',
+	flash : 'Flash',
+	media : '多媒體',
+	table : '表格',
+	tablecell : '儲存格',
+	hr : '插入水平線',
+	emoticons : '插入表情',
+	link : '超連結',
+	unlink : '移除超連結',
+	fullscreen : '最大化',
+	about : '關於',
+	print : '列印(Ctrl+P)',
+	filemanager : '瀏覽伺服器',
+	code : '插入程式代碼',
+	map : 'Google地圖',
+	baidumap : 'Baidu地圖',
+	lineheight : '行距',
+	clearhtml : '清理HTML代碼',
+	pagebreak : '插入分頁符號',
+	quickformat : '快速排版',
+	insertfile : '插入文件',
+	template : '插入樣板',
+	anchor : '錨點',
+	yes : '確定',
+	no : '取消',
+	close : '關閉',
+	editImage : '影像屬性',
+	deleteImage : '刪除影像',
+	editFlash : 'Flash屬性',
+	deleteFlash : '删除Flash',
+	editMedia : '多媒體屬性',
+	deleteMedia : '删除多媒體',
+	editLink : '超連結屬性',
+	deleteLink : '移除超連結',
+	editAnchor : '锚点属性',
+	deleteAnchor : '删除锚点',
+	tableprop : '表格屬性',
+	tablecellprop : '儲存格屬性',
+	tableinsert : '插入表格',
+	tabledelete : '刪除表格',
+	tablecolinsertleft : '向左插入列',
+	tablecolinsertright : '向右插入列',
+	tablerowinsertabove : '向上插入欄',
+	tablerowinsertbelow : '下方插入欄',
+	tablerowmerge : '向下合併單元格',
+	tablecolmerge : '向右合併單元格',
+	tablerowsplit : '分割欄',
+	tablecolsplit : '分割列',
+	tablecoldelete : '删除列',
+	tablerowdelete : '删除欄',
+	noColor : '自動',
+	pleaseSelectFile : '請選擇文件。',
+	invalidImg : "請輸入有效的URL。\n只允許jpg,gif,bmp,png格式。",
+	invalidMedia : "請輸入有效的URL。\n只允許swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
+	invalidWidth : "寬度必須是數字。",
+	invalidHeight : "高度必須是數字。",
+	invalidBorder : "邊框必須是數字。",
+	invalidUrl : "請輸入有效的URL。",
+	invalidRows : '欄數是必須輸入項目,只允許輸入大於0的數字。',
+	invalidCols : '列數是必須輸入項目,只允許輸入大於0的數字。',
+	invalidPadding : '內距必須是數字。',
+	invalidSpacing : '間距必須是數字。',
+	invalidJson : '伺服器發生故障。',
+	uploadSuccess : '上傳成功。',
+	cutError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+X)完成。',
+	copyError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+C)完成。',
+	pasteError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+V)完成。',
+	ajaxLoading : '加載中,請稍候 ...',
+	uploadLoading : '上傳中,請稍候 ...',
+	uploadError : '上傳錯誤',
+	'plainpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。',
+	'wordpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'URL',
+	'link.linkType' : '打開類型',
+	'link.newWindow' : '新窗口',
+	'link.selfWindow' : '本頁窗口',
+	'flash.url' : 'URL',
+	'flash.width' : '寬度',
+	'flash.height' : '高度',
+	'flash.upload' : '上傳',
+	'flash.viewServer' : '瀏覽',
+	'media.url' : 'URL',
+	'media.width' : '寬度',
+	'media.height' : '高度',
+	'media.autostart' : '自動播放',
+	'media.upload' : '上傳',
+	'media.viewServer' : '瀏覽',
+	'image.remoteImage' : '網絡影像',
+	'image.localImage' : '上傳影像',
+	'image.remoteUrl' : '影像URL',
+	'image.localUrl' : '影像URL',
+	'image.size' : '影像大小',
+	'image.width' : '寬度',
+	'image.height' : '高度',
+	'image.resetSize' : '原始大小',
+	'image.align' : '對齊方式',
+	'image.defaultAlign' : '未設定',
+	'image.leftAlign' : '向左對齊',
+	'image.rightAlign' : '向右對齊',
+	'image.imgTitle' : '影像說明',
+	'image.upload' : '瀏覽...',
+	'image.viewServer' : '瀏覽...',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : '空文件夾',
+	'filemanager.moveup' : '至上一級文件夾',
+	'filemanager.viewType' : '顯示方式:',
+	'filemanager.viewImage' : '縮略圖',
+	'filemanager.listImage' : '詳細信息',
+	'filemanager.orderType' : '排序方式:',
+	'filemanager.fileName' : '名稱',
+	'filemanager.fileSize' : '大小',
+	'filemanager.fileType' : '類型',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '文件說明',
+	'insertfile.upload' : '上傳',
+	'insertfile.viewServer' : '瀏覽',
+	'table.cells' : '儲存格數',
+	'table.rows' : '欄數',
+	'table.cols' : '列數',
+	'table.size' : '表格大小',
+	'table.width' : '寬度',
+	'table.height' : '高度',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '內距間距',
+	'table.padding' : '內距',
+	'table.spacing' : '間距',
+	'table.align' : '對齊方式',
+	'table.textAlign' : '水平對齊',
+	'table.verticalAlign' : '垂直對齊',
+	'table.alignDefault' : '未設定',
+	'table.alignLeft' : '向左對齊',
+	'table.alignCenter' : '置中',
+	'table.alignRight' : '向右對齊',
+	'table.alignTop' : '靠上',
+	'table.alignMiddle' : '置中',
+	'table.alignBottom' : '靠下',
+	'table.alignBaseline' : '基線',
+	'table.border' : '表格邊框',
+	'table.borderWidth' : '邊框',
+	'table.borderColor' : '顏色',
+	'table.backgroundColor' : '背景顏色',
+	'map.address' : '住所: ',
+	'map.search' : '尋找',
+	'baidumap.address' : '住所: ',
+	'baidumap.search' : '尋找',
+	'baidumap.insertDynamicMap' : '插入動態地圖',
+	'anchor.name' : '錨點名稱',
+	'formatblock.formatBlock' : {
+		h1 : '標題 1',
+		h2 : '標題 2',
+		h3 : '標題 3',
+		h4 : '標題 4',
+		p : '一般'
+	},
+	'fontname.fontName' : {
+		'MingLiU' : '細明體',
+		'PMingLiU' : '新細明體',
+		'DFKai-SB' : '標楷體',
+		'SimSun' : '宋體',
+		'NSimSun' : '新宋體',
+		'FangSong' : '仿宋體',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '单倍行距'},
+		{'1.5' : '1.5倍行距'},
+		{'2' : '2倍行距'},
+		{'2.5' : '2.5倍行距'},
+		{'3' : '3倍行距'}
+	],
+	'template.selectTemplate' : '可選樣板',
+	'template.replaceContent' : '取代當前內容',
+	'template.fileList' : {
+		'1.html' : '影像和文字',
+		'2.html' : '表格',
+		'3.html' : '项目清單'
+	}
+}, 'zh-TW');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'zh-TW';
\ No newline at end of file
diff --git a/addons/nkeditor/assets/nkeditor.js b/addons/nkeditor/assets/nkeditor.js
new file mode 100644
index 0000000..911fc6f
--- /dev/null
+++ b/addons/nkeditor/assets/nkeditor.js
@@ -0,0 +1,9532 @@
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2018 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @website http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ * @version 5.0.3 (2018-10-25)
+ *******************************************************************************/
+(function (window, undefined) {
+    if (window.KindEditor) {
+        return;
+    }
+
+
+    if (!window.console) {
+        window.console = {};
+    }
+    if (!console.log) {
+        console.log = function () {
+        };
+    }
+    var _VERSION = '5.0.3 (2018-10-25)',
+        _ua = navigator.userAgent.toLowerCase(),
+        _IE = _ua.indexOf('msie') > -1 && _ua.indexOf('opera') == -1,
+        _NEWIE = _ua.indexOf('msie') == -1 && _ua.indexOf('trident') > -1,
+        _GECKO = _ua.indexOf('gecko') > -1 && _ua.indexOf('khtml') == -1,
+        _WEBKIT = _ua.indexOf('applewebkit') > -1,
+        _OPERA = _ua.indexOf('opera') > -1,
+        _MOBILE = _ua.indexOf('mobile') > -1,
+        _IOS = /ipad|iphone|ipod/.test(_ua),
+        _QUIRKS = document.compatMode != 'CSS1Compat',
+        _IERANGE = !window.getSelection,
+        _matches = /(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(_ua),
+        _V = _matches ? _matches[1] : '0',
+        _TIME = new Date().getTime();
+
+    function _isArray(val) {
+        if (!val) {
+            return false;
+        }
+        return Object.prototype.toString.call(val) === '[object Array]';
+    }
+
+    function _isFunction(val) {
+        if (!val) {
+            return false;
+        }
+        return Object.prototype.toString.call(val) === '[object Function]';
+    }
+
+    function _inArray(val, arr) {
+        for (var i = 0, len = arr.length; i < len; i++) {
+            if (val === arr[i]) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    function _each(obj, fn) {
+        if (_isArray(obj)) {
+            for (var i = 0, len = obj.length; i < len; i++) {
+                if (fn.call(obj[i], i, obj[i]) === false) {
+                    break;
+                }
+            }
+        } else {
+            for (var key in obj) {
+                if (obj.hasOwnProperty(key)) {
+                    if (fn.call(obj[key], key, obj[key]) === false) {
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    function _trim(str) {
+        return str.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, '');
+    }
+
+    function _inString(val, str, delimiter) {
+        delimiter = delimiter === undefined ? ',' : delimiter;
+        return (delimiter + str + delimiter).indexOf(delimiter + val + delimiter) >= 0;
+    }
+
+    function _addUnit(val, unit) {
+        unit = unit || 'px';
+        return val && /^-?\d+(?:\.\d+)?$/.test(val) ? val + unit : val;
+    }
+
+    function _removeUnit(val) {
+        var match;
+        return val && (match = /(\d+)/.exec(val)) ? parseInt(match[1], 10) : 0;
+    }
+
+    function _escape(val) {
+        return val.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
+    }
+
+    function _unescape(val) {
+        return val.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
+    }
+
+    function _toCamel(str) {
+        var arr = str.split('-');
+        str = '';
+        _each(arr, function (key, val) {
+            str += (key > 0) ? val.charAt(0).toUpperCase() + val.substr(1) : val;
+        });
+        return str;
+    }
+
+    function _toHex(val) {
+        function hex(d) {
+            var s = parseInt(d, 10).toString(16).toUpperCase();
+            return s.length > 1 ? s : '0' + s;
+        }
+
+        return val.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ig,
+            function ($0, $1, $2, $3) {
+                return '#' + hex($1) + hex($2) + hex($3);
+            }
+        );
+    }
+
+    function _toMap(val, delimiter) {
+        delimiter = delimiter === undefined ? ',' : delimiter;
+        var map = {}, arr = _isArray(val) ? val : val.split(delimiter), match;
+        _each(arr, function (key, val) {
+            if ((match = /^(\d+)\.\.(\d+)$/.exec(val))) {
+                for (var i = parseInt(match[1], 10); i <= parseInt(match[2], 10); i++) {
+                    map[i.toString()] = true;
+                }
+            } else {
+                map[val] = true;
+            }
+        });
+        return map;
+    }
+
+    function _toArray(obj, offset) {
+        return Array.prototype.slice.call(obj, offset || 0);
+    }
+
+    function _undef(val, defaultVal) {
+        return val === undefined ? defaultVal : val;
+    }
+
+    function _invalidUrl(url) {
+        return !url || /[<>"]/.test(url);
+    }
+
+    function _addParam(url, param) {
+        return url.indexOf('?') >= 0 ? url + '&' + param : url + '?' + param;
+    }
+
+    function _extend(child, parent, proto) {
+        if (!proto) {
+            proto = parent;
+            parent = null;
+        }
+        var childProto;
+        if (parent) {
+            var fn = function () {
+            };
+            fn.prototype = parent.prototype;
+            childProto = new fn();
+            _each(proto, function (key, val) {
+                childProto[key] = val;
+            });
+        } else {
+            childProto = proto;
+        }
+        childProto.constructor = child;
+        child.prototype = childProto;
+        child.parent = parent ? parent.prototype : null;
+    }
+
+
+    function _json(text) {
+        var match;
+        if ((match = /\{[\s\S]*\}|\[[\s\S]*\]/.exec(text))) {
+            text = match[0];
+        }
+        var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+        cx.lastIndex = 0;
+        if (cx.test(text)) {
+            text = text.replace(cx, function (a) {
+                return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+            });
+        }
+        if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+            return eval('(' + text + ')');
+        }
+        throw 'JSON parse error';
+    }
+
+
+    function _merge(distObj, obj) {
+        for (var name in distObj) {
+            obj[name] = distObj[name];
+        }
+        return obj;
+    }
+
+    var _round = Math.round;
+    var K = {
+        DEBUG: false,
+        VERSION: _VERSION,
+        IE: _IE,
+        GECKO: _GECKO,
+        WEBKIT: _WEBKIT,
+        OPERA: _OPERA,
+        V: _V,
+        TIME: _TIME,
+        each: _each,
+        isArray: _isArray,
+        isFunction: _isFunction,
+        inArray: _inArray,
+        inString: _inString,
+        trim: _trim,
+        addUnit: _addUnit,
+        removeUnit: _removeUnit,
+        escape: _escape,
+        unescape: _unescape,
+        toCamel: _toCamel,
+        toHex: _toHex,
+        toMap: _toMap,
+        toArray: _toArray,
+        undef: _undef,
+        invalidUrl: _invalidUrl,
+        addParam: _addParam,
+        extend: _extend,
+        merge: _merge,
+        json: _json
+    };
+    var _INLINE_TAG_MAP = _toMap('a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'),
+        _BLOCK_TAG_MAP = _toMap('address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul'),
+        _SINGLE_TAG_MAP = _toMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed'),
+        _STYLE_TAG_MAP = _toMap('b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u'),
+        _CONTROL_TAG_MAP = _toMap('img,table,input,textarea,button'),
+        _PRE_TAG_MAP = _toMap('pre,style,script'),
+        _NOSPLIT_TAG_MAP = _toMap('html,head,body,td,tr,table,ol,ul,li'),
+        _AUTOCLOSE_TAG_MAP = _toMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'),
+        _FILL_ATTR_MAP = _toMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'),
+        _VALUE_TAG_MAP = _toMap('input,button,textarea,select');
+
+
+    function _getBasePath() {
+        var els = document.getElementsByTagName('script'), src;
+        for (var i = 0, len = els.length; i < len; i++) {
+            src = els[i].src || '';
+            if (/NKeditor[\w\-\.]*\.js/i.test(src)) {
+                return src.substring(0, src.lastIndexOf('/') + 1);
+            }
+        }
+        return '';
+    }
+
+    K.basePath = _getBasePath();
+    K.options = {
+        designMode: true,
+        fullscreenMode: false,
+        filterMode: true,
+        wellFormatMode: true,
+        loadStyleMode: true,
+        basePath: K.basePath,
+        themesPath: K.basePath + 'themes/',
+        langPath: K.basePath + 'lang/',
+        pluginsPath: K.basePath + 'plugins/',
+        themeType: 'primary',
+        langType: 'zh-CN',
+        urlType: '',
+        newlineTag: 'p',
+        resizeType: 2,
+        syncType: 'form',
+        pasteType: 2,
+        dialogAlignType: 'page',
+        useContextmenu: true,
+        fullscreenShortcut: false,
+        bodyClass: 'ke-content',
+        indentChar: '\t',
+        cssPath: [],
+        jsPath: [],
+        showHelpGrid: false,
+        cssData: '',
+        minWidth: 650,
+        minHeight: 300,
+        minChangeSize: 50,
+        zIndex: 811213,
+        items: [
+            'source', 'undo', 'redo', 'preview', 'print', 'template', 'code', 'quote', 'cut', 'copy', 'paste',
+            'plainpaste', 'wordpaste', 'justifyleft', 'justifycenter', 'justifyright',
+            'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
+            'superscript', 'clearhtml', 'quickformat', 'selectall',
+            'formatblock', 'fontname', 'fontsize', 'forecolor', 'hilitecolor', 'bold',
+            'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', 'image', 'multiimage', 'graft',
+            'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
+            'anchor', 'link', 'unlink', 'about', 'fullscreen'
+        ],
+        noDisableItems: ['source', 'fullscreen'],
+        colorTable: [
+            ['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
+            ['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
+            ['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
+            ['#FFFFFF', '#DDDDDD', '#999999', '#666666', '#333333', '#000000']
+        ],
+        fontSizeTable: ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px'],
+        htmlTags: {
+            font: ['id', 'class', 'color', 'size', 'face', '.background-color'],
+            span: [
+                'id', 'class', '.color', '.background-color', '.font-size', '.font-family', '.background',
+                '.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.line-height'
+            ],
+            div: [
+                'id', 'class', 'align', '.border', '.margin', '.padding', '.text-align', '.color',
+                '.background-color', '.font-size', '.font-family', '.font-weight', '.background',
+                '.font-style', '.text-decoration', '.vertical-align', '.margin-left'
+            ],
+            table: [
+                'id', 'class', 'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', 'bordercolor',
+                '.padding', '.margin', '.border', 'bgcolor', '.text-align', '.color', '.background-color',
+                '.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.background',
+                '.width', '.height', '.border-collapse'
+            ],
+            'td,th': [
+                'id', 'class', 'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor',
+                '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight',
+                '.font-style', '.text-decoration', '.vertical-align', '.background', '.border'
+            ],
+            a: ['id', 'class', 'href', 'target', 'name'],
+            embed: ['id', 'class', 'src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess', 'wmode', 'controls'],
+            img: ['id', 'class', 'src', 'width', 'height', 'border', 'alt', 'title', 'align', '.width', '.height', '.border'],
+            'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6': [
+                'id', 'class', 'align', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.background',
+                '.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.text-indent', '.margin-left'
+            ],
+            pre: ['id', 'class'],
+            hr: ['id', 'class', '.page-break-after'],
+            'br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del': ['id', 'class'],
+            iframe: ['id', 'class', 'src', 'frameborder', 'width', 'height', '.width', '.height']
+        },
+        layout: '<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>',
+        afterBlur: function () {
+            this.sync();
+        },
+        errorMsgHandler: function (message, type) {
+            console.log(message);
+            console.log(type);
+            alert(message);
+        },
+        dialogOffset: 0,
+        allowUploadGraft: true,
+        resLoadCache: {},
+        tableBorderColor: '#cccccc',
+    };
+
+
+    var _useCapture = false;
+
+
+    var _INPUT_KEY_MAP = _toMap('8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222');
+
+    var _CURSORMOVE_KEY_MAP = _toMap('33..40');
+
+    var _CHANGE_KEY_MAP = {};
+    _each(_INPUT_KEY_MAP, function (key, val) {
+        _CHANGE_KEY_MAP[key] = val;
+    });
+    _each(_CURSORMOVE_KEY_MAP, function (key, val) {
+        _CHANGE_KEY_MAP[key] = val;
+    });
+
+
+    function _bindEvent(el, type, fn) {
+        if (el.addEventListener) {
+            el.addEventListener(type, fn, _useCapture);
+        } else if (el.attachEvent) {
+            el.attachEvent('on' + type, fn);
+        }
+    }
+
+    function _unbindEvent(el, type, fn) {
+        if (el.removeEventListener) {
+            el.removeEventListener(type, fn, _useCapture);
+        } else if (el.detachEvent) {
+            el.detachEvent('on' + type, fn);
+        }
+    }
+
+    var _EVENT_PROPS = ('altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,' +
+        'data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,' +
+        'pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which').split(',');
+
+
+    function KEvent(el, event) {
+        this.init(el, event);
+    }
+
+    _extend(KEvent, {
+        init: function (el, event) {
+            var self = this, doc = el.ownerDocument || el.document || el;
+            self.event = event;
+            _each(_EVENT_PROPS, function (key, val) {
+                self[val] = event[val];
+            });
+            if (!self.target) {
+                self.target = self.srcElement || doc;
+            }
+            if (self.target.nodeType === 3) {
+                self.target = self.target.parentNode;
+            }
+            if (!self.relatedTarget && self.fromElement) {
+                self.relatedTarget = self.fromElement === self.target ? self.toElement : self.fromElement;
+            }
+            if (self.pageX == null && self.clientX != null) {
+                var d = doc.documentElement, body = doc.body;
+                self.pageX = self.clientX + (d && d.scrollLeft || body && body.scrollLeft || 0) - (d && d.clientLeft || body && body.clientLeft || 0);
+                self.pageY = self.clientY + (d && d.scrollTop || body && body.scrollTop || 0) - (d && d.clientTop || body && body.clientTop || 0);
+            }
+            if (!self.which && ((self.charCode || self.charCode === 0) ? self.charCode : self.keyCode)) {
+                self.which = self.charCode || self.keyCode;
+            }
+            if (!self.metaKey && self.ctrlKey) {
+                self.metaKey = self.ctrlKey;
+            }
+            if (!self.which && self.button !== undefined) {
+                self.which = (self.button & 1 ? 1 : (self.button & 2 ? 3 : (self.button & 4 ? 2 : 0)));
+            }
+            switch (self.which) {
+                case 186 :
+                    self.which = 59;
+                    break;
+                case 187 :
+                case 107 :
+                case 43 :
+                    self.which = 61;
+                    break;
+                case 189 :
+                case 45 :
+                    self.which = 109;
+                    break;
+                case 42 :
+                    self.which = 106;
+                    break;
+                case 47 :
+                    self.which = 111;
+                    break;
+                case 78 :
+                    self.which = 110;
+                    break;
+            }
+            if (self.which >= 96 && self.which <= 105) {
+                self.which -= 48;
+            }
+        },
+        preventDefault: function () {
+            var ev = this.event;
+            if (ev.preventDefault) {
+                ev.preventDefault();
+            } else {
+                ev.returnValue = false;
+            }
+        },
+        stopPropagation: function () {
+            var ev = this.event;
+            if (ev.stopPropagation) {
+                ev.stopPropagation();
+            } else {
+                ev.cancelBubble = true;
+            }
+        },
+        stop: function () {
+            this.preventDefault();
+            this.stopPropagation();
+        }
+    });
+    var _eventExpendo = 'kindeditor_' + _TIME, _eventId = 0, _eventData = {};
+
+    function _getId(el) {
+        return el[_eventExpendo] || null;
+    }
+
+    function _setId(el) {
+        el[_eventExpendo] = ++_eventId;
+        return _eventId;
+    }
+
+    function _removeId(el) {
+        try {
+            delete el[_eventExpendo];
+        } catch (e) {
+            if (el.removeAttribute) {
+                el.removeAttribute(_eventExpendo);
+            }
+        }
+    }
+
+    function _bind(el, type, fn) {
+        if (type.indexOf(',') >= 0) {
+            _each(type.split(','), function () {
+                _bind(el, this, fn);
+            });
+            return;
+        }
+        var id = _getId(el);
+        if (!id) {
+            id = _setId(el);
+        }
+        if (_eventData[id] === undefined) {
+            _eventData[id] = {};
+        }
+        var events = _eventData[id][type];
+        if (events && events.length > 0) {
+            _unbindEvent(el, type, events[0]);
+        } else {
+            _eventData[id][type] = [];
+            _eventData[id].el = el;
+        }
+        events = _eventData[id][type];
+        if (events.length === 0) {
+            events[0] = function (e) {
+                var kevent = e ? new KEvent(el, e) : undefined;
+                _each(events, function (i, event) {
+                    if (i > 0 && event) {
+                        event.call(el, kevent);
+                    }
+                });
+            };
+        }
+        if (_inArray(fn, events) < 0) {
+            events.push(fn);
+        }
+        _bindEvent(el, type, events[0]);
+    }
+
+    function _unbind(el, type, fn) {
+        if (type && type.indexOf(',') >= 0) {
+            _each(type.split(','), function () {
+                _unbind(el, this, fn);
+            });
+            return;
+        }
+        var id = _getId(el);
+        if (!id) {
+            return;
+        }
+        if (type === undefined) {
+            if (id in _eventData) {
+                _each(_eventData[id], function (key, events) {
+                    if (key != 'el' && events.length > 0) {
+                        _unbindEvent(el, key, events[0]);
+                    }
+                });
+                delete _eventData[id];
+                _removeId(el);
+            }
+            return;
+        }
+        if (!_eventData[id]) {
+            return;
+        }
+        var events = _eventData[id][type];
+        if (events && events.length > 0) {
+            if (fn === undefined) {
+                _unbindEvent(el, type, events[0]);
+                delete _eventData[id][type];
+            } else {
+                _each(events, function (i, event) {
+                    if (i > 0 && event === fn) {
+                        events.splice(i, 1);
+                    }
+                });
+                if (events.length == 1) {
+                    _unbindEvent(el, type, events[0]);
+                    delete _eventData[id][type];
+                }
+            }
+            var count = 0;
+            _each(_eventData[id], function () {
+                count++;
+            });
+            if (count < 2) {
+                delete _eventData[id];
+                _removeId(el);
+            }
+        }
+    }
+
+    function _fire(el, type) {
+        if (type.indexOf(',') >= 0) {
+            _each(type.split(','), function () {
+                _fire(el, this);
+            });
+            return;
+        }
+        var id = _getId(el);
+        if (!id) {
+            return;
+        }
+        var events = _eventData[id][type];
+        if (_eventData[id] && events && events.length > 0) {
+            events[0]();
+        }
+    }
+
+    function _ctrl(el, key, fn) {
+        var self = this;
+        key = /^\d{2,}$/.test(key) ? key : key.toUpperCase().charCodeAt(0);
+        _bind(el, 'keydown', function (e) {
+            if (e.ctrlKey && e.which == key && !e.shiftKey && !e.altKey) {
+                fn.call(el);
+                e.stop();
+            }
+        });
+    }
+
+    var _readyFinished = false;
+
+    function _ready(fn) {
+        if (_readyFinished) {
+            fn(KindEditor);
+            return;
+        }
+        var loaded = false;
+
+        function readyFunc() {
+            if (!loaded) {
+                loaded = true;
+                fn(KindEditor);
+                _readyFinished = true;
+            }
+        }
+
+        function ieReadyFunc() {
+            if (!loaded) {
+                try {
+                    document.documentElement.doScroll('left');
+                } catch (e) {
+                    setTimeout(ieReadyFunc, 100);
+                    return;
+                }
+                readyFunc();
+            }
+        }
+
+        function ieReadyStateFunc() {
+            if (document.readyState === 'complete') {
+                readyFunc();
+            }
+        }
+
+        if (document.addEventListener) {
+            _bind(document, 'DOMContentLoaded', readyFunc);
+        } else if (document.attachEvent) {
+            _bind(document, 'readystatechange', ieReadyStateFunc);
+            var toplevel = false;
+            try {
+                toplevel = window.frameElement == null;
+            } catch (e) {
+            }
+            if (document.documentElement.doScroll && toplevel) {
+                ieReadyFunc();
+            }
+        }
+        _bind(window, 'load', readyFunc);
+    }
+
+    if (window.attachEvent) {
+        window.attachEvent('onunload', function () {
+            _each(_eventData, function (key, events) {
+                if (events.el) {
+                    _unbind(events.el);
+                }
+            });
+        });
+    }
+    K.ctrl = _ctrl;
+    K.ready = _ready;
+
+    function _getCssList(css) {
+        css = css.replace(/&quot;/g, '"');
+        var list = {},
+            reg = /\s*([\w\-]+)\s*:([^;]*)(;|$)/g,
+            match;
+        while ((match = reg.exec(css))) {
+            var key = _trim(match[1].toLowerCase()),
+                val = _trim(_toHex(match[2]));
+            list[key] = val;
+        }
+        return list;
+    }
+
+    function _getAttrList(tag) {
+        var list = {},
+            reg = /\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,
+            match;
+        while ((match = reg.exec(tag))) {
+            var key = (match[1] || match[2] || match[4] || match[6]).toLowerCase(),
+                val = (match[2] ? match[3] : (match[4] ? match[5] : match[7])) || '';
+            list[key] = val;
+        }
+        return list;
+    }
+
+    function _addClassToTag(tag, className) {
+        if (/\s+class\s*=/.test(tag)) {
+            tag = tag.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/, function ($0, $1, $2, $3) {
+                if ((' ' + $2 + ' ').indexOf(' ' + className + ' ') < 0) {
+                    return $2 === '' ? $1 + className + $3 : $1 + $2 + ' ' + className + $3;
+                } else {
+                    return $0;
+                }
+            });
+        } else {
+            tag = tag.substr(0, tag.length - 1) + ' class="' + className + '">';
+        }
+        return tag;
+    }
+
+    function _formatCss(css) {
+        var str = '';
+        _each(_getCssList(css), function (key, val) {
+            str += key + ':' + val + ';';
+        });
+        return str;
+    }
+
+    function _formatUrl(url, mode, host, pathname) {
+        mode = _undef(mode, '').toLowerCase();
+        if (url.substr(0, 5) != 'data:') {
+            url = url.replace(/([^:])\/\//g, '$1/');
+        }
+        if (_inArray(mode, ['absolute', 'relative', 'domain']) < 0) {
+            return url;
+        }
+        host = host || location.protocol + '//' + location.host;
+        if (pathname === undefined) {
+            var m = location.pathname.match(/^(\/.*)\//);
+            pathname = m ? m[1] : '';
+        }
+        if (/^\w+:/.test(url)) {
+            return url;
+        }
+        var match;
+        if ((match = /^(\w+:\/\/[^\/]*)/.exec(url))) {
+            if (match[1] !== host) {
+                return url;
+            }
+        }
+
+        function getRealPath(path) {
+            var parts = path.split('/'), paths = [];
+            for (var i = 0, len = parts.length; i < len; i++) {
+                var part = parts[i];
+                if (part == '..') {
+                    if (paths.length > 0) {
+                        paths.pop();
+                    }
+                } else if (part !== '' && part != '.') {
+                    paths.push(part);
+                }
+            }
+            return '/' + paths.join('/');
+        }
+
+        if (/^\//.test(url)) {
+            url = host + getRealPath(url.substr(1));
+        } else if (!/^\w+:\/\//.test(url)) {
+            url = host + getRealPath(pathname + '/' + url);
+        }
+
+        function getRelativePath(path, depth) {
+            if (url.substr(0, path.length) === path) {
+                var arr = [];
+                for (var i = 0; i < depth; i++) {
+                    arr.push('..');
+                }
+                var prefix = '.';
+                if (arr.length > 0) {
+                    prefix += '/' + arr.join('/');
+                }
+                if (pathname == '/') {
+                    prefix += '/';
+                }
+                return prefix + url.substr(path.length);
+            } else {
+                if ((match = /^(.*)\//.exec(path))) {
+                    return getRelativePath(match[1], ++depth);
+                }
+            }
+        }
+
+        if (mode === 'relative') {
+            url = getRelativePath(host + pathname, 0).substr(2);
+        } else if (mode === 'absolute') {
+            if (url.substr(0, host.length) === host) {
+                url = url.substr(host.length);
+            }
+        }
+        return url;
+    }
+
+    function _formatHtml(html, htmlTags, urlType, wellFormatted, indentChar) {
+        if (html == null) {
+            html = '';
+        }
+        urlType = urlType || '';
+        wellFormatted = _undef(wellFormatted, false);
+        indentChar = _undef(indentChar, '\t');
+        var fontSizeList = 'xx-small,x-small,small,medium,large,x-large,xx-large'.split(',');
+        html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function ($0, $1, $2, $3) {
+            return $1 + $2.replace(/<(?:br|br\s[^>]*)>/ig, '\n') + $3;
+        });
+        html = html.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/ig, '</p>');
+        html = html.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig, '$1<br />$2');
+        html = html.replace(/\u200B/g, '');
+        html = html.replace(/\u00A9/g, '&copy;');
+        html = html.replace(/\u00AE/g, '&reg;');
+        html = html.replace(/\u2003/g, '&emsp;');
+        html = html.replace(/\u3000/g, '&emsp;');
+        html = html.replace(/<[^>]+/g, function ($0) {
+            return $0.replace(/\s+/g, ' ');
+        });
+        var htmlTagMap = {};
+        if (htmlTags) {
+            _each(htmlTags, function (key, val) {
+                var arr = key.split(',');
+                for (var i = 0, len = arr.length; i < len; i++) {
+                    htmlTagMap[arr[i]] = _toMap(val);
+                }
+            });
+            if (!htmlTagMap.script) {
+                html = html.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/ig, '');
+            }
+            if (!htmlTagMap.style) {
+                html = html.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/ig, '');
+            }
+        }
+        var re = /(\s*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>(\s*)/g;
+        var tagStack = [];
+        html = html.replace(re, function ($0, $1, $2, $3, $4, $5, $6) {
+            var full = $0,
+                startNewline = $1 || '',
+                startSlash = $2 || '',
+                tagName = $3.toLowerCase(),
+                attr = $4 || '',
+                endSlash = $5 ? ' ' + $5 : '',
+                endNewline = $6 || '';
+            if (tagName == 'code') {
+                return full;
+            }
+            if (htmlTags && !htmlTagMap[tagName]) {
+                return '';
+            }
+            if (endSlash === '' && _SINGLE_TAG_MAP[tagName]) {
+                endSlash = ' /';
+            }
+            if (_INLINE_TAG_MAP[tagName]) {
+                if (startNewline) {
+                    startNewline = ' ';
+                }
+                if (endNewline) {
+                    endNewline = ' ';
+                }
+            }
+            if (_PRE_TAG_MAP[tagName]) {
+                if (startSlash) {
+                    endNewline = '\n';
+                } else {
+                    startNewline = '\n';
+                }
+            }
+            if (wellFormatted && tagName == 'br') {
+                endNewline = '\n';
+            }
+            if (_BLOCK_TAG_MAP[tagName] && !_PRE_TAG_MAP[tagName]) {
+                if (wellFormatted) {
+                    if (startSlash && tagStack.length > 0 && tagStack[tagStack.length - 1] === tagName) {
+                        tagStack.pop();
+                    } else {
+                        tagStack.push(tagName);
+                    }
+                    startNewline = '\n';
+                    endNewline = '\n';
+                    for (var i = 0, len = startSlash ? tagStack.length : tagStack.length - 1; i < len; i++) {
+                        startNewline += indentChar;
+                        if (!startSlash) {
+                            endNewline += indentChar;
+                        }
+                    }
+                    if (endSlash) {
+                        tagStack.pop();
+                    } else if (!startSlash) {
+                        endNewline += indentChar;
+                    }
+                } else {
+                    startNewline = endNewline = '';
+                }
+            }
+            if (attr !== '') {
+                var attrMap = _getAttrList(full);
+                if (tagName === 'font') {
+                    var fontStyleMap = {}, fontStyle = '';
+                    _each(attrMap, function (key, val) {
+                        if (key === 'color') {
+                            fontStyleMap.color = val;
+                            delete attrMap[key];
+                        }
+                        if (key === 'size') {
+                            fontStyleMap['font-size'] = fontSizeList[parseInt(val, 10) - 1] || '';
+                            delete attrMap[key];
+                        }
+                        if (key === 'face') {
+                            fontStyleMap['font-family'] = val;
+                            delete attrMap[key];
+                        }
+                        if (key === 'style') {
+                            fontStyle = val;
+                        }
+                    });
+                    if (fontStyle && !/;$/.test(fontStyle)) {
+                        fontStyle += ';';
+                    }
+                    _each(fontStyleMap, function (key, val) {
+                        if (val === '') {
+                            return;
+                        }
+                        if (/\s/.test(val)) {
+                            val = "'" + val + "'";
+                        }
+                        fontStyle += key + ':' + val + ';';
+                    });
+                    attrMap.style = fontStyle;
+                }
+                _each(attrMap, function (key, val) {
+                    if (_FILL_ATTR_MAP[key]) {
+                        attrMap[key] = key;
+                    }
+                    if (_inArray(key, ['src', 'href']) >= 0) {
+                        attrMap[key] = _formatUrl(val, urlType);
+                    }
+                    if (htmlTags && key !== 'style' && !htmlTagMap[tagName]['*'] && !htmlTagMap[tagName][key] ||
+                        tagName === 'body' && key === 'contenteditable' ||
+                        /^kindeditor_\d+$/.test(key)) {
+                        delete attrMap[key];
+                    }
+                    if (key === 'style' && val !== '') {
+                        var styleMap = _getCssList(val);
+                        _each(styleMap, function (k, v) {
+                            if (htmlTags && !htmlTagMap[tagName].style && !htmlTagMap[tagName]['.' + k]) {
+                                delete styleMap[k];
+                            }
+                        });
+                        var style = '';
+                        _each(styleMap, function (k, v) {
+                            style += k + ':' + v + ';';
+                        });
+                        attrMap.style = style;
+                    }
+                });
+                attr = '';
+                _each(attrMap, function (key, val) {
+                    if (key === 'style' && val === '') {
+                        return;
+                    }
+                    val = val.replace(/"/g, '&quot;');
+                    attr += ' ' + key + '="' + val + '"';
+                });
+            }
+            if (tagName === 'font') {
+                tagName = 'span';
+            }
+            return startNewline + '<' + startSlash + tagName + attr + endSlash + '>' + endNewline;
+        });
+        html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function ($0, $1, $2, $3) {
+            return $1 + $2.replace(/\n/g, '<span id="__kindeditor_pre_newline__">\n') + $3;
+        });
+        html = html.replace(/\n\s*\n/g, '\n');
+        html = html.replace(/<span id="__kindeditor_pre_newline__">\n/g, '\n');
+        return _trim(html);
+    }
+
+    function _clearMsWord(html, htmlTags) {
+        html = html.replace(/<meta[\s\S]*?>/ig, '')
+            .replace(/<![\s\S]*?>/ig, '')
+            .replace(/<style[^>]*>[\s\S]*?<\/style>/ig, '')
+            .replace(/<script[^>]*>[\s\S]*?<\/script>/ig, '')
+            .replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/ig, '')
+            .replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/ig, '')
+            .replace(/<xml>[\s\S]*?<\/xml>/ig, '')
+            .replace(/<(?:table|td)[^>]*>/ig, function (full) {
+                return full.replace(/border-bottom:([#\w\s]+)/ig, 'border:$1');
+            });
+        return _formatHtml(html, htmlTags);
+    }
+
+    function _mediaType(src) {
+        if (/\.(rm|rmvb)(\?|$)/i.test(src)) {
+            return 'audio/x-pn-realaudio-plugin';
+        }
+        if (/\.(mp4)(\?|$)/i.test(src)) {
+            return 'video/mpeg4';
+        }
+        if (/\.(swf|flv)(\?|$)/i.test(src)) {
+            return 'application/x-shockwave-flash';
+        }
+        return 'video/x-ms-asf-plugin';
+    }
+
+    function _mediaClass(type) {
+        if (/realaudio/i.test(type)) {
+            return 'ke-rm';
+        }
+        if (/flash/i.test(type)) {
+            return 'ke-flash';
+        }
+        return 'ke-media';
+    }
+
+    function _mediaAttrs(srcTag) {
+        return _getAttrList(unescape(srcTag));
+    }
+
+    function _mediaEmbed(attrs) {
+        var type = attrs.type == 'video/mpeg4' ? 'video' : 'embed';
+        if (type == 'video') {
+            attrs.controls = "controls";
+        }
+        var html = '<' + type + ' ';
+        _each(attrs, function (key, val) {
+            html += key + '="' + val + '" ';
+        });
+        html += '/>';
+        return html;
+    }
+
+    function _mediaImg(blankPath, attrs) {
+        var width = attrs.width,
+            height = attrs.height,
+            type = attrs.type || _mediaType(attrs.src),
+            srcTag = _mediaEmbed(attrs),
+            style = '';
+        if (/\D/.test(width)) {
+            style += 'width:' + width + ';';
+        } else if (width > 0) {
+            style += 'width:' + width + 'px;';
+        }
+        if (/\D/.test(height)) {
+            style += 'height:' + height + ';';
+        } else if (height > 0) {
+            style += 'height:' + height + 'px;';
+        }
+        var html = '<img class="' + _mediaClass(type) + '" src="' + blankPath + '" ';
+        if (style !== '') {
+            html += 'style="' + style + '" ';
+        }
+        html += 'data-ke-tag="' + escape(srcTag) + '" alt="" />';
+        return html;
+    }
+
+
+    function _tmpl(str, data) {
+        var fn = new Function("obj",
+            "var p=[],print=function(){p.push.apply(p,arguments);};" +
+            "with(obj){p.push('" +
+            str.replace(/[\r\t\n]/g, " ")
+                .split("<%").join("\t")
+                .replace(/((^|%>)[^\t]*)'/g, "$1\r")
+                .replace(/\t=(.*?)%>/g, "',$1,'")
+                .split("\t").join("');")
+                .split("%>").join("p.push('")
+                .split("\r").join("\\'") + "');}return p.join('');");
+        return data ? fn(data) : fn;
+    }
+
+    K.formatUrl = _formatUrl;
+    K.formatHtml = _formatHtml;
+    K.getCssList = _getCssList;
+    K.getAttrList = _getAttrList;
+    K.mediaType = _mediaType;
+    K.mediaAttrs = _mediaAttrs;
+    K.mediaEmbed = _mediaEmbed;
+    K.mediaImg = _mediaImg;
+    K.clearMsWord = _clearMsWord;
+    K.tmpl = _tmpl;
+
+
+    function _contains(nodeA, nodeB) {
+        if (nodeA.nodeType == 9 && nodeB.nodeType != 9) {
+            return true;
+        }
+        while ((nodeB = nodeB.parentNode)) {
+            if (nodeB == nodeA) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    var _getSetAttrDiv = document.createElement('div');
+    _getSetAttrDiv.setAttribute('className', 't');
+    var _GET_SET_ATTRIBUTE = _getSetAttrDiv.className !== 't';
+
+    function _getAttr(el, key) {
+        key = key.toLowerCase();
+        var val = null;
+        if (!_GET_SET_ATTRIBUTE && el.nodeName.toLowerCase() != 'script') {
+            var div = el.ownerDocument.createElement('div');
+            div.appendChild(el.cloneNode(false));
+            var list = _getAttrList(_unescape(div.innerHTML));
+            if (key in list) {
+                val = list[key];
+            }
+        } else {
+            try {
+                val = el.getAttribute(key, 2);
+            } catch (e) {
+                val = el.getAttribute(key, 1);
+            }
+        }
+        if (key === 'style' && val !== null) {
+            val = _formatCss(val);
+        }
+        return val;
+    }
+
+    function _queryAll(expr, root) {
+        var exprList = expr.split(',');
+        if (exprList.length > 1) {
+            var mergedResults = [];
+            _each(exprList, function () {
+                _each(_queryAll(this, root), function () {
+                    if (_inArray(this, mergedResults) < 0) {
+                        mergedResults.push(this);
+                    }
+                });
+            });
+            return mergedResults;
+        }
+        root = root || document;
+
+        function escape(str) {
+            if (typeof str != 'string') {
+                return str;
+            }
+            return str.replace(/([^\w\-])/g, '\\$1');
+        }
+
+        function stripslashes(str) {
+            return str.replace(/\\/g, '');
+        }
+
+        function cmpTag(tagA, tagB) {
+            return tagA === '*' || tagA.toLowerCase() === escape(tagB.toLowerCase());
+        }
+
+        function byId(id, tag, root) {
+            var arr = [],
+                doc = root.ownerDocument || root,
+                el = doc.getElementById(stripslashes(id));
+            if (el) {
+                if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
+                    arr.push(el);
+                }
+            }
+            return arr;
+        }
+
+        function byClass(className, tag, root) {
+            var doc = root.ownerDocument || root, arr = [], els, i, len, el;
+            if (root.getElementsByClassName) {
+                els = root.getElementsByClassName(stripslashes(className));
+                for (i = 0, len = els.length; i < len; i++) {
+                    el = els[i];
+                    if (cmpTag(tag, el.nodeName)) {
+                        arr.push(el);
+                    }
+                }
+            } else if (doc.querySelectorAll) {
+                els = doc.querySelectorAll((root.nodeName !== '#document' ? root.nodeName + ' ' : '') + tag + '.' + className);
+                for (i = 0, len = els.length; i < len; i++) {
+                    el = els[i];
+                    if (_contains(root, el)) {
+                        arr.push(el);
+                    }
+                }
+            } else {
+                els = root.getElementsByTagName(tag);
+                className = ' ' + className + ' ';
+                for (i = 0, len = els.length; i < len; i++) {
+                    el = els[i];
+                    if (el.nodeType == 1) {
+                        var cls = el.className;
+                        if (cls && (' ' + cls + ' ').indexOf(className) > -1) {
+                            arr.push(el);
+                        }
+                    }
+                }
+            }
+            return arr;
+        }
+
+        function byName(name, tag, root) {
+            var arr = [], doc = root.ownerDocument || root,
+                els = doc.getElementsByName(stripslashes(name)), el;
+            for (var i = 0, len = els.length; i < len; i++) {
+                el = els[i];
+                if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
+                    if (el.getAttribute('name') !== null) {
+                        arr.push(el);
+                    }
+                }
+            }
+            return arr;
+        }
+
+        function byAttr(key, val, tag, root) {
+            var arr = [], els = root.getElementsByTagName(tag), el;
+            for (var i = 0, len = els.length; i < len; i++) {
+                el = els[i];
+                if (el.nodeType == 1) {
+                    if (val === null) {
+                        if (_getAttr(el, key) !== null) {
+                            arr.push(el);
+                        }
+                    } else {
+                        if (val === escape(_getAttr(el, key))) {
+                            arr.push(el);
+                        }
+                    }
+                }
+            }
+            return arr;
+        }
+
+        function select(expr, root) {
+            var arr = [], matches;
+            matches = /^((?:\\.|[^.#\s\[<>])+)/.exec(expr);
+            var tag = matches ? matches[1] : '*';
+            if ((matches = /#((?:[\w\-]|\\.)+)$/.exec(expr))) {
+                arr = byId(matches[1], tag, root);
+            } else if ((matches = /\.((?:[\w\-]|\\.)+)$/.exec(expr))) {
+                arr = byClass(matches[1], tag, root);
+            } else if ((matches = /\[((?:[\w\-]|\\.)+)\]/.exec(expr))) {
+                arr = byAttr(matches[1].toLowerCase(), null, tag, root);
+            } else if ((matches = /\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(expr))) {
+                var key = matches[1].toLowerCase(), val = matches[2];
+                if (key === 'id') {
+                    arr = byId(val, tag, root);
+                } else if (key === 'class') {
+                    arr = byClass(val, tag, root);
+                } else if (key === 'name') {
+                    arr = byName(val, tag, root);
+                } else {
+                    arr = byAttr(key, val, tag, root);
+                }
+            } else {
+                var els = root.getElementsByTagName(tag), el;
+                for (var i = 0, len = els.length; i < len; i++) {
+                    el = els[i];
+                    if (el.nodeType == 1) {
+                        arr.push(el);
+                    }
+                }
+            }
+            return arr;
+        }
+
+        var parts = [], arr, re = /((?:\\.|[^\s>])+|[\s>])/g;
+        while ((arr = re.exec(expr))) {
+            if (arr[1] !== ' ') {
+                parts.push(arr[1]);
+            }
+        }
+        var results = [];
+        if (parts.length == 1) {
+            return select(parts[0], root);
+        }
+        var isChild = false, part, els, subResults, val, v, i, j, k, length, len, l;
+        for (i = 0, lenth = parts.length; i < lenth; i++) {
+            part = parts[i];
+            if (part === '>') {
+                isChild = true;
+                continue;
+            }
+            if (i > 0) {
+                els = [];
+                for (j = 0, len = results.length; j < len; j++) {
+                    val = results[j];
+                    subResults = select(part, val);
+                    for (k = 0, l = subResults.length; k < l; k++) {
+                        v = subResults[k];
+                        if (isChild) {
+                            if (val === v.parentNode) {
+                                els.push(v);
+                            }
+                        } else {
+                            els.push(v);
+                        }
+                    }
+                }
+                results = els;
+            } else {
+                results = select(part, root);
+            }
+            if (results.length === 0) {
+                return [];
+            }
+        }
+        return results;
+    }
+
+    function _query(expr, root) {
+        var arr = _queryAll(expr, root);
+        return arr.length > 0 ? arr[0] : null;
+    }
+
+    K.query = _query;
+    K.queryAll = _queryAll;
+
+
+    function _get(val) {
+        return K(val)[0];
+    }
+
+    function _getDoc(node) {
+        if (!node) {
+            return document;
+        }
+        return node.ownerDocument || node.document || node;
+    }
+
+    function _getWin(node) {
+        if (!node) {
+            return window;
+        }
+        var doc = _getDoc(node);
+        return doc.parentWindow || doc.defaultView;
+    }
+
+    function _setHtml(el, html) {
+        if (el.nodeType != 1) {
+            return;
+        }
+        var doc = _getDoc(el);
+        try {
+            el.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + html;
+            var temp = doc.getElementById('__kindeditor_temp_tag__');
+            temp.parentNode.removeChild(temp);
+        } catch (e) {
+            K(el).empty();
+            K('@' + html, doc).each(function () {
+                el.appendChild(this);
+            });
+        }
+    }
+
+    function _hasClass(el, cls) {
+        return _inString(cls, el.className, ' ');
+    }
+
+    function _setAttr(el, key, val) {
+        if (_IE && _V < 8 && key.toLowerCase() == 'class') {
+            key = 'className';
+        }
+        el.setAttribute(key, '' + val);
+    }
+
+    function _removeAttr(el, key) {
+        if (_IE && _V < 8 && key.toLowerCase() == 'class') {
+            key = 'className';
+        }
+        _setAttr(el, key, '');
+        el.removeAttribute(key);
+    }
+
+    function _getNodeName(node) {
+        if (!node || !node.nodeName) {
+            return '';
+        }
+        return node.nodeName.toLowerCase();
+    }
+
+    function _computedCss(el, key) {
+        var self = this, win = _getWin(el), camelKey = _toCamel(key), val = '';
+        if (win.getComputedStyle) {
+            var style = win.getComputedStyle(el, null);
+            val = style[camelKey] || style.getPropertyValue(key) || el.style[camelKey];
+        } else if (el.currentStyle) {
+            val = el.currentStyle[camelKey] || el.style[camelKey];
+        }
+        return val;
+    }
+
+    function _hasVal(node) {
+        return !!_VALUE_TAG_MAP[_getNodeName(node)];
+    }
+
+    function _docElement(doc) {
+        doc = doc || document;
+        return _QUIRKS ? doc.body : doc.documentElement;
+    }
+
+    function _docHeight(doc) {
+        var el = _docElement(doc);
+        return Math.max(el.scrollHeight, el.clientHeight);
+    }
+
+    function _docWidth(doc) {
+        var el = _docElement(doc);
+        return Math.max(el.scrollWidth, el.clientWidth);
+    }
+
+    function _getScrollPos(doc) {
+        doc = doc || document;
+        var x, y;
+        if (_IE || _NEWIE || _OPERA) {
+            x = _docElement(doc).scrollLeft;
+            y = _docElement(doc).scrollTop;
+        } else {
+            x = _getWin(doc).scrollX;
+            y = _getWin(doc).scrollY;
+        }
+        return {x: x, y: y};
+    }
+
+
+    function KNode(node) {
+        this.init(node);
+    }
+
+    _extend(KNode, {
+        init: function (node) {
+            var self = this;
+            node = _isArray(node) ? node : [node];
+            var length = 0;
+            for (var i = 0, len = node.length; i < len; i++) {
+                if (node[i]) {
+                    self[i] = node[i].constructor === KNode ? node[i][0] : node[i];
+                    length++;
+                }
+            }
+            self.length = length;
+            self.doc = _getDoc(self[0]);
+            self.name = _getNodeName(self[0]);
+            self.type = self.length > 0 ? self[0].nodeType : null;
+            self.win = _getWin(self[0]);
+        },
+        each: function (fn) {
+            var self = this;
+            for (var i = 0; i < self.length; i++) {
+                if (fn.call(self[i], i, self[i]) === false) {
+                    return self;
+                }
+            }
+            return self;
+        },
+        bind: function (type, fn) {
+            this.each(function () {
+                _bind(this, type, fn);
+            });
+            return this;
+        },
+        unbind: function (type, fn) {
+            this.each(function () {
+                _unbind(this, type, fn);
+            });
+            return this;
+        },
+        fire: function (type) {
+            if (this.length < 1) {
+                return this;
+            }
+            _fire(this[0], type);
+            return this;
+        },
+        hasAttr: function (key) {
+            if (this.length < 1) {
+                return false;
+            }
+            return !!_getAttr(this[0], key);
+        },
+        attr: function (key, val) {
+            var self = this;
+            if (key === undefined) {
+                return _getAttrList(self.outer());
+            }
+            if (typeof key === 'object') {
+                _each(key, function (k, v) {
+                    self.attr(k, v);
+                });
+                return self;
+            }
+            if (val === undefined) {
+                val = self.length < 1 ? null : _getAttr(self[0], key);
+                return val === null ? '' : val;
+            }
+            self.each(function () {
+                _setAttr(this, key, val);
+            });
+            return self;
+        },
+        removeAttr: function (key) {
+            this.each(function () {
+                _removeAttr(this, key);
+            });
+            return this;
+        },
+        get: function (i) {
+            if (this.length < 1) {
+                return null;
+            }
+            return this[i || 0];
+        },
+        eq: function (i) {
+            if (this.length < 1) {
+                return null;
+            }
+            return this[i] ? new KNode(this[i]) : null;
+        },
+        hasClass: function (cls) {
+            if (this.length < 1) {
+                return false;
+            }
+            return _hasClass(this[0], cls);
+        },
+        addClass: function (cls) {
+            this.each(function () {
+                if (!_hasClass(this, cls)) {
+                    this.className = _trim(this.className + ' ' + cls);
+                }
+            });
+            return this;
+        },
+        removeClass: function (cls) {
+            this.each(function () {
+                if (_hasClass(this, cls)) {
+                    this.className = _trim(this.className.replace(new RegExp('(^|\\s)' + cls + '(\\s|$)'), ' '));
+                }
+            });
+            return this;
+        },
+        html: function (val) {
+            var self = this;
+            if (val === undefined) {
+                if (self.length < 1 || self.type != 1) {
+                    return '';
+                }
+                return _formatHtml(self[0].innerHTML);
+            }
+            self.each(function () {
+                _setHtml(this, val);
+            });
+            return self;
+        },
+        text: function () {
+            var self = this;
+            if (self.length < 1) {
+                return '';
+            }
+            return _IE ? self[0].innerText : self[0].textContent;
+        },
+        hasVal: function () {
+            if (this.length < 1) {
+                return false;
+            }
+            return _hasVal(this[0]);
+        },
+        val: function (val) {
+            var self = this;
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return '';
+                }
+                return self.hasVal() ? self[0].value : self.attr('value');
+            } else {
+                self.each(function () {
+                    if (_hasVal(this)) {
+                        this.value = val;
+                    } else {
+                        _setAttr(this, 'value', val);
+                    }
+                });
+                return self;
+            }
+        },
+        css: function (key, val) {
+            var self = this;
+            if (key === undefined) {
+                return _getCssList(self.attr('style'));
+            }
+            if (typeof key === 'object') {
+                _each(key, function (k, v) {
+                    self.css(k, v);
+                });
+                return self;
+            }
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return '';
+                }
+                return self[0].style[_toCamel(key)] || _computedCss(self[0], key) || '';
+            }
+            self.each(function () {
+                this.style[_toCamel(key)] = val;
+            });
+            return self;
+        },
+        width: function (val) {
+            var self = this;
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return 0;
+                }
+                return self[0].offsetWidth;
+            }
+            return self.css('width', _addUnit(val));
+        },
+        height: function (val) {
+            var self = this;
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return 0;
+                }
+                return self[0].offsetHeight;
+            }
+            return self.css('height', _addUnit(val));
+        },
+        opacity: function (val) {
+            this.each(function () {
+                if (this.style.opacity === undefined) {
+                    this.style.filter = val == 1 ? '' : 'alpha(opacity=' + (val * 100) + ')';
+                } else {
+                    this.style.opacity = val == 1 ? '' : val;
+                }
+            });
+            return this;
+        },
+        data: function (key, val) {
+            var self = this;
+            key = 'kindeditor_data_' + key;
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return null;
+                }
+                return self[0][key];
+            }
+            this.each(function () {
+                this[key] = val;
+            });
+            return self;
+        },
+        pos: function () {
+            var self = this, node = self[0], x = 0, y = 0;
+            if (node) {
+                if (node.getBoundingClientRect) {
+                    var box = node.getBoundingClientRect(),
+                        pos = _getScrollPos(self.doc);
+                    x = box.left + pos.x;
+                    y = box.top + pos.y;
+                } else {
+                    while (node) {
+                        x += node.offsetLeft;
+                        y += node.offsetTop;
+                        node = node.offsetParent;
+                    }
+                }
+            }
+            return {x: _round(x), y: _round(y)};
+        },
+        clone: function (bool) {
+            if (this.length < 1) {
+                return new KNode([]);
+            }
+            return new KNode(this[0].cloneNode(bool));
+        },
+        append: function (expr) {
+            this.each(function () {
+                if (this.appendChild) {
+                    this.appendChild(_get(expr));
+                }
+            });
+            return this;
+        },
+        appendTo: function (expr) {
+            this.each(function () {
+                _get(expr).appendChild(this);
+            });
+            return this;
+        },
+        before: function (expr) {
+            this.each(function () {
+                try {
+                    this.parentNode.insertBefore(_get(expr), this);
+                } catch (e) {
+                }
+            });
+            return this;
+        },
+        after: function (expr) {
+            this.each(function () {
+                if (this.nextSibling) {
+                    this.parentNode.insertBefore(_get(expr), this.nextSibling);
+                } else {
+                    this.parentNode.appendChild(_get(expr));
+                }
+            });
+            return this;
+        },
+        replaceWith: function (expr) {
+            var nodes = [];
+            this.each(function (i, node) {
+                _unbind(node);
+                var newNode = _get(expr);
+                node.parentNode.replaceChild(newNode, node);
+                nodes.push(newNode);
+            });
+            return K(nodes);
+        },
+        empty: function () {
+            var self = this;
+            self.each(function (i, node) {
+                var child = node.firstChild;
+                while (child) {
+                    if (!node.parentNode) {
+                        return;
+                    }
+                    var next = child.nextSibling;
+                    child.parentNode.removeChild(child);
+                    child = next;
+                }
+            });
+            return self;
+        },
+        remove: function (keepChilds) {
+            var self = this;
+            self.each(function (i, node) {
+                if (!node.parentNode) {
+                    return;
+                }
+                _unbind(node);
+                if (keepChilds) {
+                    var child = node.firstChild;
+                    while (child) {
+                        var next = child.nextSibling;
+                        node.parentNode.insertBefore(child, node);
+                        child = next;
+                    }
+                }
+                node.parentNode.removeChild(node);
+                delete self[i];
+            });
+            self.length = 0;
+            return self;
+        },
+        show: function (val) {
+            var self = this;
+            if (val === undefined) {
+                val = self._originDisplay || '';
+            }
+            if (self.css('display') != 'none') {
+                return self;
+            }
+            return self.css('display', val);
+        },
+        hide: function () {
+            var self = this;
+            if (self.length < 1) {
+                return self;
+            }
+            self._originDisplay = self[0].style.display;
+            return self.css('display', 'none');
+        },
+        outer: function () {
+            var self = this;
+            if (self.length < 1) {
+                return '';
+            }
+            var div = self.doc.createElement('div'), html;
+            div.appendChild(self[0].cloneNode(true));
+            html = _formatHtml(div.innerHTML);
+            div = null;
+            return html;
+        },
+        isSingle: function () {
+            return !!_SINGLE_TAG_MAP[this.name];
+        },
+        isInline: function () {
+            return !!_INLINE_TAG_MAP[this.name];
+        },
+        isBlock: function () {
+            return !!_BLOCK_TAG_MAP[this.name];
+        },
+        isStyle: function () {
+            return !!_STYLE_TAG_MAP[this.name];
+        },
+        isControl: function () {
+            return !!_CONTROL_TAG_MAP[this.name];
+        },
+        contains: function (otherNode) {
+            if (this.length < 1) {
+                return false;
+            }
+            return _contains(this[0], _get(otherNode));
+        },
+        parent: function () {
+            if (this.length < 1) {
+                return null;
+            }
+            var node = this[0].parentNode;
+            return node ? new KNode(node) : null;
+        },
+        children: function () {
+            if (this.length < 1) {
+                return new KNode([]);
+            }
+            var list = [], child = this[0].firstChild;
+            while (child) {
+                if (child.nodeType != 3 || _trim(child.nodeValue) !== '') {
+                    list.push(child);
+                }
+                child = child.nextSibling;
+            }
+            return new KNode(list);
+        },
+        first: function () {
+            var list = this.children();
+            return list.length > 0 ? list.eq(0) : null;
+        },
+        last: function () {
+            var list = this.children();
+            return list.length > 0 ? list.eq(list.length - 1) : null;
+        },
+        index: function () {
+            if (this.length < 1) {
+                return -1;
+            }
+            var i = -1, sibling = this[0];
+            while (sibling) {
+                i++;
+                sibling = sibling.previousSibling;
+            }
+            return i;
+        },
+        prev: function () {
+            if (this.length < 1) {
+                return null;
+            }
+            var node = this[0].previousSibling;
+            return node ? new KNode(node) : null;
+        },
+        next: function () {
+            if (this.length < 1) {
+                return null;
+            }
+            var node = this[0].nextSibling;
+            return node ? new KNode(node) : null;
+        },
+        scan: function (fn, order) {
+            if (this.length < 1) {
+                return;
+            }
+            order = (order === undefined) ? true : order;
+
+            function walk(node) {
+                var n = order ? node.firstChild : node.lastChild;
+                while (n) {
+                    var next = order ? n.nextSibling : n.previousSibling;
+                    if (fn(n) === false) {
+                        return false;
+                    }
+                    if (walk(n) === false) {
+                        return false;
+                    }
+                    n = next;
+                }
+            }
+
+            walk(this[0]);
+            return this;
+        }
+    });
+    _each(('blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,' +
+        'mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,' +
+        'change,select,submit,keydown,keypress,keyup,error,contextmenu').split(','), function (i, type) {
+        KNode.prototype[type] = function (fn) {
+            return fn ? this.bind(type, fn) : this.fire(type);
+        };
+    });
+    var _K = K;
+    K = function (expr, root) {
+        if (expr === undefined || expr === null) {
+            return;
+        }
+
+        function newNode(node) {
+            if (!node[0]) {
+                node = [];
+            }
+            return new KNode(node);
+        }
+
+        if (typeof expr === 'string') {
+            if (root) {
+                root = _get(root);
+            }
+            var length = expr.length;
+            if (expr.charAt(0) === '@') {
+                expr = expr.substr(1);
+            }
+            if (expr.length !== length || /<.+>/.test(expr)) {
+                var doc = root ? root.ownerDocument || root : document,
+                    div = doc.createElement('div'), list = [];
+                div.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + expr;
+                for (var i = 0, len = div.childNodes.length; i < len; i++) {
+                    var child = div.childNodes[i];
+                    if (child.id == '__kindeditor_temp_tag__') {
+                        continue;
+                    }
+                    list.push(child);
+                }
+                return newNode(list);
+            }
+            return newNode(_queryAll(expr, root));
+        }
+        if (expr && expr.constructor === KNode) {
+            return expr;
+        }
+        if (expr.toArray) {
+            expr = expr.toArray();
+        }
+        if (_isArray(expr)) {
+            return newNode(expr);
+        }
+        return newNode(_toArray(arguments));
+    };
+    _each(_K, function (key, val) {
+        K[key] = val;
+    });
+    K.NodeClass = KNode;
+    window.KindEditor = K;
+
+
+    var _START_TO_START = 0,
+        _START_TO_END = 1,
+        _END_TO_END = 2,
+        _END_TO_START = 3,
+        _BOOKMARK_ID = 0;
+
+    function _updateCollapsed(range) {
+        range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);
+        return range;
+    }
+
+    function _copyAndDelete(range, isCopy, isDelete) {
+        var doc = range.doc, nodeList = [];
+
+        function splitTextNode(node, startOffset, endOffset) {
+            var length = node.nodeValue.length, centerNode;
+            if (isCopy) {
+                var cloneNode = node.cloneNode(true);
+                if (startOffset > 0) {
+                    centerNode = cloneNode.splitText(startOffset);
+                } else {
+                    centerNode = cloneNode;
+                }
+                if (endOffset < length) {
+                    centerNode.splitText(endOffset - startOffset);
+                }
+            }
+            if (isDelete) {
+                var center = node;
+                if (startOffset > 0) {
+                    center = node.splitText(startOffset);
+                    range.setStart(node, startOffset);
+                }
+                if (endOffset < length) {
+                    var right = center.splitText(endOffset - startOffset);
+                    range.setEnd(right, 0);
+                }
+                nodeList.push(center);
+            }
+            return centerNode;
+        }
+
+        function removeNodes() {
+            if (isDelete) {
+                range.up().collapse(true);
+            }
+            for (var i = 0, len = nodeList.length; i < len; i++) {
+                var node = nodeList[i];
+                if (node.parentNode) {
+                    node.parentNode.removeChild(node);
+                }
+            }
+        }
+
+        var copyRange = range.cloneRange().down();
+        var start = -1, incStart = -1, incEnd = -1, end = -1,
+            ancestor = range.commonAncestor(), frag = doc.createDocumentFragment();
+        if (ancestor.nodeType == 3) {
+            var textNode = splitTextNode(ancestor, range.startOffset, range.endOffset);
+            if (isCopy) {
+                frag.appendChild(textNode);
+            }
+            removeNodes();
+            return isCopy ? frag : range;
+        }
+
+        function extractNodes(parent, frag) {
+            var node = parent.firstChild, nextNode;
+            while (node) {
+                var testRange = new KRange(doc).selectNode(node);
+                start = testRange.compareBoundaryPoints(_START_TO_END, range);
+                if (start >= 0 && incStart <= 0) {
+                    incStart = testRange.compareBoundaryPoints(_START_TO_START, range);
+                }
+                if (incStart >= 0 && incEnd <= 0) {
+                    incEnd = testRange.compareBoundaryPoints(_END_TO_END, range);
+                }
+                if (incEnd >= 0 && end <= 0) {
+                    end = testRange.compareBoundaryPoints(_END_TO_START, range);
+                }
+                if (end >= 0) {
+                    return false;
+                }
+                nextNode = node.nextSibling;
+                if (start > 0) {
+                    if (node.nodeType == 1) {
+                        if (incStart >= 0 && incEnd <= 0) {
+                            if (isCopy) {
+                                frag.appendChild(node.cloneNode(true));
+                            }
+                            if (isDelete) {
+                                nodeList.push(node);
+                            }
+                        } else {
+                            var childFlag;
+                            if (isCopy) {
+                                childFlag = node.cloneNode(false);
+                                frag.appendChild(childFlag);
+                            }
+                            if (extractNodes(node, childFlag) === false) {
+                                return false;
+                            }
+                        }
+                    } else if (node.nodeType == 3) {
+                        var textNode;
+                        if (node == copyRange.startContainer) {
+                            textNode = splitTextNode(node, copyRange.startOffset, node.nodeValue.length);
+                        } else if (node == copyRange.endContainer) {
+                            textNode = splitTextNode(node, 0, copyRange.endOffset);
+                        } else {
+                            textNode = splitTextNode(node, 0, node.nodeValue.length);
+                        }
+                        if (isCopy) {
+                            try {
+                                frag.appendChild(textNode);
+                            } catch (e) {
+                            }
+                        }
+                    }
+                }
+                node = nextNode;
+            }
+        }
+
+        extractNodes(ancestor, frag);
+        if (isDelete) {
+            range.up().collapse(true);
+        }
+        for (var i = 0, len = nodeList.length; i < len; i++) {
+            var node = nodeList[i];
+            if (node.parentNode) {
+                node.parentNode.removeChild(node);
+            }
+        }
+        return isCopy ? frag : range;
+    }
+
+    function _moveToElementText(range, el) {
+        var node = el;
+        while (node) {
+            var knode = K(node);
+            if (knode.name == 'marquee' || knode.name == 'select') {
+                return;
+            }
+            node = node.parentNode;
+        }
+        try {
+            range.moveToElementText(el);
+        } catch (e) {
+        }
+    }
+
+    function _getStartEnd(rng, isStart) {
+        var doc = rng.parentElement().ownerDocument,
+            pointRange = rng.duplicate();
+        pointRange.collapse(isStart);
+        var parent = pointRange.parentElement(),
+            nodes = parent.childNodes;
+        if (nodes.length === 0) {
+            return {node: parent.parentNode, offset: K(parent).index()};
+        }
+        var startNode = doc, startPos = 0, cmp = -1;
+        var testRange = rng.duplicate();
+        _moveToElementText(testRange, parent);
+        for (var i = 0, len = nodes.length; i < len; i++) {
+            var node = nodes[i];
+            cmp = testRange.compareEndPoints('StartToStart', pointRange);
+            if (cmp === 0) {
+                return {node: node.parentNode, offset: i};
+            }
+            if (node.nodeType == 1) {
+                var nodeRange = rng.duplicate(), dummy, knode = K(node), newNode = node;
+                if (knode.isControl()) {
+                    dummy = doc.createElement('span');
+                    knode.after(dummy);
+                    newNode = dummy;
+                    startPos += knode.text().replace(/\r\n|\n|\r/g, '').length;
+                }
+                _moveToElementText(nodeRange, newNode);
+                testRange.setEndPoint('StartToEnd', nodeRange);
+                if (cmp > 0) {
+                    startPos += nodeRange.text.replace(/\r\n|\n|\r/g, '').length;
+                } else {
+                    startPos = 0;
+                }
+                if (dummy) {
+                    K(dummy).remove();
+                }
+            } else if (node.nodeType == 3) {
+                testRange.moveStart('character', node.nodeValue.length);
+                startPos += node.nodeValue.length;
+            }
+            if (cmp < 0) {
+                startNode = node;
+            }
+        }
+        if (cmp < 0 && startNode.nodeType == 1) {
+            return {node: parent, offset: K(parent.lastChild).index() + 1};
+        }
+        if (cmp > 0) {
+            while (startNode.nextSibling && startNode.nodeType == 1) {
+                startNode = startNode.nextSibling;
+            }
+        }
+        testRange = rng.duplicate();
+        _moveToElementText(testRange, parent);
+        testRange.setEndPoint('StartToEnd', pointRange);
+        startPos -= testRange.text.replace(/\r\n|\n|\r/g, '').length;
+        if (cmp > 0 && startNode.nodeType == 3) {
+            var prevNode = startNode.previousSibling;
+            while (prevNode && prevNode.nodeType == 3) {
+                startPos -= prevNode.nodeValue.length;
+                prevNode = prevNode.previousSibling;
+            }
+        }
+        return {node: startNode, offset: startPos};
+    }
+
+    function _getEndRange(node, offset) {
+        var doc = node.ownerDocument || node,
+            range = doc.body.createTextRange();
+        if (doc == node) {
+            range.collapse(true);
+            return range;
+        }
+        if (node.nodeType == 1 && node.childNodes.length > 0) {
+            var children = node.childNodes, isStart, child;
+            if (offset === 0) {
+                child = children[0];
+                isStart = true;
+            } else {
+                child = children[offset - 1];
+                isStart = false;
+            }
+            if (!child) {
+                return range;
+            }
+            if (K(child).name === 'head') {
+                if (offset === 1) {
+                    isStart = true;
+                }
+                if (offset === 2) {
+                    isStart = false;
+                }
+                range.collapse(isStart);
+                return range;
+            }
+            if (child.nodeType == 1) {
+                var kchild = K(child), span;
+                if (kchild.isControl()) {
+                    span = doc.createElement('span');
+                    if (isStart) {
+                        kchild.before(span);
+                    } else {
+                        kchild.after(span);
+                    }
+                    child = span;
+                }
+                _moveToElementText(range, child);
+                range.collapse(isStart);
+                if (span) {
+                    K(span).remove();
+                }
+                return range;
+            }
+            node = child;
+            offset = isStart ? 0 : child.nodeValue.length;
+        }
+        var dummy = doc.createElement('span');
+        K(node).before(dummy);
+        _moveToElementText(range, dummy);
+        range.moveStart('character', offset);
+        K(dummy).remove();
+        return range;
+    }
+
+    function _toRange(rng) {
+        var doc, range;
+
+        function tr2td(start) {
+            if (K(start.node).name == 'tr') {
+                start.node = start.node.cells[start.offset];
+                start.offset = 0;
+            }
+        }
+
+        if (_IERANGE) {
+            if (rng.item) {
+                doc = _getDoc(rng.item(0));
+                range = new KRange(doc);
+                range.selectNode(rng.item(0));
+                return range;
+            }
+            doc = rng.parentElement().ownerDocument;
+            var start = _getStartEnd(rng, true),
+                end = _getStartEnd(rng, false);
+            tr2td(start);
+            tr2td(end);
+            range = new KRange(doc);
+            range.setStart(start.node, start.offset);
+            range.setEnd(end.node, end.offset);
+            return range;
+        }
+        var startContainer = rng.startContainer;
+        doc = startContainer.ownerDocument || startContainer;
+        range = new KRange(doc);
+        range.setStart(startContainer, rng.startOffset);
+        range.setEnd(rng.endContainer, rng.endOffset);
+        return range;
+    }
+
+
+    function KRange(doc) {
+        this.init(doc);
+    }
+
+    _extend(KRange, {
+        init: function (doc) {
+            var self = this;
+            self.startContainer = doc;
+            self.startOffset = 0;
+            self.endContainer = doc;
+            self.endOffset = 0;
+            self.collapsed = true;
+            self.doc = doc;
+        },
+        commonAncestor: function () {
+            function getParents(node) {
+                var parents = [];
+                while (node) {
+                    parents.push(node);
+                    node = node.parentNode;
+                }
+                return parents;
+            }
+
+            var parentsA = getParents(this.startContainer),
+                parentsB = getParents(this.endContainer),
+                i = 0, lenA = parentsA.length, lenB = parentsB.length, parentA, parentB;
+            while (++i) {
+                parentA = parentsA[lenA - i];
+                parentB = parentsB[lenB - i];
+                if (!parentA || !parentB || parentA !== parentB) {
+                    break;
+                }
+            }
+            return parentsA[lenA - i + 1];
+        },
+        setStart: function (node, offset) {
+            var self = this, doc = self.doc;
+            self.startContainer = node;
+            self.startOffset = offset;
+            if (self.endContainer === doc) {
+                self.endContainer = node;
+                self.endOffset = offset;
+            }
+            return _updateCollapsed(this);
+        },
+        setEnd: function (node, offset) {
+            var self = this, doc = self.doc;
+            self.endContainer = node;
+            self.endOffset = offset;
+            if (self.startContainer === doc) {
+                self.startContainer = node;
+                self.startOffset = offset;
+            }
+            return _updateCollapsed(this);
+        },
+        setStartBefore: function (node) {
+            return this.setStart(node.parentNode || this.doc, K(node).index());
+        },
+        setStartAfter: function (node) {
+            return this.setStart(node.parentNode || this.doc, K(node).index() + 1);
+        },
+        setEndBefore: function (node) {
+            return this.setEnd(node.parentNode || this.doc, K(node).index());
+        },
+        setEndAfter: function (node) {
+            return this.setEnd(node.parentNode || this.doc, K(node).index() + 1);
+        },
+        selectNode: function (node) {
+            return this.setStartBefore(node).setEndAfter(node);
+        },
+        selectNodeContents: function (node) {
+            var knode = K(node);
+            if (knode.type == 3 || knode.isSingle()) {
+                return this.selectNode(node);
+            }
+            var children = knode.children();
+            if (children.length > 0) {
+                return this.setStartBefore(children[0]).setEndAfter(children[children.length - 1]);
+            }
+            return this.setStart(node, 0).setEnd(node, 0);
+        },
+        collapse: function (toStart) {
+            if (toStart) {
+                return this.setEnd(this.startContainer, this.startOffset);
+            }
+            return this.setStart(this.endContainer, this.endOffset);
+        },
+        compareBoundaryPoints: function (how, range) {
+            var rangeA = this.get(), rangeB = range.get();
+            if (_IERANGE) {
+                var arr = {};
+                arr[_START_TO_START] = 'StartToStart';
+                arr[_START_TO_END] = 'EndToStart';
+                arr[_END_TO_END] = 'EndToEnd';
+                arr[_END_TO_START] = 'StartToEnd';
+                var cmp = rangeA.compareEndPoints(arr[how], rangeB);
+                if (cmp !== 0) {
+                    return cmp;
+                }
+                var nodeA, nodeB, nodeC, posA, posB;
+                if (how === _START_TO_START || how === _END_TO_START) {
+                    nodeA = this.startContainer;
+                    posA = this.startOffset;
+                }
+                if (how === _START_TO_END || how === _END_TO_END) {
+                    nodeA = this.endContainer;
+                    posA = this.endOffset;
+                }
+                if (how === _START_TO_START || how === _START_TO_END) {
+                    nodeB = range.startContainer;
+                    posB = range.startOffset;
+                }
+                if (how === _END_TO_END || how === _END_TO_START) {
+                    nodeB = range.endContainer;
+                    posB = range.endOffset;
+                }
+                if (nodeA === nodeB) {
+                    var diff = posA - posB;
+                    return diff > 0 ? 1 : (diff < 0 ? -1 : 0);
+                }
+                nodeC = nodeB;
+                while (nodeC && nodeC.parentNode !== nodeA) {
+                    nodeC = nodeC.parentNode;
+                }
+                if (nodeC) {
+                    return K(nodeC).index() >= posA ? -1 : 1;
+                }
+                nodeC = nodeA;
+                while (nodeC && nodeC.parentNode !== nodeB) {
+                    nodeC = nodeC.parentNode;
+                }
+                if (nodeC) {
+                    return K(nodeC).index() >= posB ? 1 : -1;
+                }
+                nodeC = K(nodeB).next();
+                if (nodeC && nodeC.contains(nodeA)) {
+                    return 1;
+                }
+                nodeC = K(nodeA).next();
+                if (nodeC && nodeC.contains(nodeB)) {
+                    return -1;
+                }
+            } else {
+                return rangeA.compareBoundaryPoints(how, rangeB);
+            }
+        },
+        cloneRange: function () {
+            return new KRange(this.doc).setStart(this.startContainer, this.startOffset).setEnd(this.endContainer, this.endOffset);
+        },
+        toString: function () {
+            var rng = this.get(), str = _IERANGE ? rng.text : rng.toString();
+            return str.replace(/\r\n|\n|\r/g, '');
+        },
+        cloneContents: function () {
+            return _copyAndDelete(this, true, false);
+        },
+        deleteContents: function () {
+            return _copyAndDelete(this, false, true);
+        },
+        extractContents: function () {
+            return _copyAndDelete(this, true, true);
+        },
+        insertNode: function (node) {
+            var self = this,
+                sc = self.startContainer, so = self.startOffset,
+                ec = self.endContainer, eo = self.endOffset,
+                firstChild, lastChild, c, nodeCount = 1;
+            if (node.nodeName.toLowerCase() === '#document-fragment') {
+                firstChild = node.firstChild;
+                lastChild = node.lastChild;
+                nodeCount = node.childNodes.length;
+            }
+            if (sc.nodeType == 1) {
+                c = sc.childNodes[so];
+                if (c) {
+                    sc.insertBefore(node, c);
+                    if (sc === ec) {
+                        eo += nodeCount;
+                    }
+                } else {
+                    sc.appendChild(node);
+                }
+            } else if (sc.nodeType == 3) {
+                if (so === 0) {
+                    sc.parentNode.insertBefore(node, sc);
+                    if (sc.parentNode === ec) {
+                        eo += nodeCount;
+                    }
+                } else if (so >= sc.nodeValue.length) {
+                    if (sc.nextSibling) {
+                        sc.parentNode.insertBefore(node, sc.nextSibling);
+                    } else {
+                        sc.parentNode.appendChild(node);
+                    }
+                } else {
+                    if (so > 0) {
+                        c = sc.splitText(so);
+                    } else {
+                        c = sc;
+                    }
+                    sc.parentNode.insertBefore(node, c);
+                    if (sc === ec) {
+                        ec = c;
+                        eo -= so;
+                    }
+                }
+            }
+            if (firstChild) {
+                self.setStartBefore(firstChild).setEndAfter(lastChild);
+            } else {
+                self.selectNode(node);
+            }
+            if (self.compareBoundaryPoints(_END_TO_END, self.cloneRange().setEnd(ec, eo)) >= 1) {
+                return self;
+            }
+            return self.setEnd(ec, eo);
+        },
+        surroundContents: function (node) {
+            node.appendChild(this.extractContents());
+            return this.insertNode(node).selectNode(node);
+        },
+        isControl: function () {
+            var self = this,
+                sc = self.startContainer, so = self.startOffset,
+                ec = self.endContainer, eo = self.endOffset, rng;
+            return sc.nodeType == 1 && sc === ec && so + 1 === eo && K(sc.childNodes[so]).isControl();
+        },
+        get: function (hasControlRange) {
+            var self = this, doc = self.doc, node, rng;
+            if (!_IERANGE) {
+                rng = doc.createRange();
+                try {
+                    rng.setStart(self.startContainer, self.startOffset);
+                    rng.setEnd(self.endContainer, self.endOffset);
+                } catch (e) {
+                }
+                return rng;
+            }
+            if (hasControlRange && self.isControl()) {
+                rng = doc.body.createControlRange();
+                rng.addElement(self.startContainer.childNodes[self.startOffset]);
+                return rng;
+            }
+            var range = self.cloneRange().down();
+            rng = doc.body.createTextRange();
+            rng.setEndPoint('StartToStart', _getEndRange(range.startContainer, range.startOffset));
+            rng.setEndPoint('EndToStart', _getEndRange(range.endContainer, range.endOffset));
+            return rng;
+        },
+        html: function () {
+            return K(this.cloneContents()).outer();
+        },
+        down: function () {
+            var self = this;
+
+            function downPos(node, pos, isStart) {
+                if (node.nodeType != 1) {
+                    return;
+                }
+                var children = K(node).children();
+                if (children.length === 0) {
+                    return;
+                }
+                var left, right, child, offset;
+                if (pos > 0) {
+                    left = children.eq(pos - 1);
+                }
+                if (pos < children.length) {
+                    right = children.eq(pos);
+                }
+                if (left && left.type == 3) {
+                    child = left[0];
+                    offset = child.nodeValue.length;
+                }
+                if (right && right.type == 3) {
+                    child = right[0];
+                    offset = 0;
+                }
+                if (!child) {
+                    return;
+                }
+                if (isStart) {
+                    self.setStart(child, offset);
+                } else {
+                    self.setEnd(child, offset);
+                }
+            }
+
+            downPos(self.startContainer, self.startOffset, true);
+            downPos(self.endContainer, self.endOffset, false);
+            return self;
+        },
+        up: function () {
+            var self = this;
+
+            function upPos(node, pos, isStart) {
+                if (node.nodeType != 3) {
+                    return;
+                }
+                if (pos === 0) {
+                    if (isStart) {
+                        self.setStartBefore(node);
+                    } else {
+                        self.setEndBefore(node);
+                    }
+                } else if (pos == node.nodeValue.length) {
+                    if (isStart) {
+                        self.setStartAfter(node);
+                    } else {
+                        self.setEndAfter(node);
+                    }
+                }
+            }
+
+            upPos(self.startContainer, self.startOffset, true);
+            upPos(self.endContainer, self.endOffset, false);
+            return self;
+        },
+        enlarge: function (toBlock) {
+            var self = this;
+            self.up();
+
+            function enlargePos(node, pos, isStart) {
+                var knode = K(node), parent;
+                if (knode.type == 3 || _NOSPLIT_TAG_MAP[knode.name] || !toBlock && knode.isBlock()) {
+                    return;
+                }
+                if (pos === 0) {
+                    while (!knode.prev()) {
+                        parent = knode.parent();
+                        if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
+                            break;
+                        }
+                        knode = parent;
+                    }
+                    if (isStart) {
+                        self.setStartBefore(knode[0]);
+                    } else {
+                        self.setEndBefore(knode[0]);
+                    }
+                } else if (pos == knode.children().length) {
+                    while (!knode.next()) {
+                        parent = knode.parent();
+                        if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
+                            break;
+                        }
+                        knode = parent;
+                    }
+                    if (isStart) {
+                        self.setStartAfter(knode[0]);
+                    } else {
+                        self.setEndAfter(knode[0]);
+                    }
+                }
+            }
+
+            enlargePos(self.startContainer, self.startOffset, true);
+            enlargePos(self.endContainer, self.endOffset, false);
+            return self;
+        },
+        shrink: function () {
+            var self = this, child, collapsed = self.collapsed;
+            while (self.startContainer.nodeType == 1 && (child = self.startContainer.childNodes[self.startOffset]) && child.nodeType == 1 && !K(child).isSingle()) {
+                self.setStart(child, 0);
+            }
+            if (collapsed) {
+                return self.collapse(collapsed);
+            }
+            while (self.endContainer.nodeType == 1 && self.endOffset > 0 && (child = self.endContainer.childNodes[self.endOffset - 1]) && child.nodeType == 1 && !K(child).isSingle()) {
+                self.setEnd(child, child.childNodes.length);
+            }
+            return self;
+        },
+        createBookmark: function (serialize) {
+            var self = this, doc = self.doc, endNode,
+                startNode = K('<span style="display:none;"></span>', doc)[0];
+            startNode.id = '__kindeditor_bookmark_start_' + (_BOOKMARK_ID++) + '__';
+            if (!self.collapsed) {
+                endNode = startNode.cloneNode(true);
+                endNode.id = '__kindeditor_bookmark_end_' + (_BOOKMARK_ID++) + '__';
+            }
+            if (endNode) {
+                self.cloneRange().collapse(false).insertNode(endNode).setEndBefore(endNode);
+            }
+            self.insertNode(startNode).setStartAfter(startNode);
+            return {
+                start: serialize ? '#' + startNode.id : startNode,
+                end: endNode ? (serialize ? '#' + endNode.id : endNode) : null
+            };
+        },
+        moveToBookmark: function (bookmark) {
+            var self = this, doc = self.doc,
+                start = K(bookmark.start, doc), end = bookmark.end ? K(bookmark.end, doc) : null;
+            if (!start || start.length < 1) {
+                return self;
+            }
+            self.setStartBefore(start[0]);
+            start.remove();
+            if (end && end.length > 0) {
+                self.setEndBefore(end[0]);
+                end.remove();
+            } else {
+                self.collapse(true);
+            }
+            return self;
+        },
+        dump: function () {
+            console.log('--------------------');
+            console.log(this.startContainer.nodeType == 3 ? this.startContainer.nodeValue : this.startContainer, this.startOffset);
+            console.log(this.endContainer.nodeType == 3 ? this.endContainer.nodeValue : this.endContainer, this.endOffset);
+        }
+    });
+
+    function _range(mixed) {
+        if (!mixed.nodeName) {
+            return mixed.constructor === KRange ? mixed : _toRange(mixed);
+        }
+        return new KRange(mixed);
+    }
+
+    K.RangeClass = KRange;
+    K.range = _range;
+    K.START_TO_START = _START_TO_START;
+    K.START_TO_END = _START_TO_END;
+    K.END_TO_END = _END_TO_END;
+    K.END_TO_START = _END_TO_START;
+
+
+    function _nativeCommand(doc, key, val) {
+        try {
+            doc.execCommand(key, false, val);
+        } catch (e) {
+        }
+    }
+
+    function _nativeCommandValue(doc, key) {
+        var val = '';
+        try {
+            val = doc.queryCommandValue(key);
+        } catch (e) {
+        }
+        if (typeof val !== 'string') {
+            val = '';
+        }
+        return val;
+    }
+
+    function _getSel(doc) {
+        var win = _getWin(doc);
+        return _IERANGE ? doc.selection : win.getSelection();
+    }
+
+    function _getRng(doc) {
+        var sel = _getSel(doc), rng;
+        try {
+            if (sel.rangeCount > 0) {
+                rng = sel.getRangeAt(0);
+            } else {
+                rng = sel.createRange();
+            }
+        } catch (e) {
+        }
+        if (_IERANGE && (!rng || (!rng.item && rng.parentElement().ownerDocument !== doc))) {
+            return null;
+        }
+        return rng;
+    }
+
+    function _singleKeyMap(map) {
+        var newMap = {}, arr, v;
+        _each(map, function (key, val) {
+            arr = key.split(',');
+            for (var i = 0, len = arr.length; i < len; i++) {
+                v = arr[i];
+                newMap[v] = val;
+            }
+        });
+        return newMap;
+    }
+
+    function _hasAttrOrCss(knode, map) {
+        return _hasAttrOrCssByKey(knode, map, '*') || _hasAttrOrCssByKey(knode, map);
+    }
+
+    function _hasAttrOrCssByKey(knode, map, mapKey) {
+        mapKey = mapKey || knode.name;
+        if (knode.type !== 1) {
+            return false;
+        }
+        var newMap = _singleKeyMap(map);
+        if (!newMap[mapKey]) {
+            return false;
+        }
+        var arr = newMap[mapKey].split(',');
+        for (var i = 0, len = arr.length; i < len; i++) {
+            var key = arr[i];
+            if (key === '*') {
+                return true;
+            }
+            var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
+            var method = match[1] ? 'css' : 'attr';
+            key = match[2];
+            var val = match[3] || '';
+            if (val === '' && knode[method](key) !== '') {
+                return true;
+            }
+            if (val !== '' && knode[method](key) === val) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    function _removeAttrOrCss(knode, map) {
+        if (knode.type != 1) {
+            return;
+        }
+        _removeAttrOrCssByKey(knode, map, '*');
+        _removeAttrOrCssByKey(knode, map);
+    }
+
+    function _removeAttrOrCssByKey(knode, map, mapKey) {
+        mapKey = mapKey || knode.name;
+        if (knode.type !== 1) {
+            return;
+        }
+        var newMap = _singleKeyMap(map);
+        if (!newMap[mapKey]) {
+            return;
+        }
+        var arr = newMap[mapKey].split(','), allFlag = false;
+        for (var i = 0, len = arr.length; i < len; i++) {
+            var key = arr[i];
+            if (key === '*') {
+                allFlag = true;
+                break;
+            }
+            var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
+            key = match[2];
+            if (match[1]) {
+                key = _toCamel(key);
+                if (knode[0].style[key]) {
+                    knode[0].style[key] = '';
+                }
+            } else {
+                knode.removeAttr(key);
+            }
+        }
+        if (allFlag) {
+            knode.remove(true);
+        }
+    }
+
+    function _getInnerNode(knode) {
+        var inner = knode;
+        while (inner.first()) {
+            inner = inner.first();
+        }
+        return inner;
+    }
+
+    function _isEmptyNode(knode) {
+        if (knode.type != 1 || knode.isSingle()) {
+            return false;
+        }
+        return knode.html().replace(/<[^>]+>/g, '') === '';
+    }
+
+
+    function _mergeWrapper(a, b) {
+        a = a.clone(true);
+        var lastA = _getInnerNode(a), childA = a, merged = false;
+        while (b) {
+            while (childA) {
+                if (childA.name === b.name) {
+                    _mergeAttrs(childA, b.attr(), b.css());
+                    merged = true;
+                }
+                childA = childA.first();
+            }
+            if (!merged) {
+                lastA.append(b.clone(false));
+            }
+            merged = false;
+            b = b.first();
+        }
+        return a;
+    }
+
+    function _wrapNode(knode, wrapper) {
+        wrapper = wrapper.clone(true);
+        if (knode.type == 3) {
+            _getInnerNode(wrapper).append(knode.clone(false));
+            knode.replaceWith(wrapper);
+            return wrapper;
+        }
+        var nodeWrapper = knode, child;
+        while ((child = knode.first()) && child.children().length == 1) {
+            knode = child;
+        }
+        child = knode.first();
+        var frag = knode.doc.createDocumentFragment();
+        while (child) {
+            frag.appendChild(child[0]);
+            child = child.next();
+        }
+        wrapper = _mergeWrapper(nodeWrapper, wrapper);
+        if (frag.firstChild) {
+            _getInnerNode(wrapper).append(frag);
+        }
+        nodeWrapper.replaceWith(wrapper);
+        return wrapper;
+    }
+
+    function _mergeAttrs(knode, attrs, styles) {
+        _each(attrs, function (key, val) {
+            if (key !== 'style') {
+                knode.attr(key, val);
+            }
+        });
+        _each(styles, function (key, val) {
+            knode.css(key, val);
+        });
+    }
+
+    function _inPreElement(knode) {
+        while (knode && knode.name != 'body') {
+            if (_PRE_TAG_MAP[knode.name] || knode.name == 'div' && knode.hasClass('ke-script')) {
+                return true;
+            }
+            knode = knode.parent();
+        }
+        return false;
+    }
+
+    function KCmd(range) {
+        this.init(range);
+    }
+
+    _extend(KCmd, {
+        init: function (range) {
+            var self = this, doc = range.doc;
+            self.doc = doc;
+            self.win = _getWin(doc);
+            self.sel = _getSel(doc);
+            self.range = range;
+        },
+        selection: function (forceReset) {
+            var self = this, doc = self.doc, rng = _getRng(doc);
+            self.sel = _getSel(doc);
+            if (rng) {
+                self.range = _range(rng);
+                if (K(self.range.startContainer).name == 'html') {
+                    self.range.selectNodeContents(doc.body).collapse(false);
+                }
+                return self;
+            }
+            if (forceReset) {
+                self.range.selectNodeContents(doc.body).collapse(false);
+            }
+            return self;
+        },
+        select: function (hasDummy) {
+            hasDummy = _undef(hasDummy, true);
+            var self = this, sel = self.sel, range = self.range.cloneRange().shrink(),
+                sc = range.startContainer, so = range.startOffset,
+                ec = range.endContainer, eo = range.endOffset,
+                doc = _getDoc(sc), win = self.win, rng, hasU200b = false;
+            if (hasDummy && sc.nodeType == 1 && range.collapsed) {
+                if (_IERANGE) {
+                    var dummy = K('<span>&nbsp;</span>', doc);
+                    range.insertNode(dummy[0]);
+                    rng = doc.body.createTextRange();
+                    try {
+                        rng.moveToElementText(dummy[0]);
+                    } catch (ex) {
+                    }
+                    rng.collapse(false);
+                    rng.select();
+                    dummy.remove();
+                    win.focus();
+                    return self;
+                }
+                if (_WEBKIT) {
+                    var children = sc.childNodes;
+                    if (K(sc).isInline() || so > 0 && K(children[so - 1]).isInline() || children[so] && K(children[so]).isInline()) {
+                        range.insertNode(doc.createTextNode('\u200B'));
+                        hasU200b = true;
+                    }
+                }
+            }
+            if (_IERANGE) {
+                try {
+                    rng = range.get(true);
+                    rng.select();
+                } catch (e) {
+                }
+            } else {
+                if (hasU200b) {
+                    range.collapse(false);
+                }
+                rng = range.get(true);
+                sel.removeAllRanges();
+                sel.addRange(rng);
+                if (doc !== document) {
+                    var pos = K(rng.endContainer).pos();
+                    win.scrollTo(pos.x, pos.y);
+                }
+            }
+            win.focus();
+            return self;
+        },
+        wrap: function (val) {
+            var self = this, doc = self.doc, range = self.range, wrapper;
+            wrapper = K(val, doc);
+            if (range.collapsed) {
+                range.shrink();
+                range.insertNode(wrapper[0]).selectNodeContents(wrapper[0]);
+                return self;
+            }
+            if (wrapper.isBlock()) {
+                var copyWrapper = wrapper.clone(true), child = copyWrapper;
+                while (child.first()) {
+                    child = child.first();
+                }
+                child.append(range.extractContents());
+                range.insertNode(copyWrapper[0]).selectNode(copyWrapper[0]);
+                return self;
+            }
+            range.enlarge();
+            var bookmark = range.createBookmark(), ancestor = range.commonAncestor(), isStart = false;
+            K(ancestor).scan(function (node) {
+                if (!isStart && node == bookmark.start) {
+                    isStart = true;
+                    return;
+                }
+                if (isStart) {
+                    if (node == bookmark.end) {
+                        return false;
+                    }
+                    var knode = K(node);
+                    if (_inPreElement(knode)) {
+                        return;
+                    }
+                    if (knode.type == 3 && _trim(node.nodeValue).length > 0) {
+                        var parent;
+                        while ((parent = knode.parent()) && parent.isStyle() && parent.children().length == 1) {
+                            knode = parent;
+                        }
+                        _wrapNode(knode, wrapper);
+                    }
+                }
+            });
+            range.moveToBookmark(bookmark);
+            return self;
+        },
+        split: function (isStart, map) {
+            var range = this.range, doc = range.doc;
+            var tempRange = range.cloneRange().collapse(isStart);
+            var node = tempRange.startContainer, pos = tempRange.startOffset,
+                parent = node.nodeType == 3 ? node.parentNode : node,
+                needSplit = false, knode;
+            while (parent && parent.parentNode) {
+                knode = K(parent);
+                if (map) {
+                    if (!knode.isStyle()) {
+                        break;
+                    }
+                    if (!_hasAttrOrCss(knode, map)) {
+                        break;
+                    }
+                } else {
+                    if (_NOSPLIT_TAG_MAP[knode.name]) {
+                        break;
+                    }
+                }
+                needSplit = true;
+                parent = parent.parentNode;
+            }
+            if (needSplit) {
+                var dummy = doc.createElement('span');
+                range.cloneRange().collapse(!isStart).insertNode(dummy);
+                if (isStart) {
+                    tempRange.setStartBefore(parent.firstChild).setEnd(node, pos);
+                } else {
+                    tempRange.setStart(node, pos).setEndAfter(parent.lastChild);
+                }
+                var frag = tempRange.extractContents(),
+                    first = frag.firstChild, last = frag.lastChild;
+                if (isStart) {
+                    tempRange.insertNode(frag);
+                    range.setStartAfter(last).setEndBefore(dummy);
+                } else {
+                    parent.appendChild(frag);
+                    range.setStartBefore(dummy).setEndBefore(first);
+                }
+                var dummyParent = dummy.parentNode;
+                if (dummyParent == range.endContainer) {
+                    var prev = K(dummy).prev(), next = K(dummy).next();
+                    if (prev && next && prev.type == 3 && next.type == 3) {
+                        range.setEnd(prev[0], prev[0].nodeValue.length);
+                    } else if (!isStart) {
+                        range.setEnd(range.endContainer, range.endOffset - 1);
+                    }
+                }
+                dummyParent.removeChild(dummy);
+            }
+            return this;
+        },
+        remove: function (map) {
+            var self = this, doc = self.doc, range = self.range;
+            range.enlarge();
+            if (range.startOffset === 0) {
+                var ksc = K(range.startContainer), parent;
+                while ((parent = ksc.parent()) && parent.isStyle() && parent.children().length == 1) {
+                    ksc = parent;
+                }
+                range.setStart(ksc[0], 0);
+                ksc = K(range.startContainer);
+                if (ksc.isBlock()) {
+                    _removeAttrOrCss(ksc, map);
+                }
+                var kscp = ksc.parent();
+                if (kscp && kscp.isBlock()) {
+                    _removeAttrOrCss(kscp, map);
+                }
+            }
+            var sc, so;
+            if (range.collapsed) {
+                self.split(true, map);
+                sc = range.startContainer;
+                so = range.startOffset;
+                if (so > 0) {
+                    var sb = K(sc.childNodes[so - 1]);
+                    if (sb && _isEmptyNode(sb)) {
+                        sb.remove();
+                        range.setStart(sc, so - 1);
+                    }
+                }
+                var sa = K(sc.childNodes[so]);
+                if (sa && _isEmptyNode(sa)) {
+                    sa.remove();
+                }
+                if (_isEmptyNode(sc)) {
+                    range.startBefore(sc);
+                    sc.remove();
+                }
+                range.collapse(true);
+                return self;
+            }
+            self.split(true, map);
+            self.split(false, map);
+            var startDummy = doc.createElement('span'), endDummy = doc.createElement('span');
+            range.cloneRange().collapse(false).insertNode(endDummy);
+            range.cloneRange().collapse(true).insertNode(startDummy);
+            var nodeList = [], cmpStart = false;
+            K(range.commonAncestor()).scan(function (node) {
+                if (!cmpStart && node == startDummy) {
+                    cmpStart = true;
+                    return;
+                }
+                if (node == endDummy) {
+                    return false;
+                }
+                if (cmpStart) {
+                    nodeList.push(node);
+                }
+            });
+            K(startDummy).remove();
+            K(endDummy).remove();
+            sc = range.startContainer;
+            so = range.startOffset;
+            var ec = range.endContainer, eo = range.endOffset;
+            if (so > 0) {
+                var startBefore = K(sc.childNodes[so - 1]);
+                if (startBefore && _isEmptyNode(startBefore)) {
+                    startBefore.remove();
+                    range.setStart(sc, so - 1);
+                    if (sc == ec) {
+                        range.setEnd(ec, eo - 1);
+                    }
+                }
+                var startAfter = K(sc.childNodes[so]);
+                if (startAfter && _isEmptyNode(startAfter)) {
+                    startAfter.remove();
+                    if (sc == ec) {
+                        range.setEnd(ec, eo - 1);
+                    }
+                }
+            }
+            var endAfter = K(ec.childNodes[range.endOffset]);
+            if (endAfter && _isEmptyNode(endAfter)) {
+                endAfter.remove();
+            }
+            var bookmark = range.createBookmark(true);
+            _each(nodeList, function (i, node) {
+                _removeAttrOrCss(K(node), map);
+            });
+            range.moveToBookmark(bookmark);
+            return self;
+        },
+        commonNode: function (map) {
+            var range = this.range;
+            var ec = range.endContainer, eo = range.endOffset,
+                node = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
+
+            function find(node) {
+                var child = node, parent = node;
+                while (parent) {
+                    if (_hasAttrOrCss(K(parent), map)) {
+                        return K(parent);
+                    }
+                    parent = parent.parentNode;
+                }
+                while (child && (child = child.lastChild)) {
+                    if (_hasAttrOrCss(K(child), map)) {
+                        return K(child);
+                    }
+                }
+                return null;
+            }
+
+            var cNode = find(node);
+            if (cNode) {
+                return cNode;
+            }
+            if (node.nodeType == 1 || (ec.nodeType == 3 && eo === 0)) {
+                var prev = K(node).prev();
+                if (prev) {
+                    return find(prev);
+                }
+            }
+            return null;
+        },
+        commonAncestor: function (tagName) {
+            var range = this.range,
+                sc = range.startContainer, so = range.startOffset,
+                ec = range.endContainer, eo = range.endOffset,
+                startNode = (sc.nodeType == 3 || so === 0) ? sc : sc.childNodes[so - 1],
+                endNode = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
+
+            function find(node) {
+                while (node) {
+                    if (node.nodeType == 1) {
+                        if (node.tagName.toLowerCase() === tagName) {
+                            return node;
+                        }
+                    }
+                    node = node.parentNode;
+                }
+                return null;
+            }
+
+            var start = find(startNode), end = find(endNode);
+            if (start && end && start === end) {
+                return K(start);
+            }
+            return null;
+        },
+        state: function (key) {
+            var self = this, doc = self.doc, bool = false;
+            try {
+                bool = doc.queryCommandState(key);
+            } catch (e) {
+            }
+            return bool;
+        },
+        val: function (key) {
+            var self = this, doc = self.doc, range = self.range;
+
+            function lc(val) {
+                return val.toLowerCase();
+            }
+
+            key = lc(key);
+            var val = '', knode;
+            if (key === 'fontfamily' || key === 'fontname') {
+                val = _nativeCommandValue(doc, 'fontname');
+                val = val.replace(/['"]/g, '');
+                return lc(val);
+            }
+            if (key === 'formatblock') {
+                val = _nativeCommandValue(doc, key);
+                if (val === '') {
+                    knode = self.commonNode({'h1,h2,h3,h4,h5,h6,p,div,pre,address': '*'});
+                    if (knode) {
+                        val = knode.name;
+                    }
+                }
+                if (val === 'Normal') {
+                    val = 'p';
+                }
+                return lc(val);
+            }
+            if (key === 'fontsize') {
+                knode = self.commonNode({'*': '.font-size'});
+                if (knode) {
+                    val = knode.css('font-size');
+                }
+                return lc(val);
+            }
+            if (key === 'forecolor') {
+                knode = self.commonNode({'*': '.color'});
+                if (knode) {
+                    val = knode.css('color');
+                }
+                val = _toHex(val);
+                if (val === '') {
+                    val = 'default';
+                }
+                return lc(val);
+            }
+            if (key === 'hilitecolor') {
+                knode = self.commonNode({'*': '.background-color'});
+                if (knode) {
+                    val = knode.css('background-color');
+                }
+                val = _toHex(val);
+                if (val === '') {
+                    val = 'default';
+                }
+                return lc(val);
+            }
+            return val;
+        },
+        toggle: function (wrapper, map) {
+            var self = this;
+            if (self.commonNode(map)) {
+                self.remove(map);
+            } else {
+                self.wrap(wrapper);
+            }
+            return self.select();
+        },
+        bold: function () {
+            return this.toggle('<strong></strong>', {
+                span: '.font-weight=bold',
+                strong: '*',
+                b: '*'
+            });
+        },
+        italic: function () {
+            return this.toggle('<em></em>', {
+                span: '.font-style=italic',
+                em: '*',
+                i: '*'
+            });
+        },
+        underline: function () {
+            return this.toggle('<u></u>', {
+                span: '.text-decoration=underline',
+                u: '*'
+            });
+        },
+        strikethrough: function () {
+            return this.toggle('<s></s>', {
+                span: '.text-decoration=line-through',
+                s: '*'
+            });
+        },
+        forecolor: function (val) {
+            return this.wrap('<span style="color:' + val + ';"></span>').select();
+        },
+        hilitecolor: function (val) {
+            return this.wrap('<span style="background-color:' + val + ';"></span>').select();
+        },
+        fontsize: function (val) {
+            return this.wrap('<span style="font-size:' + val + ';"></span>').select();
+        },
+        fontname: function (val) {
+            return this.fontfamily(val);
+        },
+        fontfamily: function (val) {
+            return this.wrap('<span style="font-family:' + val + ';"></span>').select();
+        },
+        removeformat: function () {
+            var map = {
+                    '*': '.font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent'
+                },
+                tags = _STYLE_TAG_MAP;
+            _each(tags, function (key, val) {
+                map[key] = '*';
+            });
+            this.remove(map);
+            return this.select();
+        },
+        inserthtml: function (val, quickMode) {
+            var self = this, range = self.range;
+            if (val === '') {
+                return self;
+            }
+
+            function pasteHtml(range, val) {
+                val = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + val;
+                var rng = range.get();
+                if (rng.item) {
+                    rng.item(0).outerHTML = val;
+                } else {
+                    rng.pasteHTML(val);
+                }
+                var temp = range.doc.getElementById('__kindeditor_temp_tag__');
+                temp.parentNode.removeChild(temp);
+                var newRange = _toRange(rng);
+                range.setEnd(newRange.endContainer, newRange.endOffset);
+                range.collapse(false);
+                self.select(false);
+            }
+
+            function insertHtml(range, val) {
+                var doc = range.doc,
+                    frag = doc.createDocumentFragment();
+                K('@' + val, doc).each(function () {
+                    frag.appendChild(this);
+                });
+                range.deleteContents();
+                range.insertNode(frag);
+                range.collapse(false);
+                self.select(false);
+            }
+
+            if (_IERANGE && quickMode) {
+                try {
+                    pasteHtml(range, val);
+                } catch (e) {
+                    insertHtml(range, val);
+                }
+                return self;
+            }
+            insertHtml(range, val);
+            return self;
+        },
+        hr: function () {
+            return this.inserthtml('<hr />');
+        },
+        print: function () {
+            this.win.print();
+            return this;
+        },
+        insertimage: function (url, title, width, height, border, align) {
+            title = _undef(title, '');
+            border = _undef(border, 0);
+            var html = '<img src="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
+            if (width) {
+                html += 'width="' + _escape(width) + '" ';
+            }
+            if (height) {
+                html += 'height="' + _escape(height) + '" ';
+            }
+            if (title) {
+                html += 'title="' + _escape(title) + '" ';
+            }
+            if (align) {
+                html += 'align="' + _escape(align) + '" ';
+            }
+            html += 'alt="' + _escape(title) + '" ';
+            html += '/>';
+            return this.inserthtml(html);
+        },
+        createlink: function (url, type) {
+            var self = this, doc = self.doc, range = self.range;
+            self.select();
+            var a = self.commonNode({a: '*'});
+            if (a && !range.isControl()) {
+                range.selectNode(a.get());
+                self.select();
+            }
+            var html = '<a href="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
+            if (type) {
+                html += ' target="' + _escape(type) + '"';
+            }
+            if (range.collapsed) {
+                html += '>' + _escape(url) + '</a>';
+                return self.inserthtml(html);
+            }
+            if (range.isControl()) {
+                var node = K(range.startContainer.childNodes[range.startOffset]);
+                html += '></a>';
+                node.after(K(html, doc));
+                node.next().append(node);
+                range.selectNode(node[0]);
+                return self.select();
+            }
+
+            function setAttr(node, url, type) {
+                K(node).attr('href', url).attr('data-ke-src', url);
+                if (type) {
+                    K(node).attr('target', type);
+                } else {
+                    K(node).removeAttr('target');
+                }
+            }
+
+            var sc = range.startContainer, so = range.startOffset,
+                ec = range.endContainer, eo = range.endOffset;
+            if (sc.nodeType == 1 && sc === ec && so + 1 === eo) {
+                var child = sc.childNodes[so];
+                if (child.nodeName.toLowerCase() == 'a') {
+                    setAttr(child, url, type);
+                    return self;
+                }
+            }
+            _nativeCommand(doc, 'createlink', '__kindeditor_temp_url__');
+            K('a[href="__kindeditor_temp_url__"]', doc).each(function () {
+                setAttr(this, url, type);
+            });
+            return self;
+        },
+        unlink: function () {
+            var self = this, doc = self.doc, range = self.range;
+            self.select();
+            if (range.collapsed) {
+                var a = self.commonNode({a: '*'});
+                if (a) {
+                    range.selectNode(a.get());
+                    self.select();
+                }
+                _nativeCommand(doc, 'unlink', null);
+                if (_WEBKIT && K(range.startContainer).name === 'img') {
+                    var parent = K(range.startContainer).parent();
+                    if (parent.name === 'a') {
+                        parent.remove(true);
+                    }
+                }
+            } else {
+                _nativeCommand(doc, 'unlink', null);
+            }
+            return self;
+        }
+    });
+    _each(('formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
+        'insertunorderedlist,indent,outdent,subscript,superscript').split(','), function (i, name) {
+        KCmd.prototype[name] = function (val) {
+            var self = this;
+            self.select();
+            _nativeCommand(self.doc, name, val);
+            if (_IERANGE && _inArray(name, 'justifyleft,justifycenter,justifyright,justifyfull'.split(',')) >= 0) {
+                self.selection();
+            }
+            if (!_IERANGE || _inArray(name, 'formatblock,selectall,insertorderedlist,insertunorderedlist'.split(',')) >= 0) {
+                self.selection();
+            }
+            return self;
+        };
+    });
+    _each('cut,copy,paste'.split(','), function (i, name) {
+        KCmd.prototype[name] = function () {
+            var self = this;
+            if (!self.doc.queryCommandSupported(name)) {
+                throw 'not supported';
+            }
+            self.select();
+            _nativeCommand(self.doc, name, null);
+            return self;
+        };
+    });
+
+    function _cmd(mixed) {
+        if (mixed.nodeName) {
+            var doc = _getDoc(mixed);
+            mixed = _range(doc).selectNodeContents(doc.body).collapse(false);
+        }
+        return new KCmd(mixed);
+    }
+
+    K.CmdClass = KCmd;
+    K.cmd = _cmd;
+
+
+    function _drag(options) {
+        var moveEl = options.moveEl,
+            moveFn = options.moveFn,
+            clickEl = options.clickEl || moveEl,
+            beforeDrag = options.beforeDrag,
+            iframeFix = options.iframeFix === undefined ? true : options.iframeFix;
+        var docs = [document];
+        if (iframeFix) {
+            K('iframe').each(function () {
+                var src = _formatUrl(this.src || '', 'absolute');
+                if (/^https?:\/\//.test(src)) {
+                    return;
+                }
+                var doc;
+                try {
+                    doc = _iframeDoc(this);
+                } catch (e) {
+                }
+                if (doc) {
+                    var pos = K(this).pos();
+                    K(doc).data('pos-x', pos.x);
+                    K(doc).data('pos-y', pos.y);
+                    docs.push(doc);
+                }
+            });
+        }
+        clickEl.mousedown(function (e) {
+            if (e.button !== 0 && e.button !== 1) {
+                return;
+            }
+            e.stopPropagation();
+            var self = clickEl.get(),
+                x = _removeUnit(moveEl.css('left')),
+                y = _removeUnit(moveEl.css('top')),
+                width = moveEl.width(),
+                height = moveEl.height(),
+                pageX = e.pageX,
+                pageY = e.pageY;
+            if (beforeDrag) {
+                beforeDrag();
+            }
+
+            function moveListener(e) {
+                e.preventDefault();
+                var kdoc = K(_getDoc(e.target));
+                var diffX = _round((kdoc.data('pos-x') || 0) + e.pageX - pageX);
+                var diffY = _round((kdoc.data('pos-y') || 0) + e.pageY - pageY);
+                moveFn.call(clickEl, x, y, width, height, diffX, diffY);
+            }
+
+            function selectListener(e) {
+                e.preventDefault();
+            }
+
+            function upListener(e) {
+                e.preventDefault();
+                K(docs).unbind('mousemove', moveListener)
+                    .unbind('mouseup', upListener)
+                    .unbind('selectstart', selectListener);
+                if (self.releaseCapture) {
+                    self.releaseCapture();
+                }
+            }
+
+            K(docs).mousemove(moveListener)
+                .mouseup(upListener)
+                .bind('selectstart', selectListener);
+            if (self.setCapture) {
+                self.setCapture();
+            }
+        });
+    }
+
+
+    function KWidget(options) {
+        this.init(options);
+    }
+
+    _extend(KWidget, {
+        init: function (options) {
+            var self = this;
+            self.name = options.name || '';
+            self.doc = options.doc || document;
+            self.win = _getWin(self.doc);
+            self.x = _addUnit(options.x);
+            self.y = _addUnit(options.y);
+            self.z = options.z;
+            self.width = _addUnit(options.width);
+            self.height = _addUnit(options.height);
+            self.div = K('<div style="display:block;"></div>');
+            self.options = options;
+            self._alignEl = options.alignEl;
+            if (self.width) {
+                self.div.css('width', self.width);
+            }
+            if (self.height) {
+                self.div.css('height', self.height);
+            }
+            if (self.z) {
+                self.div.css({
+                    position: 'absolute',
+                    left: self.x,
+                    top: self.y,
+                    'z-index': self.z
+                });
+            }
+            if (self.z && (self.x === undefined || self.y === undefined)) {
+                self.autoPos(self.width, self.height);
+            }
+            if (options.cls) {
+                self.div.addClass(options.cls);
+            }
+            if (options.shadowMode) {
+                self.div.addClass('ke-shadow');
+            }
+            if (options.css) {
+                self.div.css(options.css);
+            }
+            if (options.src) {
+                K(options.src).replaceWith(self.div);
+            } else {
+                K(self.doc.body).append(self.div);
+            }
+            if (options.html) {
+                self.div.html(options.html);
+            }
+            if (options.autoScroll) {
+                if (_IE && _V < 7 || _QUIRKS) {
+                    var scrollPos = _getScrollPos();
+                    K(self.win).bind('scroll', function (e) {
+                        var pos = _getScrollPos(),
+                            diffX = pos.x - scrollPos.x,
+                            diffY = pos.y - scrollPos.y;
+                        self.pos(_removeUnit(self.x) + diffX, _removeUnit(self.y) + diffY, false);
+                    });
+                } else {
+                    self.div.css('position', 'fixed');
+                }
+            }
+        },
+        pos: function (x, y, updateProp) {
+            var self = this;
+            updateProp = _undef(updateProp, true);
+            if (x !== null) {
+                x = x < 0 ? 0 : _addUnit(x);
+                self.div.css('left', x);
+                if (updateProp) {
+                    self.x = x;
+                }
+            }
+            if (y !== null) {
+                y = y < 0 ? 0 : _addUnit(y);
+                self.div.css('top', y);
+                if (updateProp) {
+                    self.y = y;
+                }
+            }
+            return self;
+        },
+        autoPos: function (width, height) {
+            var x, y, self = this,
+                w = _removeUnit(width) || 0,
+                h = _removeUnit(height) || 0,
+                scrollPos = _getScrollPos();
+            if (self._alignEl) {
+                var knode = K(self._alignEl),
+                    pos = knode.pos(),
+                    diffX = _round(knode[0].clientWidth / 2 - w / 2),
+                    diffY = _round(knode[0].clientHeight / 2 - h / 2);
+                x = diffX < 0 ? pos.x : pos.x + diffX;
+            } else {
+                var docEl = _docElement(self.doc);
+                x = _round(scrollPos.x + (docEl.clientWidth - w) / 2);
+                y = _round(scrollPos.y + (docEl.clientHeight - h) / 2);
+            }
+            if (K.options.dialogOffset > 0) {
+                y = scrollPos.y + 20;
+            }
+            if (!(_IE && _V < 7 || _QUIRKS)) {
+                x -= scrollPos.x;
+                y -= scrollPos.y;
+            }
+            return self.pos(x, y);
+        },
+        remove: function () {
+            var self = this;
+            if (_IE && _V < 7 || _QUIRKS) {
+                K(self.win).unbind('scroll');
+            }
+            self.div.remove();
+            _each(self, function (i) {
+                self[i] = null;
+            });
+            return this;
+        },
+        show: function () {
+            this.div.show();
+            return this;
+        },
+        hide: function () {
+            this.div.hide();
+            return this;
+        },
+        draggable: function (options) {
+            var self = this;
+            options = options || {};
+            options.moveEl = self.div;
+            options.moveFn = function (x, y, width, height, diffX, diffY) {
+                if ((x = x + diffX) < 0) {
+                    x = 0;
+                }
+                if ((y = y + diffY) < 0) {
+                    y = 0;
+                }
+                self.pos(x, y);
+            };
+            _drag(options);
+            return self;
+        }
+    });
+
+    function _widget(options) {
+        return new KWidget(options);
+    }
+
+    K.WidgetClass = KWidget;
+    K.widget = _widget;
+
+
+    function _iframeDoc(iframe) {
+        iframe = _get(iframe);
+        return iframe.contentDocument || iframe.contentWindow.document;
+    }
+
+    var html, _direction = '';
+    if ((html = document.getElementsByTagName('html'))) {
+        _direction = html[0].dir;
+    }
+
+    function _getInitHtml(options) {
+        var themesPath = _undef(options.themesPath, ''),
+            bodyClass = options.bodyClass,
+            cssPath = options.cssPath,
+            jsPath = options.jsPath,
+            cssData = options.cssData;
+        var arr = [
+            (_direction === '' ? '<html>' : '<html dir="' + _direction + '">'),
+            '<head><meta charset="utf-8" /><title></title>',
+            '<style>',
+            'html {margin:0;padding:0;}',
+            'body {margin:0;padding:5px;}',
+            'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
+            'body, p, div {word-wrap: break-word;}',
+            'p {margin:5px 0;}',
+            'table {border-collapse:collapse;}',
+            'img {border:0;}',
+            'noscript {display:none;}',
+            'table.ke-zeroborder td {border:1px dotted #AAA;}',
+            'img.ke-flash {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + themesPath + 'common/flash.svg);',
+            '	*background-image:url(' + themesPath + 'common/flash.png);',
+            '	background-size:64px 64px;',
+            '	background-position:center center;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-rm {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + themesPath + 'common/rm.gif);',
+            '	background-position:center center;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-media {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + themesPath + 'common/play.svg);',
+            '	*background-image:url(' + themesPath + 'common/play.png);',
+            '	background-position:center center;',
+            '	background-size:64px 64px;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-anchor {',
+            '	border:1px dashed #666;',
+            '	width:16px;',
+            '	height:16px;',
+            '}',
+            '.ke-script, .ke-noscript, .ke-display-none {',
+            '	display:none;',
+            '	font-size:0;',
+            '	width:0;',
+            '	height:0;',
+            '}',
+            '.ke-pagebreak {',
+            '	border:1px dotted #AAA;',
+            '	font-size:0;',
+            '	height:2px;',
+            '}',
+        ];
+        if (options.showHelpGrid) {
+            arr.push('p,ul,ol,li,div{border: 1px dashed #c1c1c1;}');
+            arr.push('li{margin:5px 0px}');
+            arr.push('div,ul,ol{margin-bottom:10px}');
+        }
+        arr.push('</style>');
+        if (!_isArray(cssPath)) {
+            cssPath = [cssPath];
+        }
+        if (_inArray(K.basePath + 'themes/app.css', cssPath) < 0) {
+            cssPath.push(K.basePath + 'themes/app.css');
+        }
+        _each(cssPath, function (i, path) {
+            if (path) {
+                arr.push('<link href="' + path + '" rel="stylesheet" />');
+            }
+        });
+        if (cssData) {
+            arr.push('<style>' + cssData + '</style>');
+        }
+        arr.push('</head><body ' + (bodyClass ? 'class="' + bodyClass + '"' : '') + '>');
+        if (!_isArray(jsPath)) {
+            jsPath = [jsPath];
+        }
+        _each(jsPath, function (i, path) {
+            if (path) {
+                arr.push('<script type="text/javascript" src="' + path + '"></script>');
+            }
+        });
+        arr.push('</body></html>');
+        return arr.join('\n');
+    }
+
+    function _elementVal(knode, val) {
+        if (knode.hasVal()) {
+            if (val === undefined) {
+                var html = knode.val();
+                html = html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig, '');
+                return html;
+            }
+            return knode.val(val);
+        }
+        return knode.html(val);
+    }
+
+
+    function KEdit(options) {
+        this.init(options);
+    }
+
+    _extend(KEdit, KWidget, {
+        init: function (options) {
+            var self = this;
+            KEdit.parent.init.call(self, options);
+            self.srcElement = K(options.srcElement);
+            self.div.addClass('ke-edit');
+            self.designMode = _undef(options.designMode, true);
+            self.beforeGetHtml = options.beforeGetHtml;
+            self.beforeSetHtml = options.beforeSetHtml;
+            self.afterSetHtml = options.afterSetHtml;
+            var isDocumentDomain = location.protocol != 'res:' && location.host.replace(/:\d+/, '') !== document.domain,
+                srcScript = ('document.open();' +
+                    (isDocumentDomain ? 'document.domain="' + document.domain + '";' : '') +
+                    'document.close();'),
+                iframeSrc = _IE ? ' src="javascript:void(function(){' + encodeURIComponent(srcScript) + '}())"' : '';
+            self.iframe = K('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"' + iframeSrc + '></iframe>').css('width', '100%');
+            self.textarea = K('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css('width', '100%');
+            self.tabIndex = isNaN(parseInt(options.tabIndex, 10)) ? self.srcElement.attr('tabindex') : parseInt(options.tabIndex, 10);
+            self.iframe.attr('tabindex', self.tabIndex);
+            self.textarea.attr('tabindex', self.tabIndex);
+            if (self.width) {
+                self.setWidth(self.width);
+            }
+            if (self.height) {
+                self.setHeight(self.height);
+            }
+            if (self.designMode) {
+                self.textarea.hide();
+            } else {
+                self.iframe.hide();
+            }
+
+            function ready() {
+                var doc = _iframeDoc(self.iframe);
+                doc.open();
+                if (isDocumentDomain) {
+                    doc.domain = document.domain;
+                }
+                doc.write(_getInitHtml(self.options));
+                doc.close();
+                self.win = self.iframe[0].contentWindow;
+                self.doc = doc;
+                var cmd = _cmd(doc);
+                self.afterChange(function (e) {
+                    cmd.selection();
+                });
+                if (_WEBKIT) {
+                    K(doc).click(function (e) {
+                        if (K(e.target).name === 'img') {
+                            cmd.selection(true);
+                            cmd.range.selectNode(e.target);
+                            cmd.select();
+                        }
+                    });
+                }
+                if (_IE) {
+                    self._mousedownHandler = function () {
+                        var newRange = cmd.range.cloneRange();
+                        newRange.shrink();
+                        if (newRange.isControl()) {
+                            self.blur();
+                        }
+                    };
+                    K(document).mousedown(self._mousedownHandler);
+                    K(doc).keydown(function (e) {
+                        if (e.which == 8) {
+                            cmd.selection();
+                            var rng = cmd.range;
+                            if (rng.isControl()) {
+                                rng.collapse(true);
+                                K(rng.startContainer.childNodes[rng.startOffset]).remove();
+                                e.preventDefault();
+                            }
+                        }
+                    });
+                }
+                self.cmd = cmd;
+                self.html(_elementVal(self.srcElement));
+                if (_IE) {
+                    doc.body.disabled = true;
+                    doc.body.contentEditable = true;
+                    doc.body.removeAttribute('disabled');
+                } else {
+                    doc.designMode = 'on';
+                }
+                if (options.afterCreate) {
+                    options.afterCreate.call(self);
+                }
+            }
+
+            if (isDocumentDomain) {
+                self.iframe.bind('load', function (e) {
+                    self.iframe.unbind('load');
+                    if (_IE) {
+                        ready();
+                    } else {
+                        setTimeout(ready, 0);
+                    }
+                });
+            }
+            self.div.append(self.iframe);
+            self.div.append(self.textarea);
+            self.srcElement.hide();
+            !isDocumentDomain && ready();
+        },
+        setWidth: function (val) {
+            var self = this;
+            val = _addUnit(val);
+            self.width = val;
+            self.div.css('width', val);
+            return self;
+        },
+        setHeight: function (val) {
+            var self = this;
+            val = _addUnit(val);
+            self.height = val;
+            self.div.css('height', val);
+            self.iframe.css('height', val);
+            if ((_IE && _V < 8) || _QUIRKS) {
+                val = _addUnit(_removeUnit(val) - 2);
+            }
+            self.textarea.css('height', val);
+            return self;
+        },
+        remove: function () {
+            var self = this, doc = self.doc;
+            K(doc.body).unbind();
+            K(doc).unbind();
+            K(self.win).unbind();
+            if (self._mousedownHandler) {
+                K(document).unbind('mousedown', self._mousedownHandler);
+            }
+            _elementVal(self.srcElement, self.html());
+            self.srcElement.show();
+            self.iframe.unbind();
+            self.textarea.unbind();
+            KEdit.parent.remove.call(self);
+        },
+        html: function (val, isFull) {
+            var self = this, doc = self.doc;
+            if (self.designMode) {
+                var body = doc.body;
+                if (val === undefined) {
+                    if (isFull) {
+                        val = '<!doctype html><html>' + body.parentNode.innerHTML + '</html>';
+                    } else {
+                        val = body.innerHTML;
+                    }
+                    if (self.beforeGetHtml) {
+                        val = self.beforeGetHtml(val);
+                    }
+                    if (_GECKO && val == '<br />') {
+                        val = '';
+                    }
+                    return val;
+                }
+                if (self.beforeSetHtml) {
+                    val = self.beforeSetHtml(val);
+                }
+                if (_IE && _V >= 9) {
+                    val = val.replace(/(<.*?checked=")checked(".*>)/ig, '$1$2');
+                }
+                K(body).html(val);
+                if (self.afterSetHtml) {
+                    self.afterSetHtml();
+                }
+                return self;
+            }
+            if (val === undefined) {
+                return self.textarea.val();
+            }
+            self.textarea.val(val);
+            return self;
+        },
+        design: function (bool) {
+            var self = this, val;
+            if (bool === undefined ? !self.designMode : bool) {
+                if (!self.designMode) {
+                    val = self.html();
+                    self.designMode = true;
+                    self.textarea.hide();
+                    self.html(val);
+                    var iframe = self.iframe;
+                    var height = _removeUnit(self.height);
+                    iframe.height(height - 2);
+                    iframe.show();
+                    setTimeout(function () {
+                        iframe.height(height);
+                    }, 0);
+                }
+            } else {
+                if (self.designMode) {
+                    val = self.html();
+                    self.designMode = false;
+                    self.html(val);
+                    self.iframe.hide();
+                    self.textarea.show();
+                }
+            }
+            return self.focus();
+        },
+        focus: function () {
+            var self = this;
+            self.designMode ? self.win.focus() : self.textarea[0].focus();
+            return self;
+        },
+        blur: function () {
+            var self = this;
+            if (_IE) {
+                var input = K('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />', self.div);
+                self.div.append(input);
+                input[0].focus();
+                input.remove();
+            } else {
+                self.designMode ? self.win.blur() : self.textarea[0].blur();
+            }
+            return self;
+        },
+        afterChange: function (fn) {
+            var self = this, doc = self.doc, body = doc.body;
+            K(doc).keyup(function (e) {
+                if (!e.ctrlKey && !e.altKey && _CHANGE_KEY_MAP[e.which]) {
+                    fn(e);
+                }
+            });
+            K(doc).mouseup(fn).contextmenu(fn);
+            K(self.win).blur(fn);
+
+            function timeoutHandler(e) {
+                setTimeout(function () {
+                    fn(e);
+                }, 1);
+            }
+
+            K(body).bind('paste', timeoutHandler);
+            K(body).bind('cut', timeoutHandler);
+            return self;
+        }
+    });
+
+    function _edit(options) {
+        return new KEdit(options);
+    }
+
+    K.EditClass = KEdit;
+    K.edit = _edit;
+    K.iframeDoc = _iframeDoc;
+
+
+    function _selectToolbar(name, fn) {
+        var self = this,
+            knode = self.get(name);
+        if (knode) {
+            if (knode.hasClass('ke-disabled')) {
+                return;
+            }
+            fn(knode);
+        }
+    }
+
+
+    function KToolbar(options) {
+        this.init(options);
+    }
+
+    _extend(KToolbar, KWidget, {
+        init: function (options) {
+            var self = this;
+            KToolbar.parent.init.call(self, options);
+            self.disableMode = _undef(options.disableMode, false);
+            self.noDisableItemMap = _toMap(_undef(options.noDisableItems, []));
+            self._itemMap = {};
+            self.div.addClass('ke-toolbar').bind('contextmenu,mousedown,mousemove', function (e) {
+                e.preventDefault();
+            }).attr('unselectable', 'on');
+
+            function find(target) {
+                var knode = K(target);
+                if (knode.hasClass('ke-outline')) {
+                    return knode;
+                }
+                if (knode.hasClass('ke-toolbar-icon')) {
+                    return knode.parent();
+                }
+            }
+
+            function hover(e, method) {
+                var knode = find(e.target);
+                if (knode) {
+                    if (knode.hasClass('ke-disabled')) {
+                        return;
+                    }
+                    if (knode.hasClass('ke-selected')) {
+                        return;
+                    }
+                    knode[method]('ke-on');
+                }
+            }
+
+            self.div.mouseover(function (e) {
+                hover(e, 'addClass');
+            })
+                .mouseout(function (e) {
+                    hover(e, 'removeClass');
+                })
+                .click(function (e) {
+                    var knode = find(e.target);
+                    if (knode) {
+                        if (knode.hasClass('ke-disabled')) {
+                            return;
+                        }
+                        self.options.click.call(this, e, knode.attr('data-name'));
+                    }
+                });
+        },
+        get: function (name) {
+            if (this._itemMap[name]) {
+                return this._itemMap[name];
+            }
+            return (this._itemMap[name] = K('span.ke-icon-' + name, this.div).parent());
+        },
+        select: function (name) {
+            _selectToolbar.call(this, name, function (knode) {
+                knode.addClass('ke-selected');
+            });
+            return self;
+        },
+        unselect: function (name) {
+            _selectToolbar.call(this, name, function (knode) {
+                knode.removeClass('ke-selected').removeClass('ke-on');
+            });
+            return self;
+        },
+        enable: function (name) {
+            var self = this,
+                knode = name.get ? name : self.get(name);
+            if (knode) {
+                knode.removeClass('ke-disabled');
+                knode.opacity(1);
+            }
+            return self;
+        },
+        disable: function (name) {
+            var self = this,
+                knode = name.get ? name : self.get(name);
+            if (knode) {
+                knode.removeClass('ke-selected').addClass('ke-disabled');
+                knode.opacity(0.5);
+            }
+            return self;
+        },
+        disableAll: function (bool, noDisableItems) {
+            var self = this, map = self.noDisableItemMap, item;
+            if (noDisableItems) {
+                map = _toMap(noDisableItems);
+            }
+            if (bool === undefined ? !self.disableMode : bool) {
+                K('span.ke-outline', self.div).each(function () {
+                    var knode = K(this),
+                        name = knode[0].getAttribute('data-name', 2);
+                    if (!map[name]) {
+                        self.disable(knode);
+                    }
+                });
+                self.disableMode = true;
+            } else {
+                K('span.ke-outline', self.div).each(function () {
+                    var knode = K(this),
+                        name = knode[0].getAttribute('data-name', 2);
+                    if (!map[name]) {
+                        self.enable(knode);
+                    }
+                });
+                self.disableMode = false;
+            }
+            return self;
+        }
+    });
+
+    function _toolbar(options) {
+        return new KToolbar(options);
+    }
+
+    K.ToolbarClass = KToolbar;
+    K.toolbar = _toolbar;
+
+
+    function KMenu(options) {
+        this.init(options);
+    }
+
+    _extend(KMenu, KWidget, {
+        init: function (options) {
+            var self = this;
+            options.z = options.z || 811213;
+            KMenu.parent.init.call(self, options);
+            self.centerLineMode = _undef(options.centerLineMode, true);
+            self.div.addClass('ke-menu ke-menu-' + options.themeType).bind('click,mousedown', function (e) {
+                e.stopPropagation();
+            }).attr('unselectable', 'on');
+        },
+        addItem: function (item) {
+            var self = this;
+            if (item.title === '-') {
+                self.div.append(K('<div class="ke-menu-separator"></div>'));
+                return;
+            }
+            var itemDiv = K('<div class="ke-menu-item" unselectable="on"></div>'),
+                leftDiv = K('<div class="ke-inline-block ke-menu-item-left"></div>'),
+                rightDiv = K('<div class="ke-inline-block ke-menu-item-right"></div>'),
+                height = _addUnit(item.height),
+                iconClass = _undef(item.iconClass, '');
+            self.div.append(itemDiv);
+            if (height) {
+                itemDiv.css('height', height);
+                rightDiv.css('line-height', height);
+            }
+            var centerDiv;
+            if (self.centerLineMode) {
+                centerDiv = K('<div class="ke-inline-block ke-menu-item-center"></div>');
+                if (height) {
+                    centerDiv.css('height', height);
+                }
+            }
+            itemDiv.mouseover(function (e) {
+                K(this).addClass('ke-menu-item-on');
+                if (centerDiv) {
+                    centerDiv.addClass('ke-menu-item-center-on');
+                }
+            })
+                .mouseout(function (e) {
+                    K(this).removeClass('ke-menu-item-on');
+                    if (centerDiv) {
+                        centerDiv.removeClass('ke-menu-item-center-on');
+                    }
+                })
+                .click(function (e) {
+                    item.click.call(K(this));
+                    e.stopPropagation();
+                })
+                .append(leftDiv);
+            if (centerDiv) {
+                itemDiv.append(centerDiv);
+            }
+            itemDiv.append(rightDiv);
+            if (item.checked) {
+                iconClass = 'ke-icon-checked';
+            }
+            if (iconClass !== '') {
+                leftDiv.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url ' + iconClass + '"></span>');
+            }
+            rightDiv.html(item.title);
+            return self;
+        },
+        remove: function () {
+            var self = this;
+            if (self.options.beforeRemove) {
+                self.options.beforeRemove.call(self);
+            }
+            K('.ke-menu-item', self.div[0]).unbind();
+            KMenu.parent.remove.call(self);
+            return self;
+        }
+    });
+
+    function _menu(options) {
+        return new KMenu(options);
+    }
+
+    K.MenuClass = KMenu;
+    K.menu = _menu;
+
+
+    function KColorPicker(options) {
+        this.init(options);
+    }
+
+    _extend(KColorPicker, KWidget, {
+        init: function (options) {
+            var self = this;
+            options.z = options.z || 811213;
+            KColorPicker.parent.init.call(self, options);
+            var colors = options.colors || [
+                ['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
+                ['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
+                ['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
+                ['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
+            ];
+            self.selectedColor = (options.selectedColor || '').toLowerCase();
+            self._cells = [];
+            self.div.addClass('ke-colorpicker').bind('click,mousedown', function (e) {
+                e.stopPropagation();
+            }).attr('unselectable', 'on');
+            var table = self.doc.createElement('table');
+            self.div.append(table);
+            table.className = 'ke-colorpicker-table';
+            table.cellPadding = 0;
+            table.cellSpacing = 0;
+            table.border = 0;
+            var row = table.insertRow(0), cell = row.insertCell(0);
+            cell.colSpan = colors[0].length;
+            self._addAttr(cell, '', 'ke-colorpicker-cell-top');
+            for (var i = 0; i < colors.length; i++) {
+                row = table.insertRow(i + 1);
+                for (var j = 0; j < colors[i].length; j++) {
+                    cell = row.insertCell(j);
+                    self._addAttr(cell, colors[i][j], 'ke-colorpicker-cell');
+                }
+            }
+        },
+        _addAttr: function (cell, color, cls) {
+            var self = this;
+            cell = K(cell).addClass(cls);
+            if (self.selectedColor === color.toLowerCase()) {
+                cell.addClass('ke-colorpicker-cell-selected');
+            }
+            cell.attr('title', color || self.options.noColor);
+            cell.mouseover(function (e) {
+                K(this).addClass('ke-colorpicker-cell-on');
+            });
+            cell.mouseout(function (e) {
+                K(this).removeClass('ke-colorpicker-cell-on');
+            });
+            cell.click(function (e) {
+                e.stop();
+                self.options.click.call(K(this), color);
+            });
+            if (color) {
+                cell.append(K('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css('background-color', color));
+            } else {
+                cell.html(self.options.noColor);
+            }
+            K(cell).attr('unselectable', 'on');
+            self._cells.push(cell);
+        },
+        remove: function () {
+            var self = this;
+            _each(self._cells, function () {
+                this.unbind();
+            });
+            KColorPicker.parent.remove.call(self);
+            return self;
+        }
+    });
+
+    function _colorpicker(options) {
+        return new KColorPicker(options);
+    }
+
+    K.ColorPickerClass = KColorPicker;
+    K.colorpicker = _colorpicker;
+
+
+    function KUploadButton(options) {
+        this.init(options);
+    }
+
+    _extend(KUploadButton, {
+        init: function (options) {
+            var self = this,
+                button = K(options.button),
+                fieldName = options.fieldName || 'file',
+                url = options.url || '',
+                title = button.val(),
+                extraParams = options.extraParams || {},
+                cls = button[0].className || '',
+                target = options.target || 'kindeditor_upload_iframe_' + new Date().getTime();
+            options.afterError = options.afterError || function (str) {
+                K.options.errorMsgHandler(str, "error");
+            };
+            var hiddenElements = [];
+            for (var k in extraParams) {
+                hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+            }
+            var html = [
+                '<div class="ke-inline-block ' + cls + '">',
+                (options.target ? '' : '<iframe name="' + target + '" style="display:none;"></iframe>'),
+                (options.form ? '<div class="ke-upload-area">' : '<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + url + '">'),
+                '<span class="ke-button-common">',
+                hiddenElements.join(''),
+                '<input type="button" class="ke-button-common ke-button" value="' + title + '" />',
+                '</span>',
+                '<input type="file" class="ke-upload-file" name="' + fieldName + '" tabindex="-1" />',
+                (options.form ? '</div>' : '</form>'),
+                '</div>'].join('');
+            var div = K(html, button.doc);
+            button.hide();
+            button.before(div);
+            self.div = div;
+            self.button = button;
+            self.iframe = options.target ? K('iframe[name="' + target + '"]') : K('iframe', div);
+            self.form = options.form ? K(options.form) : K('form', div);
+            self.fileBox = K('.ke-upload-file', div);
+            var width = options.width || K('.ke-button-common', div).width();
+            K('.ke-upload-area', div).width(width);
+            self.options = options;
+        },
+        submit: function () {
+            var self = this,
+                iframe = self.iframe;
+            if (typeof self.options.beforeUpload == 'function') {
+                var result = self.options.beforeUpload.call(self);
+                if (!result) {
+                    return false;
+                }
+            }
+            iframe.bind('load', function () {
+                iframe.unbind();
+                var tempForm = document.createElement('form');
+                self.fileBox.before(tempForm);
+                K(tempForm).append(self.fileBox);
+                tempForm.reset();
+                K(tempForm).remove(true);
+                var doc = K.iframeDoc(iframe),
+                    pre = doc.getElementsByTagName('pre')[0],
+                    str = '', data;
+                if (pre) {
+                    str = pre.innerHTML;
+                } else {
+                    str = doc.body.innerHTML;
+                }
+                str = _unescape(str);
+                iframe[0].src = 'javascript:false';
+                try {
+                    data = K.json(str);
+                } catch (e) {
+                    self.options.afterError.call(self, '<!doctype html><html>' + doc.body.parentNode.innerHTML + '</html>');
+                }
+                if (data) {
+                    self.options.afterUpload.call(self, data);
+                }
+            });
+            self.form[0].submit();
+            return self;
+        },
+        remove: function () {
+            var self = this;
+            if (self.fileBox) {
+                self.fileBox.unbind();
+            }
+            self.iframe.remove();
+            self.div.remove();
+            self.button.show();
+            return self;
+        }
+    });
+
+    function _uploadbutton(options) {
+        return new KUploadButton(options);
+    }
+
+    K.UploadButtonClass = KUploadButton;
+    K.uploadbutton = _uploadbutton;
+
+
+    function _createButton(arg) {
+        arg = arg || {};
+        var name = arg.name || '',
+            btn = K('<a href="javascript:;" class="ke-dialog-btn" title="' + name + '">' + name + '</a>');
+        if (arg.click) {
+            btn.click(arg.click);
+        }
+        return btn;
+    }
+
+
+    function KDialog(options) {
+        this.init(options);
+    }
+
+    _extend(KDialog, KWidget, {
+        init: function (options) {
+            var self = this;
+            options.z = options.z || 811213;
+            options.shadowMode = false;
+            options.autoScroll = _undef(options.autoScroll, true);
+            KDialog.parent.init.call(self, options);
+            var title = options.title,
+                body = K(options.body, self.doc),
+                previewBtn = options.previewBtn,
+                yesBtn = options.yesBtn,
+                noBtn = options.noBtn,
+                closeBtn = options.closeBtn,
+                showMask = _undef(options.showMask, true);
+            self.div.addClass('ke-dialog ke-animated').bind('click,mousedown', function (e) {
+                e.stopPropagation();
+            });
+            var contentDiv = K('<div class="ke-dialog-content"></div>').appendTo(self.div);
+            var headerDiv = K('<div class="ke-dialog-header"></div>');
+            contentDiv.append(headerDiv);
+            headerDiv.html(title);
+            self.closeIcon = K('<span class="ke-dialog-icon-close" title="' + closeBtn.name + '"></span>').click(closeBtn.click);
+            headerDiv.append(self.closeIcon);
+            self.draggable({
+                clickEl: headerDiv,
+                beforeDrag: options.beforeDrag
+            });
+            var bodyDiv = K('<div class="ke-dialog-body"></div>');
+            contentDiv.append(bodyDiv);
+            bodyDiv.append(body);
+            var footerDiv = K('<div class="ke-dialog-footer"></div>');
+            if (previewBtn || yesBtn || noBtn) {
+                self.div.append(footerDiv);
+                contentDiv.height(self.div.height() - footerDiv.height());
+            }
+            _each([
+                {btn: previewBtn, name: 'preview'},
+                {btn: yesBtn, name: 'yes'},
+                {btn: noBtn, name: 'no'}
+            ], function () {
+                if (this.btn) {
+                    var button = _createButton(this.btn);
+                    button.addClass('ke-dialog-' + this.name);
+                    footerDiv.append(button);
+                }
+            });
+            if (self.height) {
+                bodyDiv.height(_removeUnit(self.height) - headerDiv.height() - footerDiv.height());
+            }
+            self.div.width(self.div.width());
+            self.div.height(self.div.height());
+            self.mask = null;
+            if (showMask) {
+                var docEl = _docElement(self.doc),
+                    docWidth = Math.max(docEl.scrollWidth, docEl.clientWidth),
+                    docHeight = Math.max(docEl.scrollHeight, docEl.clientHeight);
+                self.mask = _widget({
+                    x: 0,
+                    y: 0,
+                    z: self.z - 1,
+                    cls: 'ke-dialog-mask',
+                    width: docWidth,
+                    height: docHeight
+                });
+            }
+            self.autoPos(self.div.width(), self.div.height());
+            self.footerDiv = footerDiv;
+            self.bodyDiv = bodyDiv;
+            self.headerDiv = headerDiv;
+            self.isLoading = false;
+        },
+        setMaskIndex: function (z) {
+            var self = this;
+            self.mask.div.css('z-index', z);
+        },
+        showLoading: function (msg) {
+            msg = _undef(msg, '');
+            var self = this, body = self.bodyDiv;
+            self.loading = K('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:' + Math.round(body.height() / 3) + 'px;">' + msg + '</div></div>')
+                .width(body.width()).height(body.height())
+                .css('top', self.headerDiv.height() + 'px');
+            body.css('visibility', 'hidden').after(self.loading);
+            self.isLoading = true;
+            return self;
+        },
+        hideLoading: function () {
+            this.loading && this.loading.remove();
+            this.bodyDiv.css('visibility', 'visible');
+            this.isLoading = false;
+            return this;
+        },
+        remove: function () {
+            var self = this;
+            if (self.options.beforeRemove) {
+                self.options.beforeRemove.call(self);
+            }
+            self.mask && self.mask.remove();
+            self.iframeMask && self.iframeMask.remove();
+            self.closeIcon.unbind();
+            K('input', self.div).unbind();
+            K('button', self.div).unbind();
+            self.footerDiv.unbind();
+            self.bodyDiv.unbind();
+            self.headerDiv.unbind();
+            K('iframe', self.div).each(function () {
+                K(this).remove();
+            });
+            KDialog.parent.remove.call(self);
+            return self;
+        }
+    });
+
+    function _dialog(options) {
+        return new KDialog(options);
+    }
+
+    K.DialogClass = KDialog;
+    K.dialog = _dialog;
+
+
+    function _tabs(options) {
+        var self = _widget(options),
+            remove = self.remove,
+            afterSelect = options.afterSelect,
+            div = self.div,
+            liList = [];
+        div.addClass('ke-tabs')
+            .bind('contextmenu,mousedown,mousemove', function (e) {
+                e.preventDefault();
+            });
+        var ul = K('<ul class="ke-tabs-ul ke-clearfix"></ul>');
+        div.append(ul);
+        self.add = function (tab) {
+            var li = K('<li class="ke-tabs-li">' + tab.title + '</li>');
+            li.data('tab', tab);
+            liList.push(li);
+            ul.append(li);
+        };
+        self.selectedIndex = 0;
+        self.select = function (index) {
+            self.selectedIndex = index;
+            _each(liList, function (i, li) {
+                li.unbind();
+                if (i === index) {
+                    li.addClass('ke-tabs-li-selected');
+                    K(li.data('tab').panel).show('');
+                } else {
+                    li.removeClass('ke-tabs-li-selected').removeClass('ke-tabs-li-on')
+                        .mouseover(function () {
+                            K(this).addClass('ke-tabs-li-on');
+                        })
+                        .mouseout(function () {
+                            K(this).removeClass('ke-tabs-li-on');
+                        })
+                        .click(function () {
+                            self.select(i);
+                        });
+                    K(li.data('tab').panel).hide();
+                }
+            });
+            if (afterSelect) {
+                afterSelect.call(self, index);
+            }
+        };
+        self.remove = function () {
+            _each(liList, function () {
+                this.remove();
+            });
+            ul.remove();
+            remove.call(self);
+        };
+        return self;
+    }
+
+    K.tabs = _tabs;
+
+
+    function _loadScript(url, fn) {
+        if (K.options.resLoadCache[url]) {
+            return;
+        }
+        var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
+            script = document.createElement('script');
+        head.appendChild(script);
+        K.options.resLoadCache[url] = 1;
+        script.src = url;
+        script.charset = 'utf-8';
+        script.onload = script.onreadystatechange = function () {
+            if (!this.readyState || this.readyState === 'loaded') {
+                if (fn) {
+                    fn();
+                }
+                script.onload = script.onreadystatechange = null;
+                head.removeChild(script);
+            }
+        };
+    }
+
+
+    function _chopQuery(url) {
+        var index = url.indexOf('?');
+        return index > 0 ? url.substr(0, index) : url;
+    }
+
+    function _loadStyle(url) {
+        if (K.options.resLoadCache[url]) {
+            return;
+        }
+        var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
+            link = document.createElement('link'),
+            absoluteUrl = _chopQuery(_formatUrl(url, 'absolute'));
+        var links = K('link[rel="stylesheet"]', head);
+        for (var i = 0, len = links.length; i < len; i++) {
+            if (_chopQuery(_formatUrl(links[i].href, 'absolute')) === absoluteUrl) {
+                return;
+            }
+        }
+        head.appendChild(link);
+        K.options.resLoadCache[url] = 1;
+        link.href = url;
+        link.rel = 'stylesheet';
+    }
+
+    function _ajax(url, fn, method, param, dataType) {
+        method = method || 'GET';
+        dataType = dataType || 'json';
+        var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+        xhr.open(method, url, true);
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState == 4 && xhr.status == 200) {
+                if (fn) {
+                    var data = _trim(xhr.responseText);
+                    if (dataType == 'json') {
+                        data = _json(data);
+                    }
+                    fn(data);
+                }
+            }
+        };
+        if (method == 'POST') {
+            var params = [];
+            _each(param, function (key, val) {
+                params.push(encodeURIComponent(key) + '=' + encodeURIComponent(val));
+            });
+            try {
+                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+            } catch (e) {
+            }
+            xhr.send(params.join('&'));
+        } else {
+            xhr.send(null);
+        }
+    }
+
+    K.loadScript = _loadScript;
+    K.loadStyle = _loadStyle;
+    K.ajax = _ajax;
+
+
+    var _plugins = {};
+
+    function _plugin(name, fn) {
+        if (name === undefined) {
+            return _plugins;
+        }
+        if (!fn) {
+            return _plugins[name];
+        }
+        _plugins[name] = fn;
+    }
+
+    var _language = {};
+
+    function _parseLangKey(key) {
+        var match, ns = 'core';
+        if ((match = /^(\w+)\.(\w+)$/.exec(key))) {
+            ns = match[1];
+            key = match[2];
+        }
+        return {ns: ns, key: key};
+    }
+
+    function _lang(mixed, langType) {
+        langType = langType === undefined ? K.options.langType : langType;
+        if (typeof mixed === 'string') {
+            if (!_language[langType]) {
+                return 'no language';
+            }
+            var pos = mixed.length - 1;
+            if (mixed.substr(pos) === '.') {
+                return _language[langType][mixed.substr(0, pos)];
+            }
+            var obj = _parseLangKey(mixed);
+            return _language[langType][obj.ns][obj.key];
+        }
+        _each(mixed, function (key, val) {
+            var obj = _parseLangKey(key);
+            if (!_language[langType]) {
+                _language[langType] = {};
+            }
+            if (!_language[langType][obj.ns]) {
+                _language[langType][obj.ns] = {};
+            }
+            _language[langType][obj.ns][obj.key] = val;
+        });
+    }
+
+
+    function _getImageFromRange(range, fn) {
+        if (range.collapsed) {
+            return;
+        }
+        range = range.cloneRange().up();
+        var sc = range.startContainer, so = range.startOffset;
+        if (!_WEBKIT && !range.isControl()) {
+            return;
+        }
+        var img = K(sc.childNodes[so]);
+        if (!img || img.name != 'img') {
+            return;
+        }
+        if (fn(img)) {
+            return img;
+        }
+    }
+
+    function _bindContextmenuEvent() {
+        var self = this, doc = self.edit.doc;
+        K(doc).contextmenu(function (e) {
+            if (self.menu) {
+                self.hideMenu();
+            }
+            if (!self.useContextmenu) {
+                e.preventDefault();
+                return;
+            }
+            if (self._contextmenus.length === 0) {
+                return;
+            }
+            var maxWidth = 0, items = [];
+            _each(self._contextmenus, function () {
+                if (this.title == '-') {
+                    items.push(this);
+                    return;
+                }
+                if (this.cond && this.cond()) {
+                    items.push(this);
+                    if (this.width && this.width > maxWidth) {
+                        maxWidth = this.width;
+                    }
+                }
+            });
+            while (items.length > 0 && items[0].title == '-') {
+                items.shift();
+            }
+            while (items.length > 0 && items[items.length - 1].title == '-') {
+                items.pop();
+            }
+            var prevItem = null;
+            _each(items, function (i) {
+                if (this.title == '-' && prevItem.title == '-') {
+                    delete items[i];
+                }
+                prevItem = this;
+            });
+            if (items.length > 0) {
+                e.preventDefault();
+                var pos = K(self.edit.iframe).pos(),
+                    menu = _menu({
+                        x: pos.x + e.clientX,
+                        themeType: self.themeType,
+                        y: pos.y + e.clientY,
+                        width: maxWidth,
+                        css: {visibility: 'hidden'},
+                        shadowMode: self.shadowMode
+                    });
+                _each(items, function () {
+                    if (this.title) {
+                        menu.addItem(this);
+                    }
+                });
+                var docEl = _docElement(menu.doc),
+                    menuHeight = menu.div.height();
+                if (e.clientY + menuHeight >= docEl.clientHeight - 100) {
+                    menu.pos(menu.x, _removeUnit(menu.y) - menuHeight);
+                }
+                menu.div.css('visibility', 'visible');
+                self.menu = menu;
+            }
+        });
+    }
+
+    function _bindNewlineEvent() {
+        var self = this, doc = self.edit.doc, newlineTag = self.newlineTag;
+        if (_IE && newlineTag !== 'br') {
+            return;
+        }
+        if (_GECKO && _V < 3 && newlineTag !== 'p') {
+            return;
+        }
+        if (_OPERA && _V < 9) {
+            return;
+        }
+        var brSkipTagMap = _toMap('h1,h2,h3,h4,h5,h6,pre,li'),
+            pSkipTagMap = _toMap('p,h1,h2,h3,h4,h5,h6,pre,li,blockquote');
+
+        function getAncestorTagName(range) {
+            var ancestor = K(range.commonAncestor());
+            while (ancestor) {
+                if (ancestor.type == 1 && !ancestor.isStyle()) {
+                    break;
+                }
+                ancestor = ancestor.parent();
+            }
+            return ancestor.name;
+        }
+
+        K(doc).keydown(function (e) {
+            if (e.which == 39) {
+                if (self.__startOffset == self.cmd.range.startOffset) {
+                    var tagName = getAncestorTagName(self.cmd.range);
+                    if (tagName != 'body') {
+                        self.appendHtml('<br />')
+                    }
+                } else {
+                    self.__startOffset = self.cmd.range.startOffset
+                }
+                return;
+            }
+            if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
+                return;
+            }
+            self.cmd.selection();
+            var tagName = getAncestorTagName(self.cmd.range);
+            if (tagName == 'marquee' || tagName == 'select') {
+                return;
+            }
+            if (newlineTag === 'br' && !brSkipTagMap[tagName]) {
+                e.preventDefault();
+                self.insertHtml('<br />' + (_IE && _V < 9 ? '' : '\u200B'));
+                return;
+            }
+            if (!pSkipTagMap[tagName]) {
+                _nativeCommand(doc, 'formatblock', '<p>');
+            }
+        });
+        K(doc).keyup(function (e) {
+            if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
+                return;
+            }
+            if (newlineTag == 'br') {
+                return;
+            }
+            if (_GECKO) {
+                var root = self.cmd.commonAncestor('p');
+                var a = self.cmd.commonAncestor('a');
+                if (a && a.text() == '') {
+                    a.remove(true);
+                    self.cmd.range.selectNodeContents(root[0]).collapse(true);
+                    self.cmd.select();
+                }
+                return;
+            }
+            self.cmd.selection();
+            var tagName = getAncestorTagName(self.cmd.range);
+            if (tagName == 'marquee' || tagName == 'select') {
+                return;
+            }
+            if (!pSkipTagMap[tagName]) {
+                _nativeCommand(doc, 'formatblock', '<p>');
+            }
+            var div = self.cmd.commonAncestor('div');
+            if (div) {
+                var p = K('<p></p>'),
+                    child = div[0].firstChild;
+                while (child) {
+                    var next = child.nextSibling;
+                    p.append(child);
+                    child = next;
+                }
+                div.before(p);
+                div.remove();
+                self.cmd.range.selectNodeContents(p[0]);
+                self.cmd.select();
+            }
+        });
+    }
+
+    function _bindTabEvent() {
+        var self = this, doc = self.edit.doc;
+        K(doc).keydown(function (e) {
+            if (e.which == 9) {
+                e.preventDefault();
+                if (self.afterTab) {
+                    self.afterTab.call(self, e);
+                    return;
+                }
+                var cmd = self.cmd, range = cmd.range;
+                range.shrink();
+                if (range.collapsed && range.startContainer.nodeType == 1) {
+                    range.insertNode(K('@&nbsp;', doc)[0]);
+                    cmd.select();
+                }
+                self.insertHtml('&nbsp;&nbsp;&nbsp;&nbsp;');
+            }
+        });
+    }
+
+    function _bindFocusEvent() {
+        var self = this;
+        K(self.edit.textarea[0], self.edit.win).focus(function (e) {
+            if (self.afterFocus) {
+                self.afterFocus.call(self, e);
+            }
+        }).blur(function (e) {
+            if (self.afterBlur) {
+                self.afterBlur.call(self, e);
+            }
+        });
+    }
+
+    function _removeBookmarkTag(html) {
+        return _trim(html.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/ig, ''));
+    }
+
+    function _removeTempTag(html) {
+        return html.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/ig, '');
+    }
+
+    function _addBookmarkToStack(stack, bookmark) {
+        if (stack.length === 0) {
+            stack.push(bookmark);
+            return;
+        }
+        var prev = stack[stack.length - 1];
+        if (_removeBookmarkTag(bookmark.html) !== _removeBookmarkTag(prev.html)) {
+            stack.push(bookmark);
+        }
+    }
+
+
+    function _undoToRedo(fromStack, toStack) {
+        var self = this, edit = self.edit,
+            body = edit.doc.body,
+            range, bookmark;
+        if (fromStack.length === 0) {
+            return self;
+        }
+        if (edit.designMode) {
+            range = self.cmd.range;
+            bookmark = range.createBookmark(true);
+            bookmark.html = body.innerHTML;
+        } else {
+            bookmark = {
+                html: body.innerHTML
+            };
+        }
+        _addBookmarkToStack(toStack, bookmark);
+        var prev = fromStack.pop();
+        if (_removeBookmarkTag(bookmark.html) === _removeBookmarkTag(prev.html) && fromStack.length > 0) {
+            prev = fromStack.pop();
+        }
+        if (edit.designMode) {
+            edit.html(prev.html);
+            if (prev.start) {
+                range.moveToBookmark(prev);
+                self.select();
+            }
+        } else {
+            K(body).html(_removeBookmarkTag(prev.html));
+        }
+        return self;
+    }
+
+    function KEditor(options) {
+        var self = this;
+        self.options = {};
+
+        function setOption(key, val) {
+            if (KEditor.prototype[key] === undefined) {
+                self[key] = val;
+            }
+            self.options[key] = val;
+        }
+
+        _each(options, function (key, val) {
+            setOption(key, options[key]);
+        });
+        _each(K.options, function (key, val) {
+            if (self[key] === undefined) {
+                setOption(key, val);
+            }
+        });
+        var se = K(self.srcElement || '<textarea/>');
+        if (!self.width) {
+            self.width = se[0].style.width || se.width();
+        }
+        if (!self.height) {
+            self.height = se[0].style.height || se.height();
+        }
+        setOption('width', _undef(self.width, self.minWidth));
+        setOption('height', _undef(self.height, self.minHeight));
+        setOption('width', _addUnit(self.width));
+        setOption('height', _addUnit(self.height));
+        if (_MOBILE && (!_IOS || _V < 534)) {
+            self.designMode = false;
+        }
+        self.srcElement = se;
+        self.initContent = '';
+        self.plugin = {};
+        self.isCreated = false;
+        self._handlers = {};
+        self._contextmenus = [];
+        self._undoStack = [];
+        self._redoStack = [];
+        self._firstAddBookmark = true;
+        self.menu = self.contextmenu = null;
+        self.dialogs = [];
+    }
+
+    KEditor.prototype = {
+        lang: function (mixed) {
+            return _lang(mixed, this.langType);
+        },
+        loadPlugin: function (name, fn) {
+            var self = this;
+            var _pluginStatus = this._pluginStatus;
+            if (!_pluginStatus) {
+                _pluginStatus = this._pluginStatus = {};
+            }
+            if (_plugins[name]) {
+                if (!_isFunction(_plugins[name])) {
+                    setTimeout(function () {
+                        self.loadPlugin(name, fn);
+                    }, 100);
+                    return self;
+                }
+                if (!_pluginStatus[name]) {
+                    _plugins[name].call(self, KindEditor);
+                    _pluginStatus[name] = 'inited';
+                }
+                if (fn) {
+                    fn.call(self);
+                }
+                return self;
+            }
+            _plugins[name] = 'loading';
+            _loadScript(self.pluginsPath + name + '/' + name + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function () {
+                setTimeout(function () {
+                    if (_plugins[name]) {
+                        self.loadPlugin(name, fn);
+                    }
+                }, 0);
+            });
+            return self;
+        },
+        handler: function (key, fn) {
+            var self = this;
+            if (!self._handlers[key]) {
+                self._handlers[key] = [];
+            }
+            if (_isFunction(fn)) {
+                self._handlers[key].push(fn);
+                return self;
+            }
+            _each(self._handlers[key], function () {
+                fn = this.call(self, fn);
+            });
+            return fn;
+        },
+        clickToolbar: function (name, fn) {
+            var self = this, key = 'clickToolbar' + name;
+            if (fn === undefined) {
+                if (self._handlers[key]) {
+                    return self.handler(key);
+                }
+                self.loadPlugin(name, function () {
+                    self.handler(key);
+                });
+                return self;
+            }
+            return self.handler(key, fn);
+        },
+        updateState: function () {
+            var self = this;
+            _each(('justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,' +
+                'subscript,superscript,bold,italic,underline,strikethrough').split(','), function (i, name) {
+                self.cmd.state(name) ? self.toolbar.select(name) : self.toolbar.unselect(name);
+            });
+            return self;
+        },
+        addContextmenu: function (item) {
+            this._contextmenus.push(item);
+            return this;
+        },
+        afterCreate: function (fn) {
+            return this.handler('afterCreate', fn);
+        },
+        beforeRemove: function (fn) {
+            return this.handler('beforeRemove', fn);
+        },
+        beforeGetHtml: function (fn) {
+            return this.handler('beforeGetHtml', fn);
+        },
+        beforeSetHtml: function (fn) {
+            return this.handler('beforeSetHtml', fn);
+        },
+        afterSetHtml: function (fn) {
+            return this.handler('afterSetHtml', fn);
+        },
+        create: function () {
+            var self = this, fullscreenMode = self.fullscreenMode;
+            if (self.isCreated) {
+                return self;
+            }
+            if (self.srcElement.data('kindeditor')) {
+                return self;
+            }
+            self.srcElement.data('kindeditor', 'true');
+            if (fullscreenMode) {
+                _docElement().style.overflow = 'hidden';
+            } else {
+                _docElement().style.overflow = '';
+            }
+            var width = fullscreenMode ? _docElement().clientWidth + 'px' : self.width,
+                height = fullscreenMode ? _docElement().clientHeight + 'px' : self.height;
+            if ((_IE && _V < 8) || _QUIRKS) {
+                height = _addUnit(_removeUnit(height) + 2);
+            }
+            var container = self.container = K(self.layout);
+            if (fullscreenMode) {
+                K(document.body).append(container);
+            } else {
+                self.srcElement.before(container);
+            }
+            var toolbarDiv = K('.toolbar', container),
+                editDiv = K('.edit', container),
+                statusbar = self.statusbar = K('.statusbar', container);
+            container.removeClass('container')
+                .addClass('ke-container ke-container-' + self.themeType).css('width', width);
+            if (fullscreenMode) {
+                container.css({
+                    position: 'absolute',
+                    left: 0,
+                    top: 0,
+                    'z-index': 811211
+                });
+                if (!_GECKO) {
+                    self._scrollPos = _getScrollPos();
+                }
+                window.scrollTo(0, 0);
+                K(document.body).css({
+                    'height': '1px',
+                    'overflow': 'hidden'
+                });
+                K(document.body.parentNode).css('overflow', 'hidden');
+                self._fullscreenExecuted = true;
+            } else {
+                if (self._fullscreenExecuted) {
+                    K(document.body).css({
+                        'height': '',
+                        'overflow': ''
+                    });
+                    K(document.body.parentNode).css('overflow', '');
+                }
+                if (self._scrollPos) {
+                    window.scrollTo(self._scrollPos.x, self._scrollPos.y);
+                }
+            }
+            var htmlList = [];
+            K.each(self.items, function (i, name) {
+                if (name == '|') {
+                    htmlList.push('<span class="ke-inline-block ke-separator"></span>');
+                } else if (name == '/') {
+                    htmlList.push('<div class="ke-hr"></div>');
+                } else {
+                    htmlList.push('<span class="ke-outline" data-name="' + name + '" title="' + self.lang(name) + '" unselectable="on">');
+                    htmlList.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-' + name + '" unselectable="on"></span></span>');
+                }
+            });
+            var toolbar = self.toolbar = _toolbar({
+                src: toolbarDiv,
+                html: htmlList.join(''),
+                noDisableItems: self.noDisableItems,
+                click: function (e, name) {
+                    e.stop();
+                    if (self.menu) {
+                        var menuName = self.menu.name;
+                        self.hideMenu();
+                        if (menuName === name) {
+                            return;
+                        }
+                    }
+                    self.clickToolbar(name);
+                }
+            });
+            var editHeight = _removeUnit(height) - toolbar.div.height();
+            var edit = self.edit = _edit({
+                height: editHeight > 0 && _removeUnit(height) > self.minHeight ? editHeight : self.minHeight,
+                src: editDiv,
+                srcElement: self.srcElement,
+                designMode: self.designMode,
+                themesPath: self.themesPath,
+                bodyClass: self.bodyClass,
+                cssPath: self.cssPath,
+                jsPath: self.jsPath,
+                showHelpGrid: self.showHelpGrid,
+                cssData: self.cssData,
+                beforeGetHtml: function (html) {
+                    html = self.beforeGetHtml(html);
+                    html = _removeBookmarkTag(_removeTempTag(html));
+                    return _formatHtml(html, self.filterMode ? self.htmlTags : null, self.urlType, self.wellFormatMode, self.indentChar);
+                },
+                beforeSetHtml: function (html) {
+                    html = _formatHtml(html, self.filterMode ? self.htmlTags : null, '', false);
+                    return self.beforeSetHtml(html);
+                },
+                afterSetHtml: function () {
+                    self.edit = edit = this;
+                    self.afterSetHtml();
+                },
+                afterCreate: function () {
+                    self.edit = edit = this;
+                    self.cmd = edit.cmd;
+                    self._docMousedownFn = function (e) {
+                        if (self.menu) {
+                            self.hideMenu();
+                        }
+                    };
+                    K(edit.doc, document).mousedown(self._docMousedownFn);
+                    _bindContextmenuEvent.call(self);
+                    _bindNewlineEvent.call(self);
+                    _bindTabEvent.call(self);
+                    _bindFocusEvent.call(self);
+                    edit.afterChange(function (e) {
+                        if (!edit.designMode) {
+                            return;
+                        }
+                        self.updateState();
+                        self.addBookmark();
+                        if (self.options.afterChange) {
+                            self.options.afterChange.call(self);
+                        }
+                    });
+                    edit.textarea.keyup(function (e) {
+                        if (!e.ctrlKey && !e.altKey && _INPUT_KEY_MAP[e.which]) {
+                            if (self.options.afterChange) {
+                                self.options.afterChange.call(self);
+                            }
+                        }
+                    });
+                    if (self.readonlyMode) {
+                        self.readonly();
+                    }
+                    self.isCreated = true;
+                    if (self.initContent === '') {
+                        self.initContent = self.html();
+                    }
+                    if (self._undoStack.length > 0) {
+                        var prev = self._undoStack.pop();
+                        if (prev.start) {
+                            self.html(prev.html);
+                            edit.cmd.range.moveToBookmark(prev);
+                            self.select();
+                        }
+                    }
+                    self.afterCreate();
+                    if (self.options.afterCreate) {
+                        self.options.afterCreate.call(self);
+                    }
+                }
+            });
+            statusbar.removeClass('statusbar').addClass('ke-statusbar')
+                .append('<span class="ke-inline-block ke-statusbar-center-icon"></span>')
+                .append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');
+            if (self._fullscreenResizeHandler) {
+                K(window).unbind('resize', self._fullscreenResizeHandler);
+                self._fullscreenResizeHandler = null;
+            }
+
+            function initResize() {
+                if (statusbar.height() === 0) {
+                    setTimeout(initResize, 100);
+                    return;
+                }
+                self.resize(width, height, false);
+            }
+
+            initResize();
+            if (fullscreenMode) {
+                self._fullscreenResizeHandler = function (e) {
+                    if (self.isCreated) {
+                        self.resize(_docElement().clientWidth, _docElement().clientHeight, false);
+                    }
+                };
+                K(window).bind('resize', self._fullscreenResizeHandler);
+                toolbar.select('fullscreen');
+                statusbar.first().css('visibility', 'hidden');
+                statusbar.last().css('visibility', 'hidden');
+            } else {
+                if (_GECKO) {
+                    K(window).bind('scroll', function (e) {
+                        self._scrollPos = _getScrollPos();
+                    });
+                }
+                if (self.resizeType > 0) {
+                    _drag({
+                        moveEl: container,
+                        clickEl: statusbar,
+                        moveFn: function (x, y, width, height, diffX, diffY) {
+                            height += diffY;
+                            self.resize(null, height);
+                        }
+                    });
+                } else {
+                    statusbar.first().css('visibility', 'hidden');
+                }
+                if (self.resizeType === 2) {
+                    _drag({
+                        moveEl: container,
+                        clickEl: statusbar.last(),
+                        moveFn: function (x, y, width, height, diffX, diffY) {
+                            width += diffX;
+                            height += diffY;
+                            self.resize(width, height);
+                        }
+                    });
+                } else {
+                    statusbar.last().css('visibility', 'hidden');
+                }
+            }
+            return self;
+        },
+        remove: function () {
+            var self = this;
+            if (!self.isCreated) {
+                return self;
+            }
+            self.beforeRemove();
+            self.srcElement.data('kindeditor', '');
+            if (self.menu) {
+                self.hideMenu();
+            }
+            _each(self.dialogs, function () {
+                self.hideDialog();
+            });
+            K(document).unbind('mousedown', self._docMousedownFn);
+            self.toolbar.remove();
+            self.edit.remove();
+            self.statusbar.last().unbind();
+            self.statusbar.unbind();
+            self.container.remove();
+            self.container = self.toolbar = self.edit = self.menu = null;
+            self.dialogs = [];
+            self.isCreated = false;
+            return self;
+        },
+        resize: function (width, height, updateProp) {
+            var self = this;
+            updateProp = _undef(updateProp, true);
+            if (width) {
+                if (!/%/.test(width)) {
+                    width = _removeUnit(width);
+                    width = width < self.minWidth ? self.minWidth : width;
+                }
+                self.container.css('width', _addUnit(width));
+                if (updateProp) {
+                    self.width = _addUnit(width);
+                }
+            }
+            if (height) {
+                height = _removeUnit(height);
+                var editHeight = _removeUnit(height) - self.toolbar.div.height() - self.statusbar.height();
+                editHeight = editHeight < self.minHeight ? self.minHeight : editHeight;
+                self.edit.setHeight(editHeight);
+                if (updateProp) {
+                    self.height = _addUnit(height);
+                }
+            }
+            return self;
+        },
+        select: function () {
+            this.isCreated && this.cmd.select();
+            return this;
+        },
+        html: function (val) {
+            var self = this;
+            if (val === undefined) {
+                return self.isCreated ? self.edit.html() : _elementVal(self.srcElement);
+            }
+            self.isCreated ? self.edit.html(val) : _elementVal(self.srcElement, val);
+            if (self.isCreated) {
+                self.cmd.selection();
+            }
+            return self;
+        },
+        fullHtml: function () {
+            return this.isCreated ? this.edit.html(undefined, true) : '';
+        },
+        text: function (val) {
+            var self = this;
+            if (val === undefined) {
+                return _trim(self.html().replace(/<(?!img|embed).*?>/ig, '').replace(/&nbsp;/ig, ' '));
+            } else {
+                return self.html(_escape(val));
+            }
+        },
+        isEmpty: function () {
+            return _trim(this.text().replace(/\r\n|\n|\r/, '')) === '';
+        },
+        isDirty: function () {
+            return _trim(this.initContent.replace(/\r\n|\n|\r|t/g, '')) !== _trim(this.html().replace(/\r\n|\n|\r|t/g, ''));
+        },
+        selectedHtml: function () {
+            var val = this.isCreated ? this.cmd.range.html() : '';
+            val = _removeBookmarkTag(_removeTempTag(val));
+            return val;
+        },
+        count: function (mode) {
+            var self = this;
+            mode = (mode || 'html').toLowerCase();
+            if (mode === 'html') {
+                return self.html().length;
+            }
+            if (mode === 'text') {
+                return self.text().replace(/<(?:img|embed).*?>/ig, 'K').replace(/\r\n|\n|\r/g, '').length;
+            }
+            return 0;
+        },
+        exec: function (key) {
+            key = key.toLowerCase();
+            var self = this, cmd = self.cmd,
+                changeFlag = _inArray(key, 'selectall,copy,paste,print'.split(',')) < 0;
+            if (changeFlag) {
+                self.addBookmark(false);
+            }
+            cmd[key].apply(cmd, _toArray(arguments, 1));
+            if (changeFlag) {
+                self.updateState();
+                self.addBookmark(false);
+                if (self.options.afterChange) {
+                    self.options.afterChange.call(self);
+                }
+            }
+            return self;
+        },
+        insertHtml: function (val, quickMode) {
+            if (!this.isCreated) {
+                return this;
+            }
+            val = this.beforeSetHtml(val);
+            this.exec('inserthtml', val, quickMode);
+            return this;
+        },
+        appendHtml: function (val) {
+            this.html(this.html() + val);
+            if (this.isCreated) {
+                var cmd = this.cmd;
+                cmd.range.selectNodeContents(cmd.doc.body).collapse(false);
+                cmd.select();
+            }
+            return this;
+        },
+        sync: function () {
+            _elementVal(this.srcElement, this.html());
+            return this;
+        },
+        focus: function () {
+            this.isCreated ? this.edit.focus() : this.srcElement[0].focus();
+            return this;
+        },
+        blur: function () {
+            this.isCreated ? this.edit.blur() : this.srcElement[0].blur();
+            return this;
+        },
+        addBookmark: function (checkSize) {
+            checkSize = _undef(checkSize, true);
+            var self = this, edit = self.edit,
+                body = edit.doc.body,
+                html = _removeTempTag(body.innerHTML), bookmark;
+            if (checkSize && self._undoStack.length > 0) {
+                var prev = self._undoStack[self._undoStack.length - 1];
+                if (Math.abs(html.length - _removeBookmarkTag(prev.html).length) < self.minChangeSize) {
+                    return self;
+                }
+            }
+            if (edit.designMode && !self._firstAddBookmark) {
+                var range = self.cmd.range;
+                bookmark = range.createBookmark(true);
+                bookmark.html = _removeTempTag(body.innerHTML);
+                range.moveToBookmark(bookmark);
+            } else {
+                bookmark = {
+                    html: html
+                };
+            }
+            self._firstAddBookmark = false;
+            _addBookmarkToStack(self._undoStack, bookmark);
+            return self;
+        },
+        undo: function () {
+            return _undoToRedo.call(this, this._undoStack, this._redoStack);
+        },
+        redo: function () {
+            return _undoToRedo.call(this, this._redoStack, this._undoStack);
+        },
+        fullscreen: function (bool) {
+            this.fullscreenMode = (bool === undefined ? !this.fullscreenMode : bool);
+            this.addBookmark(false);
+            return this.remove().create();
+        },
+        readonly: function (isReadonly) {
+            isReadonly = _undef(isReadonly, true);
+            var self = this, edit = self.edit, doc = edit.doc;
+            if (self.designMode) {
+                self.toolbar.disableAll(isReadonly, []);
+            } else {
+                _each(self.noDisableItems, function () {
+                    self.toolbar[isReadonly ? 'disable' : 'enable'](this);
+                });
+            }
+            if (_IE) {
+                doc.body.contentEditable = !isReadonly;
+            } else {
+                doc.designMode = isReadonly ? 'off' : 'on';
+            }
+            edit.textarea[0].disabled = isReadonly;
+        },
+        createMenu: function (options) {
+            var self = this,
+                name = options.name,
+                knode = self.toolbar.get(name),
+                pos = knode.pos();
+            options.x = pos.x;
+            options.y = pos.y + knode.height();
+            options.z = self.options.zIndex;
+            options.shadowMode = _undef(options.shadowMode, self.shadowMode);
+            if (options.selectedColor !== undefined) {
+                options.cls = 'ke-colorpicker-' + self.themeType;
+                options.noColor = self.lang('noColor');
+                self.menu = _colorpicker(options);
+            } else {
+                options.cls = 'ke-menu-' + self.themeType;
+                options.centerLineMode = false;
+                self.menu = _menu(options);
+            }
+            return self.menu;
+        },
+        hideMenu: function () {
+            this.menu.remove();
+            this.menu = null;
+            return this;
+        },
+        hideContextmenu: function () {
+            this.contextmenu.remove();
+            this.contextmenu = null;
+            return this;
+        },
+        createDialog: function (options) {
+            var self = this;
+            options.z = self.options.zIndex;
+            options.shadowMode = _undef(options.shadowMode, self.shadowMode);
+            options.closeBtn = _undef(options.closeBtn, {
+                name: self.lang('close'),
+                click: function (e) {
+                    self.hideDialog();
+                    if (_IE && self.cmd) {
+                        self.cmd.select();
+                    }
+                }
+            });
+            options.noBtn = _undef(options.noBtn, {
+                name: self.lang(options.yesBtn ? 'no' : 'close'),
+                click: function (e) {
+                    self.hideDialog();
+                    if (_IE && self.cmd) {
+                        self.cmd.select();
+                    }
+                }
+            });
+            if (self.dialogAlignType != 'page') {
+                options.alignEl = self.container;
+            }
+            options.cls = 'ke-dialog-' + self.themeType;
+            if (self.dialogs.length > 0) {
+                var firstDialog = self.dialogs[0],
+                    parentDialog = self.dialogs[self.dialogs.length - 1];
+                firstDialog.setMaskIndex(parentDialog.z + 2);
+                options.z = parentDialog.z + 3;
+                options.showMask = false;
+            }
+            var dialog = _dialog(options);
+            self.dialogs.push(dialog);
+            return dialog;
+        },
+        hideDialog: function () {
+            var self = this;
+            if (self.dialogs.length > 0) {
+                self.dialogs.pop().remove();
+            }
+            if (self.dialogs.length > 0) {
+                var firstDialog = self.dialogs[0],
+                    parentDialog = self.dialogs[self.dialogs.length - 1];
+                firstDialog.setMaskIndex(parentDialog.z - 1);
+            }
+            return self;
+        },
+        errorDialog: function (html) {
+            var self = this;
+            var dialog = self.createDialog({
+                width: 750,
+                title: self.lang('uploadError'),
+                body: '<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'
+            });
+            var iframe = K('iframe', dialog.div), doc = K.iframeDoc(iframe);
+            doc.open();
+            doc.write(html);
+            doc.close();
+            K(doc.body).css('background-color', '#FFF');
+            iframe[0].contentWindow.focus();
+            return self;
+        }
+    };
+
+    function _editor(options) {
+        return new KEditor(options);
+    }
+
+    var _instances = [];
+
+    function _create(expr, options) {
+        options = options || {};
+        options.basePath = _undef(options.basePath, K.basePath);
+        options.themesPath = _undef(options.themesPath, options.basePath + 'themes/');
+        options.langPath = _undef(options.langPath, options.basePath + 'lang/');
+        options.pluginsPath = _undef(options.pluginsPath, options.basePath + 'plugins/');
+        if (typeof options.errorMsgHandler == "function") {
+            K.options.errorMsgHandler = options.errorMsgHandler;
+        }
+        if (_undef(options.loadStyleMode, K.options.loadStyleMode)) {
+            var themeType = _undef(options.themeType, K.options.themeType);
+            _loadStyle(options.themesPath + themeType + '/editor.min.css');
+        }
+
+        function create(editor) {
+            _each(_plugins, function (name, fn) {
+                if (_isFunction(fn)) {
+                    fn.call(editor, KindEditor);
+                    if (!editor._pluginStatus) {
+                        editor._pluginStatus = {};
+                    }
+                    editor._pluginStatus[name] = 'inited';
+                }
+            });
+            return editor.create();
+        }
+
+        var knode = K(expr);
+        if (!knode || knode.length === 0) {
+            return;
+        }
+        if (knode.length > 1) {
+            knode.each(function () {
+                _create(this, options);
+            });
+            return _instances[0];
+        }
+        options.srcElement = knode[0];
+        var editor = new KEditor(options);
+        _instances.push(editor);
+        if (_language[editor.langType]) {
+            return create(editor);
+        }
+        _loadScript(editor.langPath + editor.langType + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function () {
+            create(editor);
+        });
+        return editor;
+    }
+
+    function _eachEditor(expr, fn) {
+        K(expr).each(function (i, el) {
+            K.each(_instances, function (j, editor) {
+                if (editor && editor.srcElement[0] == el) {
+                    fn.call(editor, j);
+                    return false;
+                }
+            });
+        });
+    }
+
+    K.remove = function (expr) {
+        _eachEditor(expr, function (i) {
+            this.remove();
+            _instances.splice(i, 1);
+        });
+    };
+    K.sync = function (expr) {
+        _eachEditor(expr, function () {
+            this.sync();
+        });
+    };
+    K.html = function (expr, val) {
+        _eachEditor(expr, function () {
+            this.html(val);
+        });
+    };
+    K.insertHtml = function (expr, val) {
+        _eachEditor(expr, function () {
+            this.insertHtml(val);
+        });
+    };
+    K.appendHtml = function (expr, val) {
+        _eachEditor(expr, function () {
+            this.appendHtml(val);
+        });
+    };
+
+
+    if (_IE && _V < 7) {
+        _nativeCommand(document, 'BackgroundImageCache', true);
+    }
+    K.EditorClass = KEditor;
+    K.editor = _editor;
+    K.create = _create;
+    K.instances = _instances;
+    K.plugin = _plugin;
+    K.lang = _lang;
+
+
+    _plugin('core', function (K) {
+        var self = this,
+            shortcutKeys = {
+                undo: 'Z', redo: 'Y', bold: 'B', italic: 'I', underline: 'U', print: 'P', selectall: 'A'
+            };
+        self.afterSetHtml(function () {
+            if (self.options.afterChange) {
+                self.options.afterChange.call(self);
+            }
+        });
+        self.afterCreate(function () {
+            if (self.syncType != 'form') {
+                return;
+            }
+            var el = K(self.srcElement), hasForm = false;
+            while ((el = el.parent())) {
+                if (el.name == 'form') {
+                    hasForm = true;
+                    break;
+                }
+            }
+            if (hasForm) {
+                el.bind('submit', function (e) {
+                    self.sync();
+                    K(window).bind('unload', function () {
+                        self.edit.textarea.remove();
+                    });
+                });
+                var resetBtn = K('[type="reset"]', el);
+                resetBtn.click(function () {
+                    self.html(self.initContent);
+                    self.cmd.selection();
+                });
+                self.beforeRemove(function () {
+                    el.unbind();
+                    resetBtn.unbind();
+                });
+            }
+        });
+        self.clickToolbar('source', function () {
+            if (self.edit.designMode) {
+                self.toolbar.disableAll(true);
+                self.edit.design(false);
+                self.toolbar.select('source');
+            } else {
+                self.toolbar.disableAll(false);
+                self.edit.design(true);
+                self.toolbar.unselect('source');
+                if (_GECKO) {
+                    setTimeout(function () {
+                        self.cmd.selection();
+                    }, 0);
+                } else {
+                    self.cmd.selection();
+                }
+            }
+            self.designMode = self.edit.designMode;
+        });
+        self.afterCreate(function () {
+            if (!self.designMode) {
+                self.toolbar.disableAll(true).select('source');
+            }
+        });
+        self.clickToolbar('fullscreen', function () {
+            self.fullscreen();
+        });
+        if (self.fullscreenShortcut) {
+            var loaded = false;
+            self.afterCreate(function () {
+                K(self.edit.doc, self.edit.textarea).keyup(function (e) {
+                    if (e.which == 27) {
+                        setTimeout(function () {
+                            self.fullscreen();
+                        }, 0);
+                    }
+                });
+                if (loaded) {
+                    if (_IE && !self.designMode) {
+                        return;
+                    }
+                    self.focus();
+                }
+                if (!loaded) {
+                    loaded = true;
+                }
+            });
+        }
+        _each('undo,redo'.split(','), function (i, name) {
+            if (shortcutKeys[name]) {
+                self.afterCreate(function () {
+                    _ctrl(this.edit.doc, shortcutKeys[name], function () {
+                        self.clickToolbar(name);
+                    });
+                });
+            }
+            self.clickToolbar(name, function () {
+                self[name]();
+            });
+        });
+        self.clickToolbar('formatblock', function () {
+            var blocks = self.lang('formatblock.formatBlock'),
+                heights = {
+                    h1: 28,
+                    h2: 24,
+                    h3: 18,
+                    H4: 14,
+                    p: 12
+                },
+                curVal = self.cmd.val('formatblock'),
+                menu = self.createMenu({
+                    name: 'formatblock',
+                    width: self.langType == 'en' ? 200 : 150
+                });
+            _each(blocks, function (key, val) {
+                var style = 'font-size:' + heights[key] + 'px;';
+                if (key.charAt(0) === 'h') {
+                    style += 'font-weight:bold;';
+                }
+                menu.addItem({
+                    title: '<span style="' + style + '" unselectable="on">' + val + '</span>',
+                    height: heights[key] + 12,
+                    checked: (curVal === key || curVal === val),
+                    click: function () {
+                        self.select().exec('formatblock', '<' + key + '>').hideMenu();
+                    }
+                });
+            });
+        });
+        self.clickToolbar('fontname', function () {
+            var curVal = self.cmd.val('fontname'),
+                menu = self.createMenu({
+                    name: 'fontname',
+                    width: 150
+                });
+            console
+            _each(self.lang('fontname.fontName'), function (key, val) {
+                menu.addItem({
+                    title: '<span style="font-family: ' + key + ';" unselectable="on">' + val + '</span>',
+                    checked: (curVal === key.toLowerCase() || curVal === val.toLowerCase()),
+                    click: function () {
+                        self.exec('fontname', key).hideMenu();
+                    }
+                });
+            });
+        });
+        self.clickToolbar('fontsize', function () {
+            var curVal = self.cmd.val('fontsize'),
+                menu = self.createMenu({
+                    name: 'fontsize',
+                    width: 150
+                });
+            _each(self.fontSizeTable, function (i, val) {
+                menu.addItem({
+                    title: '<span style="font-size:' + val + ';" unselectable="on">' + val + '</span>',
+                    height: _removeUnit(val) + 12,
+                    checked: curVal === val,
+                    click: function () {
+                        self.exec('fontsize', val).hideMenu();
+                    }
+                });
+            });
+        });
+        _each('forecolor,hilitecolor'.split(','), function (i, name) {
+            self.clickToolbar(name, function () {
+                self.createMenu({
+                    name: name,
+                    selectedColor: self.cmd.val(name) || 'default',
+                    colors: self.colorTable,
+                    click: function (color) {
+                        self.exec(name, color).hideMenu();
+                    }
+                });
+            });
+        });
+        _each(('cut,copy,paste').split(','), function (i, name) {
+            self.clickToolbar(name, function () {
+                self.focus();
+                try {
+                    self.exec(name, null);
+                } catch (e) {
+                    K.options.errorMsgHandler(self.lang(name + 'Error'), "error");
+                }
+            });
+        });
+        self.clickToolbar('about', function () {
+            var html = '<div style="margin:20px;">' +
+                '<div>NKeditor ' + _VERSION + '</div>' +
+                '<div>Forked from KindEditor By BlackFox. <a href="http://git.oschina.net/blackfox/kindeditor">Git项目地址</a>.</div>' +
+                '</div>';
+            self.createDialog({
+                name: 'about',
+                width: 350,
+                title: self.lang('about'),
+                body: html
+            });
+        });
+        self.plugin.getSelectedLink = function () {
+            return self.cmd.commonAncestor('a');
+        };
+        self.plugin.getSelectedImage = function () {
+            return _getImageFromRange(self.edit.cmd.range, function (img) {
+                return !/^ke-\w+$/i.test(img[0].className);
+            });
+        };
+        self.plugin.getSelectedFlash = function () {
+            return _getImageFromRange(self.edit.cmd.range, function (img) {
+                return img[0].className == 'ke-flash';
+            });
+        };
+        self.plugin.getSelectedMedia = function () {
+            return _getImageFromRange(self.edit.cmd.range, function (img) {
+                return img[0].className == 'ke-media' || img[0].className == 'ke-rm';
+            });
+        };
+        self.plugin.getSelectedAnchor = function () {
+            return _getImageFromRange(self.edit.cmd.range, function (img) {
+                return img[0].className == 'ke-anchor';
+            });
+        };
+        _each('link,image,flash,media,anchor'.split(','), function (i, name) {
+            var uName = name.charAt(0).toUpperCase() + name.substr(1);
+            _each('edit,delete'.split(','), function (j, val) {
+                self.addContextmenu({
+                    title: self.lang(val + uName),
+                    click: function () {
+                        self.loadPlugin(name, function () {
+                            self.plugin[name][val]();
+                            self.hideMenu();
+                        });
+                    },
+                    cond: self.plugin['getSelected' + uName],
+                    width: 150,
+                    iconClass: val == 'edit' ? 'ke-icon-' + name : undefined
+                });
+            });
+            self.addContextmenu({title: '-'});
+        });
+        self.plugin.getSelectedTable = function () {
+            return self.cmd.commonAncestor('table');
+        };
+        self.plugin.getSelectedRow = function () {
+            return self.cmd.commonAncestor('tr');
+        };
+        self.plugin.getSelectedCell = function () {
+            return self.cmd.commonAncestor('td');
+        };
+        _each(('prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,' +
+            'rowsplit,colsplit,coldelete,rowdelete,insert,delete').split(','), function (i, val) {
+            var cond = _inArray(val, ['prop', 'delete']) < 0 ? self.plugin.getSelectedCell : self.plugin.getSelectedTable;
+            self.addContextmenu({
+                title: self.lang('table' + val),
+                click: function () {
+                    self.loadPlugin('table', function () {
+                        self.plugin.table[val]();
+                        self.hideMenu();
+                    });
+                },
+                cond: cond,
+                width: 170,
+                iconClass: 'ke-icon-table' + val
+            });
+        });
+        self.addContextmenu({title: '-'});
+        _each(('selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
+            'insertunorderedlist,indent,outdent,subscript,superscript,hr,print,' +
+            'bold,italic,underline,strikethrough,removeformat,unlink').split(','), function (i, name) {
+            if (shortcutKeys[name]) {
+                self.afterCreate(function () {
+                    _ctrl(this.edit.doc, shortcutKeys[name], function () {
+                        self.cmd.selection();
+                        self.clickToolbar(name);
+                    });
+                });
+            }
+            self.clickToolbar(name, function () {
+                self.focus().exec(name, null);
+            });
+        });
+        self.afterCreate(function () {
+            var doc = self.edit.doc, cmd, bookmark, div,
+                cls = '__kindeditor_paste__', pasting = false;
+
+            function movePastedData() {
+                cmd.range.moveToBookmark(bookmark);
+                cmd.select();
+                if (_WEBKIT) {
+                    K('div.' + cls, div).each(function () {
+                        K(this).after('<br />').remove(true);
+                    });
+                    K('span.Apple-style-span', div).remove(true);
+                    K('span.Apple-tab-span', div).remove(true);
+                    K('span[style]', div).each(function () {
+                        if (K(this).css('white-space') == 'nowrap') {
+                            K(this).remove(true);
+                        }
+                    });
+                    K('meta', div).remove();
+                }
+                var html = div[0].innerHTML;
+                div.remove();
+                if (html === '') {
+                    return;
+                }
+                if (_WEBKIT) {
+                    html = html.replace(/(<br>)\1/ig, '$1');
+                }
+                if (self.pasteType === 2) {
+                    html = html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig, '');
+                    if (/schemas-microsoft-com|worddocument|mso-\w+/i.test(html)) {
+                        html = _clearMsWord(html, self.filterMode ? self.htmlTags : K.options.htmlTags);
+                    } else {
+                        html = _formatHtml(html, self.filterMode ? self.htmlTags : null);
+                        html = self.beforeSetHtml(html);
+                    }
+                }
+                if (self.pasteType === 1) {
+                    html = html.replace(/&nbsp;/ig, ' ');
+                    html = html.replace(/\n\s*\n/g, '\n');
+                    html = html.replace(/<br[^>]*>/ig, '\n');
+                    html = html.replace(/<\/p><p[^>]*>/ig, '\n');
+                    html = html.replace(/<[^>]+>/g, '');
+                    html = html.replace(/ {2}/g, ' &nbsp;');
+                    if (self.newlineTag == 'p') {
+                        if (/\n/.test(html)) {
+                            html = html.replace(/^/, '<p>').replace(/$/, '<br /></p>').replace(/\n/g, '<br /></p><p>');
+                        }
+                    } else {
+                        html = html.replace(/\n/g, '<br />$&');
+                    }
+                }
+                self.insertHtml(html, true);
+            }
+
+            K(doc.body).bind('paste', function (e) {
+                if (self.pasteType === 0) {
+                    e.stop();
+                    return;
+                }
+                if (pasting) {
+                    return;
+                }
+                pasting = true;
+                K('div.' + cls, doc).remove();
+                cmd = self.cmd.selection();
+                bookmark = cmd.range.createBookmark();
+                div = K('<div class="' + cls + '"></div>', doc).css({
+                    position: 'absolute',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden',
+                    left: '-1981px',
+                    top: K(bookmark.start).pos().y + 'px',
+                    'white-space': 'nowrap'
+                });
+                K(doc.body).append(div);
+                if (_IE) {
+                    var rng = cmd.range.get(true);
+                    rng.moveToElementText(div[0]);
+                    rng.select();
+                    rng.execCommand('paste');
+                    e.preventDefault();
+                } else {
+                    cmd.range.selectNodeContents(div[0]);
+                    cmd.select();
+                    div[0].tabIndex = -1;
+                    div[0].focus();
+                }
+                setTimeout(function () {
+                    movePastedData();
+                    pasting = false;
+                }, 0);
+            });
+        });
+        self.beforeGetHtml(function (html) {
+            if (_IE && _V <= 8) {
+                html = html.replace(/<div\s+[^>]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function (full, tag) {
+                    return unescape(tag);
+                });
+                html = html.replace(/(<input)((?:\s+[^>]*)?>)/ig, function ($0, $1, $2) {
+                    if (!/\s+type="[^"]+"/i.test($0)) {
+                        return $1 + ' type="text"' + $2;
+                    }
+                    return $0;
+                });
+            }
+            return html.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig, function ($0, $1, $2, $3) {
+                return $1 + _unescape($2).replace(/\s+/g, ' ') + $3;
+            })
+                .replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/ig, function (full) {
+                    var imgAttrs = _getAttrList(full);
+                    var styles = _getCssList(imgAttrs.style || '');
+                    var attrs = _mediaAttrs(imgAttrs['data-ke-tag']);
+                    var width = _undef(styles.width, '');
+                    var height = _undef(styles.height, '');
+                    if (/px/i.test(width)) {
+                        width = _removeUnit(width);
+                    }
+                    if (/px/i.test(height)) {
+                        height = _removeUnit(height);
+                    }
+                    attrs.width = _undef(imgAttrs.width, width);
+                    attrs.height = _undef(imgAttrs.height, height);
+                    return _mediaEmbed(attrs);
+                })
+                .replace(/<img[^>]*class="?ke-anchor"?[^>]*>/ig, function (full) {
+                    var imgAttrs = _getAttrList(full);
+                    return '<a name="' + unescape(imgAttrs['data-ke-name']) + '"></a>';
+                })
+                .replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function (full, attr, code) {
+                    return '<script' + unescape(attr) + '>' + unescape(code) + '</script>';
+                })
+                .replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function (full, attr, code) {
+                    return '<noscript' + unescape(attr) + '>' + unescape(code) + '</noscript>';
+                })
+                .replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig, function (full, start, src, end) {
+                    full = full.replace(/(\s+(?:href|src)=")[^"]*(")/i, function ($0, $1, $2) {
+                        return $1 + _unescape(src) + $2;
+                    });
+                    full = full.replace(/\s+data-ke-src="[^"]*"/i, '');
+                    return full;
+                })
+                .replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig, function (full, start, end) {
+                    return start + end;
+                });
+        });
+        self.beforeSetHtml(function (html) {
+            if (_IE && _V <= 8) {
+                html = html.replace(/<input[^>]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/ig, function (full) {
+                    var attrs = _getAttrList(full);
+                    var styles = _getCssList(attrs.style || '');
+                    if (styles.display == 'none') {
+                        return '<div class="ke-display-none" data-ke-input-tag="' + escape(full) + '"></div>';
+                    }
+                    return full;
+                });
+            }
+            return html.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig, function (full) {
+                var attrs = _getAttrList(full);
+                attrs.src = _undef(attrs.src, '');
+                attrs.width = _undef(attrs.width, 0);
+                attrs.height = _undef(attrs.height, 0);
+                return _mediaImg(self.themesPath + 'common/blank.gif', attrs);
+            })
+                .replace(/<video[^>]*type="([^"]+)"[^>]*>(?:<\/video>)?/ig, function (full) {
+                    var attrs = _getAttrList(full);
+                    attrs.src = _undef(attrs.src, '');
+                    attrs.width = _undef(attrs.width, 0);
+                    attrs.height = _undef(attrs.height, 0);
+                    return _mediaImg(self.themesPath + 'common/blank.gif', attrs);
+                })
+                .replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig, function (full) {
+                    var attrs = _getAttrList(full);
+                    if (attrs.href !== undefined) {
+                        return full;
+                    }
+                    return '<img class="ke-anchor" src="' + self.themesPath + 'common/anchor.gif" data-ke-name="' + escape(attrs.name) + '" />';
+                })
+                .replace(/<script([^>]*)>([\s\S]*?)<\/script>/ig, function (full, attr, code) {
+                    return '<div class="ke-script" data-ke-script-attr="' + escape(attr) + '">' + escape(code) + '</div>';
+                })
+                .replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/ig, function (full, attr, code) {
+                    return '<div class="ke-noscript" data-ke-noscript-attr="' + escape(attr) + '">' + escape(code) + '</div>';
+                })
+                .replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig, function (full, start, key, src, end) {
+                    if (full.match(/\sdata-ke-src="[^"]*"/i)) {
+                        return full;
+                    }
+                    full = start + key + '="' + src + '"' + ' data-ke-src="' + _escape(src) + '"' + end;
+                    return full;
+                })
+                .replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig, function (full, start, end) {
+                    return start + 'data-ke-' + end;
+                })
+                .replace(/<table[^>]*\s+border="0"[^>]*>/ig, function (full) {
+                    if (full.indexOf('ke-zeroborder') >= 0) {
+                        return full;
+                    }
+                    return _addClassToTag(full, 'ke-zeroborder');
+                });
+        });
+    });
+
+
+})(window);
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.lang({
+    source: 'HTML代码',
+    preview: '预览',
+    undo: '后退(Ctrl+Z)',
+    redo: '前进(Ctrl+Y)',
+    cut: '剪切(Ctrl+X)',
+    copy: '复制(Ctrl+C)',
+    paste: '粘贴(Ctrl+V)',
+    plainpaste: '粘贴为无格式文本',
+    wordpaste: '从Word粘贴',
+    selectall: '全选(Ctrl+A)',
+    justifyleft: '左对齐',
+    justifycenter: '居中',
+    justifyright: '右对齐',
+    justifyfull: '两端对齐',
+    insertorderedlist: '编号',
+    insertunorderedlist: '项目符号',
+    indent: '增加缩进',
+    outdent: '减少缩进',
+    subscript: '下标',
+    superscript: '上标',
+    formatblock: '段落',
+    fontname: '字体',
+    fontsize: '文字大小',
+    forecolor: '文字颜色',
+    hilitecolor: '文字背景',
+    bold: '粗体(Ctrl+B)',
+    italic: '斜体(Ctrl+I)',
+    underline: '下划线(Ctrl+U)',
+    strikethrough: '删除线',
+    removeformat: '删除格式',
+    image: '图片',
+    multiimage: '批量图片上传',
+    graft: '涂鸦',
+    flash: 'Flash',
+    media: '视音频',
+    table: '表格',
+    tablecell: '单元格',
+    hr: '插入横线',
+    emoticons: '插入表情',
+    link: '超级链接',
+    unlink: '取消超级链接',
+    fullscreen: '全屏显示',
+    about: '关于',
+    print: '打印(Ctrl+P)',
+    filemanager: '文件空间',
+    code: '插入程序代码',
+    quote: '插入引用',
+    map: 'Google地图',
+    baidumap: '百度地图',
+    lineheight: '行距',
+    clearhtml: '清理HTML代码',
+    pagebreak: '插入分页符',
+    quickformat: '一键排版',
+    insertfile: '插入文件',
+    template: '插入模板',
+    anchor: '锚点',
+    yes: '确定',
+    no: '取消',
+    close: '关闭',
+    editImage: '图片属性',
+    deleteImage: '删除图片',
+    editFlash: 'Flash属性',
+    deleteFlash: '删除Flash',
+    editMedia: '视音频属性',
+    deleteMedia: '删除视音频',
+    editLink: '超级链接属性',
+    deleteLink: '取消超级链接',
+    editAnchor: '锚点属性',
+    deleteAnchor: '删除锚点',
+    tableprop: '表格属性',
+    tablecellprop: '单元格属性',
+    tableinsert: '插入表格',
+    tabledelete: '删除表格',
+    tablecolinsertleft: '左侧插入列',
+    tablecolinsertright: '右侧插入列',
+    tablerowinsertabove: '上方插入行',
+    tablerowinsertbelow: '下方插入行',
+    tablerowmerge: '向下合并单元格',
+    tablecolmerge: '向右合并单元格',
+    tablerowsplit: '拆分行',
+    tablecolsplit: '拆分列',
+    tablecoldelete: '删除列',
+    tablerowdelete: '删除行',
+    noColor: '无颜色',
+    pleaseSelectFile: '请选择文件。',
+    invalidImg: "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。",
+    invalidMedia: "请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
+    invalidWidth: "宽度必须为数字。",
+    invalidHeight: "高度必须为数字。",
+    invalidBorder: "边框必须为数字。",
+    invalidUrl: "请输入有效的URL地址。",
+    invalidRows: '行数为必选项,只允许输入大于0的数字。',
+    invalidCols: '列数为必选项,只允许输入大于0的数字。',
+    invalidPadding: '边距必须为数字。',
+    invalidSpacing: '间距必须为数字。',
+    invalidJson: '服务器发生故障。',
+    uploadSuccess: '上传成功。',
+    cutError: '您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。',
+    copyError: '您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。',
+    pasteError: '您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。',
+    ajaxLoading: '加载中,请稍候 ...',
+    uploadLoading: '上传中,请稍候 ...',
+    uploadError: '上传错误',
+    'plainpaste.comment': '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+    'wordpaste.comment': '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+    'code.pleaseInput': '请输入程序代码。',
+    'link.url': 'URL',
+    'link.linkType': '打开类型',
+    'link.newWindow': '新窗口',
+    'link.selfWindow': '当前窗口',
+    'flash.url': 'URL',
+    'flash.width': '宽度',
+    'flash.height': '高度',
+    'flash.upload': '上传',
+    'flash.viewServer': '文件空间',
+    'media.url': 'URL',
+    'media.width': '宽度',
+    'media.height': '高度',
+    'media.autostart': '自动播放',
+    'media.upload': '上传',
+    'media.viewServer': '文件空间',
+    'image.remoteImage': '网络图片',
+    'image.localImage': '本地上传',
+    'image.remoteUrl': '图片地址',
+    'image.localUrl': '上传文件',
+    'image.size': '图片大小',
+    'image.width': '宽',
+    'image.height': '高',
+    'image.resetSize': '重置大小',
+    'image.align': '对齐方式',
+    'image.defaultAlign': '默认方式',
+    'image.leftAlign': '左对齐',
+    'image.rightAlign': '右对齐',
+    'image.imgTitle': '图片说明',
+    'image.upload': '浏览...',
+    'image.viewServer': '图片空间',
+    'multiimage.title': '多图上传',
+    'multiimage.uploadDesc': '共选择了 <%=numSelect%> 张图片,共 <%=totalSize%>, 还可以添加 <%=numLeft%> 张图片.',
+    'multiimage.startUpload': '开始上传',
+    'multiimage.noListUrl': '无法获取图片,请先配置 fileManagerJson.',
+    'multiimage.noSearchUrl': '无法进行图片搜索,请先配置 imageSearchJson.',
+    'multiimage.noDataText': '(⊙o⊙)亲,没有多数据了。',
+    'multiimage.closeText': '关闭对话框',
+    'multiimage.confirmBtnText': '确定',
+    'multiimage.cancelBtnText': '取消',
+    'multiimage.loadMoreData': '往下拉动滚动条可以加载更多数据.',
+    'multiimage.depJQueryError': '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+    'multiimage.localUpload': '本地上传',
+    'multiimage.fileServer': '文件服务器',
+    'multiimage.imgSearch': '图片搜索',
+    'multiimage.selectFile': '点击选择图片',
+    'multiimage.continueAdd': '继续添加',
+    'multiimage.searchBtn': '搜索一下',
+    'multiimage.searchPlaceholder': '请输入搜索关键词',
+    'multiimage.searchClear': '清空搜索',
+    'multiimage.noFileAdded': '请至少添加一个文件!',
+    'multiimage.uploading': '正在上传',
+    'multiimage.fileNotUpload': '您还有文件没有上传!',
+    'multiimage.uploadLimit': '您本次最多上传 <%=uploadLimit%> 个文件.',
+    'multiimage.sizeLimit': '文件大小不能超过 <%=sizeLimit%> KB.',
+    'multiimage.invalidExt': '非法的文件后缀 <%=invalidExt%>.',
+    'multiimage.remove': '删除',
+    'multiimage.rotateRight': '向右旋转',
+    'multiimage.rotateLeft': '向左旋转',
+    'multiimage.uploadFail': '发生异常,上传失败!',
+    'multiimage.noFileSelected': '请至少选择一个文件或一张图片.',
+    'filemanager.noDataText': '(⊙o⊙)亲,没有多数据了。',
+    'filemanager.title': '文件服务器',
+    'filemanager.noListUrl': '无法获取图片,请先配置 fileManagerJson.',
+    'filemanager.closeText': '关闭对话框',
+    'filemanager.confirmBtnText': '确定',
+    'filemanager.cancelBtnText': '取消',
+    'filemanager.loadMoreData': '往下拉动滚动条可以加载更多数据.',
+    'filemanager.depJQueryError': '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+    'filemanager.fileType': '类型',
+    'graft.btnText': '保存并插入涂鸦',
+    'graft.uploadSuccess': '涂鸦上传成功',
+    'graft.uploadFaild': '涂鸦上传失败',
+    'graft.empty': '您没有在画布上绘制任何图像',
+    'insertfile.url': 'URL',
+    'insertfile.title': '文件说明',
+    'insertfile.upload': '上传',
+    'insertfile.viewServer': '文件空间',
+    'table.cells': '单元格数',
+    'table.rows': '行数',
+    'table.cols': '列数',
+    'table.size': '大小',
+    'table.width': '宽度',
+    'table.height': '高度',
+    'table.percent': '%',
+    'table.px': 'px',
+    'table.space': '边距间距',
+    'table.padding': '边距',
+    'table.spacing': '间距',
+    'table.align': '对齐方式',
+    'table.textAlign': '水平对齐',
+    'table.verticalAlign': '垂直对齐',
+    'table.alignDefault': '默认',
+    'table.alignLeft': '左对齐',
+    'table.alignCenter': '居中',
+    'table.alignRight': '右对齐',
+    'table.alignTop': '顶部',
+    'table.alignMiddle': '中部',
+    'table.alignBottom': '底部',
+    'table.alignBaseline': '基线',
+    'table.border': '边框',
+    'table.borderWidth': '宽度',
+    'table.borderColor': '颜色',
+    'table.backgroundColor': '背景颜色',
+    'map.address': '地址: ',
+    'map.search': '搜索',
+    'baidumap.address': '地址: ',
+    'baidumap.search': '搜索',
+    'baidumap.insertDynamicMap': '插入动态地图',
+    'anchor.name': '锚点名称',
+    'formatblock.formatBlock': {
+        h1: '标题 1',
+        h2: '标题 2',
+        h3: '标题 3',
+        h4: '标题 4',
+        p: '正 文'
+    },
+    'fontname.fontName': {
+        'SimSun': '宋体',
+        'NSimSun': '新宋体',
+        'FangSong': '仿宋',
+        'KaiTi': '楷体',
+        'SimHei': '黑体',
+        'Microsoft YaHei': '微软雅黑',
+        'Arial': 'Arial',
+        'Arial Black': 'Arial Black',
+        'Times New Roman': 'Times New Roman',
+        'Courier New': 'Courier New',
+        'Tahoma': 'Tahoma',
+        'Verdana': 'Verdana'
+    },
+    'lineheight.lineHeight': [
+        {'1': '单倍行距'},
+        {'1.5': '1.5倍行距'},
+        {'2': '2倍行距'},
+        {'2.5': '2.5倍行距'},
+        {'3': '3倍行距'}
+    ],
+    'template.selectTemplate': '可选模板',
+    'template.replaceContent': '替换当前内容',
+    'template.fileList': {
+        '1.html': '图片和文字',
+        '2.html': '表格',
+        '3.html': '项目编号'
+    }
+}, 'zh-CN');
+KindEditor.options.langType = 'zh-CN';
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('anchor', function (K) {
+    var self = this, name = 'anchor', lang = self.lang(name + '.');
+    self.plugin.anchor = {
+        edit: function () {
+            var html = ['<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keName">' + lang.name + ':</label>',
+                '<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',
+                '</div>',
+                '</div>'].join('');
+            var dialog = self.createDialog({
+                name: name,
+                width: 300,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus();
+                    }
+                }
+            });
+            var div = dialog.div,
+                nameBox = K('input[name="name"]', div);
+            var img = self.plugin.getSelectedAnchor();
+            if (img) {
+                nameBox.val(unescape(img.attr('data-ke-name')));
+            }
+            nameBox[0].focus();
+            nameBox[0].select();
+        },
+        'delete': function () {
+            self.plugin.getSelectedAnchor().remove();
+        }
+    };
+    self.clickToolbar(name, self.plugin.anchor.edit);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('autoheight', function (K) {
+    var self = this;
+    if (!self.autoHeightMode) {
+        return;
+    }
+    var minHeight;
+
+    function hideScroll() {
+        var edit = self.edit;
+        var body = edit.doc.body;
+        edit.iframe[0].scroll = 'no';
+        body.style.overflowY = 'hidden';
+    }
+
+    function resetHeight() {
+        if (self.fullscreenMode) {
+            return;
+        }
+        var edit = self.edit;
+        var body = edit.doc.body;
+        edit.iframe.height(minHeight);
+        self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 76, minHeight));
+    }
+
+    function init() {
+        minHeight = K.removeUnit(self.height);
+        self.edit.afterChange(resetHeight);
+        if (!self.fullscreenMode) {
+            hideScroll();
+        }
+        resetHeight();
+    }
+
+    if (self.isCreated) {
+        init();
+    } else {
+        self.afterCreate(init);
+    }
+});
+/*
+* 如何实现真正的自动高度?
+* 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。
+* 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。
+* 由此就实现了真正的自动高度
+* 测试:chrome、firefox、IE9、IE8
+* */
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('baidumap', function (K) {
+    var self = this, name = 'baidumap', lang = self.lang(name + '.');
+    var mapWidth = K.undef(self.mapWidth, 558);
+    var mapHeight = K.undef(self.mapHeight, 360);
+    self.clickToolbar(name, function () {
+        var html = ['<div class="ke-dialog-content-inner" style="padding-top: 0">',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<div class="ke-header">' + lang.address,
+            '<input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+            '<span>',
+            '<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" style="line-height:22px;padding:0 10px;" />',
+            '</span>',
+            '<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" style="display:inline-block;" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>',
+            '</div>',
+            '</div>',
+            '<div class="ke-map" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></div>',
+            '</div>'].join('');
+        var dialog = self.createDialog({
+            name: name,
+            width: mapWidth + 42,
+            title: self.lang(name),
+            body: html,
+            yesBtn: {
+                name: self.lang('yes'),
+                click: function (e) {
+                    var map = win.map;
+                    var centerObj = map.getCenter();
+                    var center = centerObj.lng + ',' + centerObj.lat;
+                    var zoom = map.getZoom();
+                    var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'https://api.map.baidu.com/staticimage',
+                        '?center=' + encodeURIComponent(center),
+                        '&zoom=' + encodeURIComponent(zoom),
+                        '&width=' + mapWidth,
+                        '&height=' + mapHeight,
+                        '&markers=' + encodeURIComponent(center),
+                        '&markerStyles=' + encodeURIComponent('l,A')].join('');
+                    if (checkbox[0].checked) {
+                        self.insertHtml('<iframe src="' + url + '" frameborder="0" style="width:' + (mapWidth + 2) + 'px;height:' + (mapHeight + 2) + 'px;"></iframe>');
+                    } else {
+                        self.exec('insertimage', url);
+                    }
+                    self.hideDialog().focus();
+                }
+            },
+            beforeRemove: function () {
+                searchBtn.remove();
+                if (doc) {
+                    doc.write('');
+                }
+                iframe.remove();
+            }
+        });
+        var div = dialog.div,
+            addressBox = K('[name="address"]', div),
+            searchBtn = K('[name="searchBtn"]', div),
+            checkbox = K('[name="insertDynamicMap"]', dialog.div),
+            win, doc;
+        var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></iframe>');
+
+        function ready() {
+            win = iframe[0].contentWindow;
+            doc = K.iframeDoc(iframe);
+        }
+
+        iframe.bind('load', function () {
+            iframe.unbind('load');
+            if (K.IE) {
+                ready();
+            } else {
+                setTimeout(ready, 0);
+            }
+        });
+        K('.ke-map', div).replaceWith(iframe);
+        searchBtn.click(function () {
+            win.search(addressBox.val());
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+
+
+KindEditor.plugin('map', function (K) {
+    var self = this, name = 'map', lang = self.lang(name + '.');
+    self.clickToolbar(name, function () {
+        var html = ['<div style="padding:10px 20px;">',
+            '<div class="ke-dialog-row">',
+            lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+            '<span class="ke-button-common ke-button-outer">',
+            '<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
+            '</span>',
+            '</div>',
+            '<div class="ke-map" style="width:558px;height:360px;"></div>',
+            '</div>'].join('');
+        var dialog = self.createDialog({
+            name: name,
+            width: 600,
+            title: self.lang(name),
+            body: html,
+            yesBtn: {
+                name: self.lang('yes'),
+                click: function (e) {
+                    var geocoder = win.geocoder,
+                        map = win.map,
+                        center = map.getCenter().lat() + ',' + map.getCenter().lng(),
+                        zoom = map.getZoom(),
+                        maptype = map.getMapTypeId(),
+                        url = 'https://maps.googleapis.com/maps/api/staticmap';
+                    url += '?center=' + encodeURIComponent(center);
+                    url += '&zoom=' + encodeURIComponent(zoom);
+                    url += '&size=558x360';
+                    url += '&maptype=' + encodeURIComponent(maptype);
+                    url += '&markers=' + encodeURIComponent(center);
+                    url += '&language=' + self.langType;
+                    url += '&sensor=false';
+                    self.exec('insertimage', url).hideDialog().focus();
+                }
+            },
+            beforeRemove: function () {
+                searchBtn.remove();
+                if (doc) {
+                    doc.write('');
+                }
+                iframe.remove();
+            }
+        });
+        var div = dialog.div,
+            addressBox = K('[name="address"]', div),
+            searchBtn = K('[name="searchBtn"]', div),
+            win, doc;
+        var iframeHtml = ['<!doctype html><html><head>',
+            '<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',
+            '<style>',
+            '	html { height: 100% }',
+            '	body { height: 100%; margin: 0; padding: 0; background-color: #FFF }',
+            '	#map_canvas { height: 100% }',
+            '</style>',
+            '<script src="https://maps.googleapis.com/maps/api/js?sensor=false&language=' + self.langType + '"></script>',
+            '<script>',
+            'var map, geocoder;',
+            'function initialize() {',
+            '	var latlng = new google.maps.LatLng(31.230393, 121.473704);',
+            '	var options = {',
+            '		zoom: 11,',
+            '		center: latlng,',
+            '		disableDefaultUI: true,',
+            '		panControl: true,',
+            '		zoomControl: true,',
+            '		mapTypeControl: true,',
+            '		scaleControl: true,',
+            '		streetViewControl: false,',
+            '		overviewMapControl: true,',
+            '		mapTypeId: google.maps.MapTypeId.ROADMAP',
+            '	};',
+            '	map = new google.maps.Map(document.getElementById("map_canvas"), options);',
+            '	geocoder = new google.maps.Geocoder();',
+            '	geocoder.geocode({latLng: latlng}, function(results, status) {',
+            '		if (status == google.maps.GeocoderStatus.OK) {',
+            '			if (results[3]) {',
+            '				parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',
+            '			}',
+            '		}',
+            '	});',
+            '}',
+            'function search(address) {',
+            '	if (!map) return;',
+            '	geocoder.geocode({address : address}, function(results, status) {',
+            '		if (status == google.maps.GeocoderStatus.OK) {',
+            '			map.setZoom(11);',
+            '			map.setCenter(results[0].geometry.location);',
+            '			var marker = new google.maps.Marker({',
+            '				map: map,',
+            '				position: results[0].geometry.location',
+            '			});',
+            '		} else {',
+            '			alert("Invalid address: " + address);',
+            '		}',
+            '	});',
+            '}',
+            '</script>',
+            '</head>',
+            '<body onload="initialize();">',
+            '<div id="map_canvas" style="width:100%; height:100%"></div>',
+            '</body></html>'].join('\n');
+        var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'map/map.html" style="width:558px;height:360px;"></iframe>');
+
+        function ready() {
+            win = iframe[0].contentWindow;
+            doc = K.iframeDoc(iframe);
+        }
+
+        iframe.bind('load', function () {
+            iframe.unbind('load');
+            if (K.IE) {
+                ready();
+            } else {
+                setTimeout(ready, 0);
+            }
+        });
+        K('.ke-map', div).replaceWith(iframe);
+        searchBtn.click(function () {
+            win.search(addressBox.val());
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('clearhtml', function (K) {
+    var self = this, name = 'clearhtml';
+    self.clickToolbar(name, function () {
+        self.focus();
+        var html = self.html();
+        html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, '');
+        html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, '');
+        html = K.formatHtml(html, {
+            a: ['href', 'target'],
+            embed: ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess', 'controls'],
+            img: ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'],
+            table: ['border'],
+            'td,th': ['rowspan', 'colspan'],
+            'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6': []
+        });
+        self.html(html);
+        self.cmd.selection(true);
+        self.addBookmark();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+
+
+
+KindEditor.plugin('code', function (K) {
+    var self = this, name = 'code';
+    self.clickToolbar(name, function () {
+        var lang = self.lang(name + '.'),
+            html = ['<div style="margin: 0px 20px;">',
+                '<div class="ke-dialog-row">',
+                '<select class="ke-select" style="margin-bottom: 5px;">',
+                '<option value="javascript">JavaScript</option>',
+                '<option value="html">HTML</option>',
+                '<option value="css">CSS</option>',
+                '<option value="php">PHP</option>',
+                '<option value="perl">Perl</option>',
+                '<option value="python">Python</option>',
+                '<option value="ruby">Ruby</option>',
+                '<option value="java">Java</option>',
+                '<option value="go">Go</option>',
+                '<option value="asp">ASP/VB</option>',
+                '<option value="csharp">C#</option>',
+                '<option value="cpp">C/C++</option>',
+                '<option value="cs">C#</option>',
+                '<option value="bash">Shell</option>',
+                '<option value="sql">SQL</option>',
+                '<option value="markup">Other</option>',
+                '</select>',
+                '</div>',
+                '<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
+                '</div>'].join(''),
+            dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var type = K('.ke-select', dialog.div).val(),
+                            code = textarea.val(),
+                            cls = type === '' ? '' : 'language-' + type,
+                            html = '<pre class="' + cls + '"><code>' + K.escape(code) + '</code></pre> <br/>';
+                        if (K.trim(code) === '') {
+                            K.options.errorMsgHandler(lang.pleaseInput, "error");
+                            textarea[0].focus();
+                            return;
+                        }
+                        self.insertHtml(html).hideDialog().focus();
+                    }
+                }
+            }),
+            textarea = K('textarea', dialog.div);
+        textarea[0].focus();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('emoticons', function (K) {
+    var self = this, name = 'emoticons',
+        path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'),
+        allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons,
+        currentPageNum = 1;
+    self.clickToolbar(name, function () {
+        var rows = 5, cols = 9, total = 135, startNum = 0,
+            cells = rows * cols, pages = Math.ceil(total / cells),
+            colsHalf = Math.floor(cols / 2),
+            wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'),
+            elements = [],
+            menu = self.createMenu({
+                name: name,
+                beforeRemove: function () {
+                    removeEvent();
+                }
+            });
+        menu.div.append(wrapperDiv);
+        var previewDiv, previewImg;
+        if (allowPreview) {
+            previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
+            previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />');
+            wrapperDiv.append(previewDiv);
+            previewDiv.append(previewImg);
+        }
+
+        function bindCellEvent(cell, j, num) {
+            if (previewDiv) {
+                cell.mouseover(function () {
+                    if (j > colsHalf) {
+                        previewDiv.css('left', 0);
+                        previewDiv.css('right', '');
+                    } else {
+                        previewDiv.css('left', '');
+                        previewDiv.css('right', 0);
+                    }
+                    previewImg.attr('src', path + num + '.gif');
+                    K(this).addClass('ke-on');
+                });
+            } else {
+                cell.mouseover(function () {
+                    K(this).addClass('ke-on');
+                });
+            }
+            cell.mouseout(function () {
+                K(this).removeClass('ke-on');
+            });
+            cell.click(function (e) {
+                self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus();
+                e.stop();
+            });
+        }
+
+        function createEmoticonsTable(pageNum, parentDiv) {
+            var table = document.createElement('table');
+            parentDiv.append(table);
+            if (previewDiv) {
+                K(table).mouseover(function () {
+                    previewDiv.show('block');
+                });
+                K(table).mouseout(function () {
+                    previewDiv.hide();
+                });
+                elements.push(K(table));
+            }
+            table.className = 'ke-table';
+            table.cellPadding = 0;
+            table.cellSpacing = 0;
+            table.border = 0;
+            var num = (pageNum - 1) * cells + startNum;
+            for (var i = 0; i < rows; i++) {
+                var row = table.insertRow(i);
+                for (var j = 0; j < cols; j++) {
+                    var cell = K(row.insertCell(j));
+                    cell.addClass('ke-cell');
+                    bindCellEvent(cell, j, num);
+                    var span = K('<span class="ke-img"></span>')
+                        .css('background-position', '-' + (24 * num) + 'px 0px')
+                        .css('background-image', 'url(' + path + 'static.gif)');
+                    cell.append(span);
+                    elements.push(cell);
+                    num++;
+                }
+            }
+            return table;
+        }
+
+        var table = createEmoticonsTable(currentPageNum, wrapperDiv);
+
+        function removeEvent() {
+            K.each(elements, function () {
+                this.unbind();
+            });
+        }
+
+        var pageDiv;
+
+        function bindPageEvent(el, pageNum) {
+            el.click(function (e) {
+                removeEvent();
+                table.parentNode.removeChild(table);
+                pageDiv.remove();
+                table = createEmoticonsTable(pageNum, wrapperDiv);
+                createPageTable(pageNum);
+                currentPageNum = pageNum;
+                e.stop();
+            });
+        }
+
+        function createPageTable(currentPageNum) {
+            pageDiv = K('<div class="ke-page"></div>');
+            wrapperDiv.append(pageDiv);
+            for (var pageNum = 1; pageNum <= pages; pageNum++) {
+                if (currentPageNum !== pageNum) {
+                    var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
+                    bindPageEvent(a, pageNum);
+                    pageDiv.append(a);
+                    elements.push(a);
+                } else {
+                    pageDiv.append(K('@[' + pageNum + ']'));
+                }
+                pageDiv.append(K('@&nbsp;'));
+            }
+        }
+
+        createPageTable(currentPageNum);
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('flash', function (K) {
+    var self = this, name = 'flash', lang = self.lang(name + '.'),
+        allowFlashUpload = K.undef(self.allowFlashUpload, true),
+        allowFileManager = K.undef(self.allowFileManager, false),
+        formatUploadUrl = K.undef(self.formatUploadUrl, true),
+        extraParams = K.undef(self.extraFileUploadParams, {}),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+    self.plugin.flash = {
+        edit: function () {
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+                '<div class="row-right">',
+                '<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+                '<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+                '<span class="ke-button-common ke-button-outer">',
+                '<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+                '</span>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keWidth" class="row-left">' + lang.width + ':</label>',
+                '<div class="row-right">',
+                '<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keHeight" class="row-left">' + lang.height + ':</label>',
+                '<div class="row-right">',
+                '<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 450,
+                    title: self.lang(name),
+                    body: html,
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var url = K.trim(urlBox.val()),
+                                width = widthBox.val(),
+                                height = heightBox.val();
+                            if (url == 'http://' || K.invalidUrl(url)) {
+                                K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                                urlBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(width)) {
+                                K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                                widthBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(height)) {
+                                K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                                heightBox[0].focus();
+                                return;
+                            }
+                            var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+                                src: url,
+                                type: K.mediaType('.swf'),
+                                width: width,
+                                height: height,
+                                quality: 'high'
+                            });
+                            self.insertHtml(html).hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div,
+                urlBox = K('[name="url"]', div),
+                viewServerBtn = K('[name="viewServer"]', div),
+                widthBox = K('[name="width"]', div),
+                heightBox = K('[name="height"]', div);
+            urlBox.val('http://');
+            if (allowFlashUpload) {
+                var callback = function (data) {
+                    dialog.hideLoading();
+                    if (data.code === "000") {
+                        var url = data.data.url;
+                        if (formatUploadUrl) {
+                            url = K.formatUrl(url, 'absolute');
+                        }
+                        urlBox.val(url);
+                        if (self.afterUpload) {
+                            self.afterUpload.call(self, url, data, name);
+                        }
+                        //K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+                    } else {
+                        K.options.errorMsgHandler(data.message, "error");
+                    }
+                };
+                var uploadbutton = K.uploadbutton({
+                    button: K('.ke-upload-button', div)[0],
+                    fieldName: filePostName,
+                    extraParams: extraParams,
+                    url: K.addParam(uploadJson, 'fileType=flash'),
+                    beforeUpload: function () {
+                        if (typeof self.beforeUpload == 'function') {
+                            self.beforeUpload.call(this, callback);
+                            return false;
+                        } else {
+                            return true;
+                        }
+                    },
+                    afterUpload: function (data) {
+                        callback(data);
+                    },
+                    afterError: function (html) {
+                        dialog.hideLoading();
+                        self.errorDialog(html);
+                    }
+                });
+                uploadbutton.fileBox.change(function (e) {
+                    dialog.showLoading(self.lang('uploadLoading'));
+                    uploadbutton.submit();
+                });
+            } else {
+                K('.ke-upload-button', div).hide();
+            }
+            if (allowFileManager) {
+                viewServerBtn.click(function (e) {
+                    self.loadPlugin('filemanager', function () {
+                        self.plugin.filemanagerDialog({
+                            dirName: 'flash',
+                            clickFn: function (url) {
+                                K('[name="url"]', div).val(url);
+                                if (self.afterSelectFile) {
+                                    self.afterSelectFile.call(self, url);
+                                }
+                            }
+                        });
+                    });
+                });
+            } else {
+                K('[name="url"]').css("width", "250px");
+                viewServerBtn.hide();
+            }
+            var img = self.plugin.getSelectedFlash();
+            if (img) {
+                var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+                urlBox.val(attrs.src);
+                widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+                heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+            }
+            urlBox[0].focus();
+            urlBox[0].select();
+        },
+        'delete': function () {
+            self.plugin.getSelectedFlash().remove();
+            self.addBookmark();
+        }
+    };
+    self.clickToolbar(name, self.plugin.flash.edit);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('image', function (K) {
+    var self = this, name = 'image',
+        allowImageUpload = K.undef(self.allowImageUpload, true),
+        allowImageRemote = K.undef(self.allowImageRemote, true),
+        formatUploadUrl = K.undef(self.formatUploadUrl, true),
+        allowFileManager = K.undef(self.allowFileManager, false),
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+        imageTabIndex = K.undef(self.imageTabIndex, 0),
+        imgPath = self.pluginsPath + 'image/images/',
+        extraParams = K.undef(self.extraFileUploadParams, {}),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false),
+        lang = self.lang(name + '.');
+    self.plugin.imageDialog = function (options) {
+        var imageUrl = options.imageUrl,
+            imageWidth = K.undef(options.imageWidth, ''),
+            imageHeight = K.undef(options.imageHeight, ''),
+            imageTitle = K.undef(options.imageTitle, ''),
+            imageAlign = K.undef(options.imageAlign, ''),
+            showRemote = K.undef(options.showRemote, true),
+            showLocal = K.undef(options.showLocal, true),
+            tabIndex = K.undef(options.tabIndex, 0),
+            clickFn = options.clickFn;
+        var target = 'kindeditor_upload_iframe_' + new Date().getTime();
+        var hiddenElements = [];
+        for (var k in extraParams) {
+            hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+        }
+        var html = [
+            '<div class="ke-dialog-content-inner">',
+            '<div class="tabs"></div>',
+            '<div class="tab1" style="display:none;">',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label for="remoteUrl" class="row-left">' + lang.remoteUrl + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:250px;" /> &nbsp;',
+            '<span class="ke-button-common ke-button-outer">',
+            '<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+            '</span>',
+            '</div>',
+            '</div>',
+            '<div class="ke-dialog-row ke-clearfix ">',
+            '<label for="remoteWidth" class="row-left">' + lang.size + ':</label>',
+            '<div class="row-right">' + lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',
+            lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ',
+            '<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />',
+            '</div>',
+            '</div>',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label class="row-left">' + lang.align + ':</label>',
+            '<div class="row-right">',
+            '<span><input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> ' +
+            '<img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" /></span>',
+            ' <span><input type="radio" name="align" class="ke-inline-block" value="left" /> ' +
+            '<img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" /></span>',
+            ' <span><input type="radio" name="align" class="ke-inline-block" value="right" /> ' +
+            '<img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" /></span>',
+            '</div>',
+            '</div>',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label for="remoteTitle" class="row-left">' + lang.imgTitle + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:250px;" />',
+            '</div>',
+            '</div>',
+            '</div>',
+            '<div class="tab2" style="display:none;">',
+            '<iframe name="' + target + '" style="display:none;"></iframe>',
+            '<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'fileType=image') + '">',
+            '<div class="ke-dialog-row ke-clearfix">',
+            hiddenElements.join(''),
+            '<label class="row-left">' + lang.localUrl + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:250px;" readonly="true" /> &nbsp;',
+            '<input type="button" class="ke-upload-button" value="' + lang.upload + '" />',
+            '</div>',
+            '</div>',
+            '</form>',
+            '</div>',
+            '</div>'
+        ].join('');
+        var dialogWidth = showLocal || allowFileManager ? 450 : 400,
+            dialogHeight = showLocal && showRemote ? 310 : 260;
+        var dialog = self.createDialog({
+                name: name,
+                width: dialogWidth,
+                height: dialogHeight,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        if (dialog.isLoading) {
+                            return;
+                        }
+                        if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) {
+                            if (uploadbutton.fileBox.val() == '') {
+                                K.options.errorMsgHandler(self.lang('pleaseSelectFile'), "error");
+                                return;
+                            }
+                            dialog.showLoading(self.lang('uploadLoading'));
+                            uploadbutton.submit();
+                            localUrlBox.val('');
+                            return;
+                        }
+                        var url = K.trim(urlBox.val()),
+                            width = widthBox.val(),
+                            height = heightBox.val(),
+                            title = titleBox.val(),
+                            align = '';
+                        alignBox.each(function () {
+                            if (this.checked) {
+                                align = this.value;
+                                return false;
+                            }
+                        });
+                        if (url == 'http://' || K.invalidUrl(url)) {
+                            K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                            urlBox[0].focus();
+                            return;
+                        }
+                        if (!/^\d*$/.test(width)) {
+                            K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                            widthBox[0].focus();
+                            return;
+                        }
+                        if (!/^\d*$/.test(height)) {
+                            K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                            heightBox[0].focus();
+                            return;
+                        }
+                        clickFn.call(self, url, title, width, height, 0, align);
+                    }
+                },
+                beforeRemove: function () {
+                    viewServerBtn.unbind();
+                    widthBox.unbind();
+                    heightBox.unbind();
+                    refreshBtn.unbind();
+                }
+            }),
+            div = dialog.div;
+        var urlBox = K('[name="url"]', div),
+            localUrlBox = K('[name="localUrl"]', div),
+            viewServerBtn = K('[name="viewServer"]', div),
+            widthBox = K('.tab1 [name="width"]', div),
+            heightBox = K('.tab1 [name="height"]', div),
+            refreshBtn = K('.ke-refresh-btn', div),
+            titleBox = K('.tab1 [name="title"]', div),
+            alignBox = K('.tab1 [name="align"]', div);
+        var tabs;
+        if (showRemote && showLocal) {
+            tabs = K.tabs({
+                src: K('.tabs', div),
+                afterSelect: function (i) {
+                }
+            });
+            tabs.add({
+                title: lang.remoteImage,
+                panel: K('.tab1', div)
+            });
+            tabs.add({
+                title: lang.localImage,
+                panel: K('.tab2', div)
+            });
+            tabs.select(tabIndex);
+        } else if (showRemote) {
+            K('.tab1', div).show();
+        } else if (showLocal) {
+            K('.tab2', div).show();
+        }
+        var callback = function (data) {
+            if (data.code == "000") {
+                dialog.hideLoading();
+                //K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+                var url = data.data.url;
+                if (formatUploadUrl) {
+                    url = K.formatUrl(url, 'absolute');
+                }
+                if (!fillDescAfterUploadImage) {
+                    clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align);
+                } else {
+                    K(".ke-dialog-row #remoteUrl", div).val(url);
+                    K(".ke-tabs-li", div)[0].click();
+                    K(".ke-refresh-btn", div).click();
+                }
+            } else {
+                K.options.errorMsgHandler(data.message, "error");
+            }
+        };
+        var uploadbutton = K.uploadbutton({
+            button: K('.ke-upload-button', div)[0],
+            fieldName: filePostName,
+            form: K('.ke-form', div),
+            target: target,
+            width: 60,
+            beforeUpload: function () {
+                if (typeof self.beforeUpload == 'function') {
+                    self.beforeUpload.call(this, callback);
+                    return false;
+                } else {
+                    return true;
+                }
+            },
+            afterUpload: function (data) {
+                callback(data);
+            },
+            afterError: function (html) {
+                dialog.hideLoading();
+                self.errorDialog(html);
+            }
+        });
+        uploadbutton.fileBox.change(function (e) {
+            localUrlBox.val(uploadbutton.fileBox.val());
+        });
+        if (allowFileManager) {
+            viewServerBtn.click(function (e) {
+                self.loadPlugin('filemanager', function () {
+                    self.plugin.filemanagerDialog({
+                        dirName: 'image',
+                        clickFn: function (url) {
+                            K('[name="url"]', div).val(url);
+                            if (self.afterSelectFile) {
+                                self.afterSelectFile.call(self, url);
+                            }
+                        }
+                    });
+                });
+            });
+        } else {
+            viewServerBtn.hide();
+        }
+        var originalWidth = 0, originalHeight = 0;
+
+        function setSize(width, height) {
+            widthBox.val(width);
+            heightBox.val(height);
+            originalWidth = width;
+            originalHeight = height;
+        }
+
+        refreshBtn.click(function (e) {
+            var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({
+                position: 'absolute',
+                visibility: 'hidden',
+                top: 0,
+                left: '-1000px'
+            });
+            tempImg.bind('load', function () {
+                setSize(tempImg.width(), tempImg.height());
+                tempImg.remove();
+            });
+            K(document.body).append(tempImg);
+        });
+        widthBox.change(function (e) {
+            if (originalWidth > 0) {
+                heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10)));
+            }
+        });
+        heightBox.change(function (e) {
+            if (originalHeight > 0) {
+                widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10)));
+            }
+        });
+        urlBox.val(options.imageUrl);
+        setSize(options.imageWidth, options.imageHeight);
+        titleBox.val(options.imageTitle);
+        alignBox.each(function () {
+            if (this.value === options.imageAlign) {
+                this.checked = true;
+                return false;
+            }
+        });
+        if (showRemote && tabIndex === 0) {
+            urlBox[0].focus();
+            urlBox[0].select();
+        }
+        return dialog;
+    };
+    self.plugin.image = {
+        edit: function () {
+            var img = self.plugin.getSelectedImage();
+            self.plugin.imageDialog({
+                imageUrl: img ? img.attr('data-ke-src') : 'http://',
+                imageWidth: img ? img.width() : '',
+                imageHeight: img ? img.height() : '',
+                imageTitle: img ? img.attr('title') : '',
+                imageAlign: img ? img.attr('align') : '',
+                showRemote: allowImageRemote,
+                showLocal: allowImageUpload,
+                tabIndex: img ? 0 : imageTabIndex,
+                clickFn: function (url, title, width, height, border, align) {
+                    if (img) {
+                        img.attr('src', url);
+                        img.attr('data-ke-src', url);
+                        img.attr('width', width);
+                        img.attr('height', height);
+                        img.attr('title', title);
+                        img.attr('align', align);
+                        img.attr('alt', title);
+                    } else {
+                        self.exec('insertimage', url, title, width, height, border, align);
+                    }
+                    setTimeout(function () {
+                        self.hideDialog().focus();
+                    }, 0);
+                }
+            });
+        },
+        'delete': function () {
+            var target = self.plugin.getSelectedImage();
+            if (target.parent().name == 'a') {
+                target = target.parent();
+            }
+            target.remove();
+            self.addBookmark();
+        }
+    };
+    self.clickToolbar(name, self.plugin.image.edit);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('insertfile', function (K) {
+    var self = this, name = 'insertfile',
+        allowFileUpload = K.undef(self.allowFileUpload, true),
+        allowFileManager = K.undef(self.allowFileManager, false),
+        formatUploadUrl = K.undef(self.formatUploadUrl, true),
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+        extraParams = K.undef(self.extraFileUploadParams, {}),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        lang = self.lang(name + '.');
+    self.plugin.fileDialog = function (options) {
+        var fileUrl = K.undef(options.fileUrl, 'http://'),
+            fileTitle = K.undef(options.fileTitle, ''),
+            clickFn = options.clickFn;
+        var html = [
+            '<div class="ke-dialog-content-inner">',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;',
+            '<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+            '<span class="ke-button-common ke-button-outer">',
+            '<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+            '</span>',
+            '</div>',
+            '</div>',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label for="keTitle" class="row-left">' + lang.title + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',
+            '</div>',
+            '</div>',
+            '</form>',
+            '</div>'
+        ].join('');
+        var dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var url = K.trim(urlBox.val()),
+                            title = titleBox.val();
+                        if (url == 'http://' || K.invalidUrl(url)) {
+                            K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                            urlBox[0].focus();
+                            return;
+                        }
+                        if (K.trim(title) === '') {
+                            title = url;
+                        }
+                        clickFn.call(self, url, title);
+                    }
+                }
+            }),
+            div = dialog.div;
+        var urlBox = K('[name="url"]', div),
+            viewServerBtn = K('[name="viewServer"]', div),
+            titleBox = K('[name="title"]', div);
+        if (allowFileUpload) {
+            var callback = function (data) {
+                dialog.hideLoading();
+                if (data.code === "000") {
+                    var url = data.data.url;
+                    if (formatUploadUrl) {
+                        url = K.formatUrl(url, 'absolute');
+                    }
+                    urlBox.val(url);
+                    if (self.afterUpload) {
+                        self.afterUpload.call(self, url, data, name);
+                    }
+                    //K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+                } else {
+                    K.options.errorMsgHandler(data.message, "error");
+                }
+            };
+            var uploadbutton = K.uploadbutton({
+                button: K('.ke-upload-button', div)[0],
+                fieldName: filePostName,
+                url: K.addParam(uploadJson, 'fileType=file'),
+                extraParams: extraParams,
+                beforeUpload: function () {
+                    if (typeof self.beforeUpload == 'function') {
+                        self.beforeUpload.call(this, callback);
+                        return false;
+                    } else {
+                        return true;
+                    }
+                },
+                afterUpload: function (data) {
+                    callback(data);
+                },
+                afterError: function (html) {
+                    dialog.hideLoading();
+                    self.errorDialog(html);
+                }
+            });
+            uploadbutton.fileBox.change(function (e) {
+                dialog.showLoading(self.lang('uploadLoading'));
+                uploadbutton.submit();
+            });
+        } else {
+            K('.ke-upload-button', div).hide();
+        }
+        if (allowFileManager) {
+            viewServerBtn.click(function (e) {
+                self.loadPlugin('filemanager', function () {
+                    self.plugin.filemanagerDialog({
+                        viewType: 'LIST',
+                        dirName: 'file',
+                        clickFn: function (url) {
+                            K('[name="url"]', div).val(url);
+                            if (self.afterSelectFile) {
+                                self.afterSelectFile.call(self, url);
+                            }
+                        }
+                    });
+                });
+            });
+        } else {
+            K("#keUrl").css("width", "250px");
+            viewServerBtn.hide();
+        }
+        urlBox.val(fileUrl);
+        titleBox.val(fileTitle);
+        urlBox[0].focus();
+        urlBox[0].select();
+    };
+    self.clickToolbar(name, function () {
+        self.plugin.fileDialog({
+            clickFn: function (url, title) {
+                var html = '<a class="ke-insertfile" href="' + url + '" data-ke-src="' + url + '" target="_blank">' + title + '</a>';
+                self.insertHtml(html).hideDialog().focus();
+            }
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('lineheight', function (K) {
+    var self = this, name = 'lineheight', lang = self.lang(name + '.');
+    self.clickToolbar(name, function () {
+        var curVal = '', commonNode = self.cmd.commonNode({'*': '.line-height'});
+        if (commonNode) {
+            curVal = commonNode.css('line-height');
+        }
+        var menu = self.createMenu({
+            name: name,
+            width: 150
+        });
+        K.each(lang.lineHeight, function (i, row) {
+            K.each(row, function (key, val) {
+                menu.addItem({
+                    title: val,
+                    checked: curVal === key,
+                    click: function () {
+                        self.cmd.toggle('<span style="line-height:' + key + ';"></span>', {
+                            span: '.line-height=' + key
+                        });
+                        self.updateState();
+                        self.addBookmark();
+                        self.hideMenu();
+                    }
+                });
+            });
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('link', function (K) {
+    var self = this, name = 'link';
+    self.plugin.link = {
+        edit: function () {
+            var lang = self.lang(name + '.'),
+                html = ['<div class="ke-dialog-content-inner">',
+                    '<div class="ke-dialog-row ke-clearfix">',
+                    '<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+                    '<div class="row-right">',
+                    '<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" />',
+                    '</div>',
+                    '</div>',
+                    '<div class="ke-dialog-row ke-clearfix"">',
+                    '<label for="keType" class="row-left">' + lang.linkType + ':</label>',
+                    '<div class="row-right">',
+                    '<select id="keType" class="ke-select" name="type"></select>',
+                    '</div>',
+                    '</div>',
+                    '</div>'].join(""),
+                dialog = self.createDialog({
+                    name: name,
+                    width: 450,
+                    title: self.lang(name),
+                    body: html,
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var url = K.trim(urlBox.val());
+                            if (url == 'http://' || K.invalidUrl(url)) {
+                                K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                                urlBox[0].focus();
+                                return;
+                            }
+                            self.exec('createlink', url, typeBox.val()).hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div,
+                urlBox = K('input[name="url"]', div),
+                typeBox = K('select[name="type"]', div);
+            urlBox.val('http://');
+            typeBox[0].options[0] = new Option(lang.newWindow, '_blank');
+            typeBox[0].options[1] = new Option(lang.selfWindow, '');
+            self.cmd.selection();
+            var a = self.plugin.getSelectedLink();
+            if (a) {
+                self.cmd.range.selectNode(a[0]);
+                self.cmd.select();
+                urlBox.val(a.attr('data-ke-src'));
+                typeBox.val(a.attr('target'));
+            }
+            urlBox[0].focus();
+            urlBox[0].select();
+        },
+        'delete': function () {
+            self.exec('unlink', null);
+        }
+    };
+    self.clickToolbar(name, self.plugin.link.edit);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('media', function (K) {
+    var self = this, name = 'media', lang = self.lang(name + '.'),
+        allowMediaUpload = K.undef(self.allowMediaUpload, false),
+        allowFileManager = K.undef(self.allowFileManager, false),
+        formatUploadUrl = K.undef(self.formatUploadUrl, true),
+        extraParams = K.undef(self.extraFileUploadParams, {}),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+    self.plugin.media = {
+        edit: function () {
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+                '<div class="row-right">',
+                '<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:180px;" /> &nbsp;',
+                '<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+                '<span class="ke-button-common ke-button-outer">',
+                '<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+                '</span>',
+                '<div style="margin-top:5px;color:#aaa;">支持优酷、爱奇艺、腾讯视频等视频网站【<span style="color:green">通用代码</span>】',
+                '</div>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keWidth" class="row-left">' + lang.width + ':</label>',
+                '<div class="row-right">',
+                '<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keHeight" class="row-left">' + lang.height + ':</label>',
+                '<div class="row-right">',
+                '<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keAutostart" class="row-left">' + lang.autostart + ':</label>',
+                '<div class="row-right">',
+                '<input type="checkbox" id="keAutostart" name="autostart" class="ke-input-checkbox" value="" /> ',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 450,
+                    height: 260,
+                    title: self.lang(name),
+                    body: html,
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var url = K.trim(urlBox.val()),
+                                width = widthBox.val(),
+                                height = heightBox.val();
+                            var match = url.match(/^<iframe\s(.*?)src=('|")(.*?)('|")/);
+                            if (!match) {
+                                if (url == 'http://' || K.invalidUrl(url)) {
+                                    K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                                    urlBox[0].focus();
+                                    return;
+                                }
+                            }
+                            if (!/^\d*$/.test(width)) {
+                                K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                                widthBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(height)) {
+                                K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                                heightBox[0].focus();
+                                return;
+                            }
+                            if (!match) {
+                                var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+                                    src: url,
+                                    type: K.mediaType(url),
+                                    width: width,
+                                    height: height,
+                                    autostart: autostartBox[0].checked ? 'true' : 'false',
+                                    loop: 'true'
+                                });
+                            } else {
+                                var html = '<iframe src="' + match[3] + '" frameborder="0" style="width:' + width + 'px;height:' + height + 'px;"></iframe>';
+                            }
+                            self.insertHtml(html).hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div,
+                urlBox = K('[name="url"]', div),
+                viewServerBtn = K('[name="viewServer"]', div),
+                widthBox = K('[name="width"]', div),
+                heightBox = K('[name="height"]', div),
+                autostartBox = K('[name="autostart"]', div);
+            urlBox.val('http://');
+            if (allowMediaUpload) {
+                var callback = function (data) {
+                    dialog.hideLoading();
+                    if (data.code == "000") {
+                        var url = data.data.url;
+                        if (formatUploadUrl) {
+                            url = K.formatUrl(url, 'absolute');
+                        }
+                        urlBox.val(url);
+                        if (self.afterUpload) {
+                            self.afterUpload.call(self, url, data, name);
+                        }
+                        //K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+                    } else {
+                        K.options.errorMsgHandler(data.message, "error", "error");
+                    }
+                };
+                var uploadbutton = K.uploadbutton({
+                    button: K('.ke-upload-button', div)[0],
+                    fieldName: filePostName,
+                    extraParams: extraParams,
+                    url: K.addParam(uploadJson, 'fileType=media'),
+                    beforeUpload: function () {
+                        if (typeof self.beforeUpload == 'function') {
+                            self.beforeUpload.call(this, callback);
+                            return false;
+                        } else {
+                            return true;
+                        }
+                    },
+                    afterUpload: function (data) {
+                        callback(data);
+                    },
+                    afterError: function (html) {
+                        dialog.hideLoading();
+                        self.errorDialog(html);
+                    }
+                });
+                uploadbutton.fileBox.change(function (e) {
+                    dialog.showLoading(self.lang('uploadLoading'));
+                    uploadbutton.submit();
+                });
+            } else {
+                K('.ke-upload-button', div).hide();
+            }
+            if (allowMediaUpload && allowFileManager) {
+                viewServerBtn.click(function (e) {
+                    self.loadPlugin('filemanager', function () {
+                        self.plugin.filemanagerDialog({
+                            dirName: 'media',
+                            clickFn: function (url) {
+                                K('[name="url"]', div).val(url);
+                                if (self.afterSelectFile) {
+                                    self.afterSelectFile.call(self, url);
+                                }
+                            }
+                        });
+                    });
+                });
+            } else {
+                K("#keUrl").css("width", "250px");
+                viewServerBtn.hide();
+            }
+            var img = self.plugin.getSelectedMedia();
+            if (img) {
+                var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+                urlBox.val(attrs.src);
+                widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+                heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+                autostartBox[0].checked = (attrs.autostart === 'true');
+            }
+            urlBox[0].focus();
+            urlBox[0].select();
+        },
+        'delete': function () {
+            self.plugin.getSelectedMedia().remove();
+            self.addBookmark();
+        }
+    };
+    self.clickToolbar(name, self.plugin.media.edit);
+});
+
+KindEditor.plugin('multiimage', function (K) {
+    var self = this, name = 'multiimage',
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+        fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'),
+        imageSizeLimit = K.undef(self.imageSizeLimit, 2048),
+        imageFileTypes = K.undef(self.imageFileTypes, 'jpg|png|gif|jpeg'),
+        imageUploadLimit = K.undef(self.imageUploadLimit, 20),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        lang = self.lang(name + '.');
+    if (typeof jQuery == 'undefined') {
+        K.options.errorMsgHandler(lang.depJQueryError, "error");
+        return;
+    } else {
+        K.loadScript(K.options.pluginsPath + name + "/BUpload.js");
+        K.loadStyle(K.options.pluginsPath + name + "/css/upload.css");
+    }
+    K.locker = function () {
+        var docWidth = Math.max(document.documentElement.clientWidth, document.body.clientWidth);
+        var docHeight = Math.max(document.documentElement.clientHeight, document.body.clientHeight, $(document).height()) + document.documentElement.scrollTop;
+        return K.widget({
+            x: 0,
+            y: 0,
+            cls: 'ke-dialog-lock',
+            width: docWidth,
+            height: docHeight
+        });
+    }
+    self.plugin.multiImageDialog = function (options) {
+
+        var clickFn = options.clickFn;
+        var locker = K.locker();
+        locker.show();
+        var dialog = new BUpload({
+            src: filePostName,
+            upload_url: uploadJson,
+            list_url: fileManagerJson,
+            max_filesize: imageSizeLimit,
+            max_filenum: imageUploadLimit,
+            ext_allow: imageFileTypes,
+            lang: lang,
+            top: self.dialogOffset,
+            fileType: "image",
+            errorHandler: K.options.errorMsgHandler,
+            callback: function (data) {
+                clickFn.call(this, data);
+            },
+            close: function () {
+                locker.remove();
+            }
+        });
+        return dialog;
+    };
+    self.clickToolbar(name, function () {
+        self.plugin.multiImageDialog({
+            clickFn: function (urlList) {
+                if (urlList.length === 0) {
+                    return;
+                }
+                K.each(urlList, function (i, data) {
+                    if (self.afterUpload) {
+                        self.afterUpload.call(self, data, data, 'multiimage');
+                    }
+                    self.exec('insertimage', data);
+                });
+                setTimeout(function () {
+                    self.hideDialog().focus();
+                }, 0);
+            }
+        });
+    });
+});
+
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('graft', function (K) {
+    var self = this, name = 'graft',
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+        allowUploadGraft = K.undef(self.allowUploadGraft, true),
+        lang = self.lang(name + '.');
+    if (typeof jQuery == 'undefined') {
+        K.options.errorMsgHandler(lang.depJQueryError, "error");
+        return;
+    } else {
+        K.loadStyle(K.options.pluginsPath + "graft/css/scrawl.css");
+        K.loadScript(K.options.pluginsPath + "graft/scrawl.js");
+    }
+    self.plugin.graftDialog = function (options) {
+        var clickFn = options.clickFn;
+        var html = [
+            '<div class="scrawl-main" id="scrawl-main">',
+            '<div class="hot">',
+            '<div class="drawBoard border_style">',
+            '<canvas id="canvas-borad" class="brushBorad">你的浏览器不支持 canvas 绘图</canvas>',
+            '<div class="picBoard" id="picBoard" style=""></div>',
+            '</div>',
+            '<div class="operateBar">',
+            '<button id="J_prevStep" class="prevStep" title="上一步">',
+            '<em class="icon"></em>',
+            '</button>',
+            '<button id="J_nextStep" class="nextStep" title="下一步">',
+            '<em class="icon"></em>',
+            '</button>',
+            '<button id="J_clearBoard" class="clearBoard" title="清空">',
+            '<em class="icon"></em>',
+            '</button>',
+            '</div>',
+            '</div>',
+            '<div class="drawToolbar border_style">',
+            '<div class="colorBar">',
+            '<span data-color="#0099CC" style="background:#0099CC;" class="active"></span>',
+            '<span data-color="#003366" style="background:#003366;"></span>',
+            '<span data-color="#993333" style="background:#993333;"></span>',
+            '<span data-color="#FF9900" style="background:#FF9900;"></span>',
+            '<span data-color="#0000CC" style="background:#0000CC;"></span>',
+            '<span data-color="#CC3333" style="background:#CC3333;"></span>',
+            '<span data-color="#F4D03F" style="background:#641E16;"></span>',
+            '<span data-color="#4A235A" style="background:#4A235A;"></span>',
+            '<span data-color="#009966" style="background:#009966;"></span>',
+            '<span data-color="#ffff00" style="background:#ffff00;"></span>',
+            '<span data-color="#7D6608" style="background:#7D6608;"></span>',
+            '<span data-color="#FF33CC" style="background:#FF33CC;"></span>',
+            '<span data-color="#990066" style="background:#990066;"></span>',
+            '<span data-color="#ffffff" style="background:#ffffff;"></span>',
+            '<span data-color="#9bbb59" style="background:#9bbb59;"></span>',
+            '<span data-color="#CCFFFF" style="background:#CCFFFF;"></span>',
+            '<span data-color="#FFCCCC" style="background:#FFCCCC;"></span>',
+            '<span data-color="#CC99CC" style="background:#CC99CC;"></span>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<em class="brushIcon"></em>',
+            '<a href="javascript:void(0)" class="brush-size size1">1</a>',
+            '<a href="javascript:void(0)" class="brush-size size2">3</a>',
+            '<a href="javascript:void(0)" class="brush-size size3">5</a>',
+            '<a href="javascript:void(0)" class="brush-size size4">7</a>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<em class="eraserIcon"></em>',
+            '<a href="javascript:void(0)" class="eraser-size size1">5</a>',
+            '<a href="javascript:void(0)" class="eraser-size size2">10</a>',
+            '<a href="javascript:void(0)" class="eraser-size size3">15</a>',
+            '<a href="javascript:void(0)" class="eraser-size size4">20</a>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<em class="blurIcon"></em>',
+            '<a href="javascript:void(0)" class="blur-size size1">2</a>',
+            '<a href="javascript:void(0)" class="blur-size size2">4</a>',
+            '<a href="javascript:void(0)" class="blur-size size3">6</a>',
+            '<a href="javascript:void(0)" class="blur-size size4">8</a>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<span id="clearSetting" class="clearSetting">',
+            '<em class="icon"></em>',
+            '<em class="text">初始化设置</em>',
+            '</span>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<div id="J_addImg" class="addImgH">',
+            '<em class="icon"></em>',
+            '<em class="text">添加背景</em>',
+            '<input type="file" class="upload" id="J_canvas_bg" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>',
+            '</div>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<span id="J_removeImg" class="removeImg">',
+            '<em class="icon"></em>',
+            '<em class="text">删除背景</em>',
+            '</span>',
+            '</div>',
+            '</div>'
+        ].join('');
+        var dataURLtoFile = function (dataurl, filename) {
+            var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
+                bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
+            while (n--) {
+                u8arr[n] = bstr.charCodeAt(n);
+            }
+            return new File([u8arr], filename, {type: mime});
+        };
+        var dialog = self.createDialog({
+            name: name,
+            width: 750,
+            height: 440,
+            title: self.lang(name),
+            body: html,
+            yesBtn: {
+                name: lang.btnText,
+                click: function (e) {
+                    if (dialog.isLoading) {
+                        return;
+                    }
+                    if (canvas.isEmpty()) {
+                        K.options.errorMsgHandler(lang.empty, "error");
+                        return;
+                    }
+                    canvas.save(function (data) {
+                        if (allowUploadGraft) {
+                            var callback = function (res) {
+                                dialog.hideLoading();
+                                if (res.code == "000") {
+                                    //K.options.errorMsgHandler(lang.uploadSuccess, "ok");
+                                    clickFn.call(self, res.data.url);
+                                    self.hideDialog().focus();
+                                } else {
+                                    K.options.errorMsgHandler(lang.uploadFaild, "error");
+                                }
+                            };
+                            dialog.showLoading(self.lang('uploadLoading'));
+                            if (typeof self.beforeUpload == 'function') {
+                                var file = dataURLtoFile(data, "graft.png");
+                                self.beforeUpload.call(this, callback, file);
+                            } else {
+                                $.post(uploadJson, {
+                                    img_base64_data: data,
+                                    fileType: "image",
+                                    base64: 1
+                                }, function (res) {
+                                    callback(res);
+                                }, "json");
+                            }
+                        } else {
+                            clickFn.call(self, data);
+                            self.hideDialog().focus();
+                        }
+                    });
+                }
+            }
+        });
+        var canvas = new Canvas({
+            canvasId: "canvas-borad",
+            width: 600,
+            height: 320
+        });
+    };
+    self.clickToolbar(name, function () {
+        self.plugin.graftDialog({
+            clickFn: function (url) {
+                self.exec('insertimage', url);
+            }
+        });
+    });
+});
+/**
+ * 文件服务器管理
+ * @author yangjian <yangjian102621@gmail.com>
+ * @since v4.1.12(2017-09-12)
+ * @site http://git.oschina.net/blackfox/kindeditor
+ */
+KindEditor.plugin('filemanager', function (K) {
+    var self = this;
+    var fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php');
+    var lang = self.lang('filemanager.');
+    if (typeof jQuery == 'undefined') {
+        K.options.errorMsgHandler(lang.depJQueryError, "error");
+        return;
+    } else {
+        K.loadScript(K.options.pluginsPath + "filemanager/FManager.js");
+        K.loadStyle(K.options.pluginsPath + "multiimage/css/upload.css");
+    }
+
+    self.plugin.filemanagerDialog = function (options) {
+
+        var clickFn = options.clickFn;
+        new FManager({
+            list_url: fileManagerJson,	//图片列表数据获取url
+            lang: lang, //语言包
+            fileType: options.dirName,
+            top: self.dialogOffset,
+            multiple: options.multiple ? true : false,
+            callback: function (data) {
+                clickFn.call(this, options.multiple ? data : data[0]);
+            }
+        });
+        //return dialog;
+    }
+
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('pagebreak', function (K) {
+    var self = this;
+    var name = 'pagebreak';
+    var pagebreakHtml = K.undef(self.pagebreakHtml, '<hr style="page-break-after: always;" class="ke-pagebreak" />');
+    self.clickToolbar(name, function () {
+        var cmd = self.cmd, range = cmd.range;
+        self.focus();
+        var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : '<span id="__kindeditor_tail_tag__"></span>';
+        self.insertHtml(pagebreakHtml + tail);
+        if (tail !== '') {
+            var p = K('#__kindeditor_tail_tag__', self.edit.doc);
+            range.selectNodeContents(p[0]);
+            p.removeAttr('id');
+            cmd.select();
+        }
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('plainpaste', function (K) {
+    var self = this, name = 'plainpaste';
+    self.clickToolbar(name, function () {
+        var lang = self.lang(name + '.'),
+            html = '<div style="padding:10px 20px;">' +
+                '<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+                '<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>' +
+                '</div>',
+            dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var html = textarea.val();
+                        html = K.escape(html);
+                        html = html.replace(/ {2}/g, ' &nbsp;');
+                        if (self.newlineTag == 'p') {
+                            html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>');
+                        } else {
+                            html = html.replace(/\n/g, '<br />$&');
+                        }
+                        self.insertHtml(html).hideDialog().focus();
+                    }
+                }
+            }),
+            textarea = K('textarea', dialog.div);
+        textarea[0].focus();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('preview', function (K) {
+    var self = this, name = 'preview', undefined;
+    self.clickToolbar(name, function () {
+        var lang = self.lang(name + '.'),
+            width = document.documentElement.clientWidth * 0.9,
+            height = document.documentElement.clientHeight - 160,
+            html = '<div style="padding:10px 20px;">' +
+                '<iframe class="ke-textarea" frameborder="0" style="width:' + (width - 42) + 'px;height:' + height + 'px;"></iframe>' +
+                '</div>',
+            dialog = self.createDialog({
+                name: name,
+                width: width,
+                title: self.lang(name),
+                body: html
+            }),
+            iframe = K('iframe', dialog.div),
+            doc = K.iframeDoc(iframe);
+        doc.open();
+        var cssPath = self.options.cssPath;
+        var jsPath = self.options.jsPath;
+        var arr = [
+            '<html lang="en">',
+            '<head><meta charset="utf-8" /><title></title>',
+            '<style>',
+            'html {margin:0;padding:0;}',
+            'body {margin:0;padding:5px;}',
+            'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
+            'body, p, div {word-wrap: break-word;}',
+            'p {margin:5px 0;}',
+            'table {border-collapse:collapse;}',
+            'img {border:0;}',
+            'noscript {display:none;}',
+            'table.ke-zeroborder td {border:1px dotted #AAA;}',
+            'img.ke-flash {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + self.options.themesPath + 'common/flash.svg);',
+            '	*background-image:url(' + self.options.themesPath + 'common/flash.png);',
+            '	background-size:64px 64px;',
+            '	background-position:center center;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-rm {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + self.options.themesPath + 'common/rm.gif);',
+            '	background-position:center center;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-media {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + self.options.themesPath + 'common/play.svg);',
+            '	*background-image:url(' + self.options.themesPath + 'common/play.png);',
+            '	background-position:center center;',
+            '	background-size:64px 64px;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-anchor {',
+            '	border:1px dashed #666;',
+            '	width:16px;',
+            '	height:16px;',
+            '}',
+            '.ke-script, .ke-noscript, .ke-display-none {',
+            '	display:none;',
+            '	font-size:0;',
+            '	width:0;',
+            '	height:0;',
+            '}',
+            '.ke-pagebreak {',
+            '	border:1px dotted #AAA;',
+            '	font-size:0;',
+            '	height:2px;',
+            '}'
+        ];
+        if (self.options.showHelpGrid) {
+            arr.push('p,ul,ol,li,div{border: 1px dashed #c1c1c1;}');
+            arr.push('li{margin:5px 0px}');
+            arr.push('div,ul,ol{margin-bottom:10px}');
+        }
+        arr.push('</style>');
+        if (!K.isArray(cssPath)) {
+            cssPath = [cssPath];
+        }
+        if (K.inArray(self.options.pluginsPath + 'code/prism.css', cssPath) < 0) {
+            cssPath.push(self.options.pluginsPath + 'code/prism.css');
+        }
+        K.each(cssPath, function (i, path) {
+            if (path) {
+                arr.push('<link href="' + path + '" rel="stylesheet" />');
+            }
+        });
+        if (self.options.cssData) {
+            arr.push('<style>' + self.options.cssData + '</style>');
+        }
+        arr.push('</head><body ' + (self.options.bodyClass ? 'class="' + self.options.bodyClass + '"' : '') + '>');
+        arr.push(self.fullHtml());
+        if (!K.isArray(jsPath)) {
+            jsPath = [jsPath];
+        }
+        if (K.inArray(self.options.pluginsPath + 'code/prism.js', jsPath) < 0) {
+            jsPath.push(self.options.pluginsPath + 'code/prism.js');
+        }
+        K.each(jsPath, function (i, path) {
+            if (path) {
+                arr.push('<script type="text/javascript" src="' + path + '"></script>');
+            }
+        });
+        arr.push('</body></html>');
+        doc.write(arr.join('\n'));
+        doc.close();
+        K(doc.body).css('background-color', '#FFF');
+        iframe[0].contentWindow.focus();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('quickformat', function (K) {
+    var self = this, name = 'quickformat',
+        blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p');
+
+    function getFirstChild(knode) {
+        var child = knode.first();
+        while (child && child.first()) {
+            child = child.first();
+        }
+        return child;
+    }
+
+    self.clickToolbar(name, function () {
+        self.focus();
+        var doc = self.edit.doc,
+            range = self.cmd.range,
+            child = K(doc.body).first(), next,
+            nodeList = [], subList = [],
+            bookmark = range.createBookmark(true);
+        while (child) {
+            next = child.next();
+            var firstChild = getFirstChild(child);
+            if (!firstChild || firstChild.name != 'img') {
+                if (blockMap[child.name]) {
+                    child.html(child.html().replace(/^(\s|&nbsp;| )+/ig, ''));
+                    child.css('text-indent', '2em');
+                } else {
+                    subList.push(child);
+                }
+                if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) {
+                    if (subList.length > 0) {
+                        nodeList.push(subList);
+                    }
+                    subList = [];
+                }
+            }
+            child = next;
+        }
+        K.each(nodeList, function (i, subList) {
+            var wrapper = K('<p style="text-indent:2em;"></p>', doc);
+            subList[0].before(wrapper);
+            K.each(subList, function (i, knode) {
+                wrapper.append(knode);
+            });
+        });
+        range.moveToBookmark(bookmark);
+        self.addBookmark();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('table', function (K) {
+    var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder';
+    var borderColor = K.undef(self.options.tableBorderColor, '#cccccc');
+
+    function _setColor(box, color) {
+        color = color.toUpperCase();
+        box.css('background-color', color);
+        box.css('color', color === '#000000' ? '#FFFFFF' : '#000000');
+        box.html(color);
+    }
+
+    var pickerList = [];
+
+    function _initColorPicker(dialogDiv, colorBox) {
+        colorBox.bind('click,mousedown', function (e) {
+            e.stopPropagation();
+        });
+
+        function removePicker() {
+            K.each(pickerList, function () {
+                this.remove();
+            });
+            pickerList = [];
+            K(document).unbind('click,mousedown', removePicker);
+            dialogDiv.unbind('click,mousedown', removePicker);
+        }
+
+        colorBox.click(function (e) {
+            removePicker();
+            var box = K(this),
+                pos = box.pos();
+            var picker = K.colorpicker({
+                x: pos.x,
+                y: pos.y + box.height(),
+                z: 811214,
+                selectedColor: K(this).html(),
+                colors: self.colorTable,
+                noColor: self.lang('noColor'),
+                shadowMode: self.shadowMode,
+                click: function (color) {
+                    _setColor(box, color);
+                    removePicker();
+                }
+            });
+            pickerList.push(picker);
+            K(document).bind('click,mousedown', removePicker);
+            dialogDiv.bind('click,mousedown', removePicker);
+        });
+    }
+
+    function _getCellIndex(table, row, cell) {
+        var rowSpanCount = 0;
+        for (var i = 0, len = row.cells.length; i < len; i++) {
+            if (row.cells[i] == cell) {
+                break;
+            }
+            rowSpanCount += row.cells[i].rowSpan - 1;
+        }
+        return cell.cellIndex - rowSpanCount;
+    }
+
+    self.plugin.table = {
+        prop: function (isInsert) {
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keRows" class="row-left">' + lang.cells + ':</label>',
+                '<div class="row-right">',
+                lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',
+                lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keWidth" class="row-left">' + lang.size + ':</label>',
+                '<div class="row-right">',
+                lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+                '<select name="widthType" class="ke-select">',
+                '<option value="%">' + lang.percent + '</option>',
+                '<option value="px">' + lang.px + '</option>',
+                '</select> &nbsp; ',
+                lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+                '<select name="heightType" class="ke-select">',
+                '<option value="%">' + lang.percent + '</option>',
+                '<option value="px">' + lang.px + '</option>',
+                '</select>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="kePadding" class="row-left">' + lang.space + ':</label>',
+                '<div class="row-right">',
+                lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',
+                lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keAlign" class="row-left">' + lang.align + ':</label>',
+                '<div class="row-right">',
+                '<select id="keAlign" class="ke-select" name="align">',
+                '<option value="">' + lang.alignDefault + '</option>',
+                '<option value="left">' + lang.alignLeft + '</option>',
+                '<option value="center">' + lang.alignCenter + '</option>',
+                '<option value="right">' + lang.alignRight + '</option>',
+                '</select>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keBorder" class="row-left">' + lang.border + ':</label>',
+                '<div class="row-right">',
+                lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+                lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keBgColor" class="row-left">' + lang.backgroundColor + ':</label>',
+                '<div class="row-right">',
+                '<span class="ke-inline-block ke-input-color"></span>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var bookmark = self.cmd.range.createBookmark();
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 500,
+                    title: self.lang(name),
+                    body: html,
+                    beforeRemove: function () {
+                        colorBox.unbind();
+                    },
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var rows = rowsBox.val(),
+                                cols = colsBox.val(),
+                                width = widthBox.val(),
+                                height = heightBox.val(),
+                                widthType = widthTypeBox.val(),
+                                heightType = heightTypeBox.val(),
+                                padding = paddingBox.val(),
+                                spacing = spacingBox.val(),
+                                align = alignBox.val(),
+                                border = borderBox.val(),
+                                borderColor = K(colorBox[0]).html() || '',
+                                bgColor = K(colorBox[1]).html() || '';
+                            if (rows == 0 || !/^\d+$/.test(rows)) {
+                                K.options.errorMsgHandler(self.lang('invalidRows'), "error");
+                                rowsBox[0].focus();
+                                return;
+                            }
+                            if (cols == 0 || !/^\d+$/.test(cols)) {
+                                K.options.errorMsgHandler(self.lang('invalidRows'), "error");
+                                colsBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(width)) {
+                                K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                                widthBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(height)) {
+                                K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                                heightBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(padding)) {
+                                K.options.errorMsgHandler(self.lang('invalidPadding'), "error");
+                                paddingBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(spacing)) {
+                                K.options.errorMsgHandler(self.lang('invalidSpacing'), "error");
+                                spacingBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(border)) {
+                                K.options.errorMsgHandler(self.lang('invalidBorder'), "error");
+                                borderBox[0].focus();
+                                return;
+                            }
+                            if (table) {
+                                if (width !== '') {
+                                    table.width(width + widthType);
+                                } else {
+                                    table.css('width', '');
+                                }
+                                if (table[0].width !== undefined) {
+                                    table.removeAttr('width');
+                                }
+                                if (height !== '') {
+                                    table.height(height + heightType);
+                                } else {
+                                    table.css('height', '');
+                                }
+                                if (table[0].height !== undefined) {
+                                    table.removeAttr('height');
+                                }
+                                table.css('background-color', bgColor);
+                                if (table[0].bgColor !== undefined) {
+                                    table.removeAttr('bgColor');
+                                }
+                                if (padding !== '') {
+                                    table[0].cellPadding = padding;
+                                } else {
+                                    table.removeAttr('cellPadding');
+                                }
+                                if (spacing !== '') {
+                                    table[0].cellSpacing = spacing;
+                                } else {
+                                    table.removeAttr('cellSpacing');
+                                }
+                                if (align !== '') {
+                                    table[0].align = align;
+                                } else {
+                                    table.removeAttr('align');
+                                }
+                                if (border !== '') {
+                                    table.attr('border', border);
+                                } else {
+                                    table.removeAttr('border');
+                                }
+                                if (border === '' || border === '0') {
+                                    table.addClass(zeroborder);
+                                } else {
+                                    table.removeClass(zeroborder);
+                                }
+                                if (borderColor !== '') {
+                                    table.attr('borderColor', borderColor);
+                                } else {
+                                    table.removeAttr('borderColor');
+                                }
+                                self.hideDialog().focus();
+                                self.cmd.range.moveToBookmark(bookmark);
+                                self.cmd.select();
+                                self.addBookmark();
+                                return;
+                            }
+                            var style = '';
+                            if (width !== '') {
+                                style += 'width:' + width + widthType + ';';
+                            }
+                            if (height !== '') {
+                                style += 'height:' + height + heightType + ';';
+                            }
+                            if (bgColor !== '') {
+                                style += 'background-color:' + bgColor + ';';
+                            }
+                            var html = '<table class="table"';
+                            if (style !== '') {
+                                html += ' style="' + style + '"';
+                            }
+                            if (padding !== '') {
+                                html += ' cellpadding="' + padding + '"';
+                            }
+                            if (spacing !== '') {
+                                html += ' cellspacing="' + spacing + '"';
+                            }
+                            if (align !== '') {
+                                html += ' align="' + align + '"';
+                            }
+                            if (border !== '') {
+                                html += ' border="' + border + '"';
+                            }
+                            if (border === '' || border === '0') {
+                                html += ' class="table ' + zeroborder + '"';
+                            }
+                            if (borderColor !== '') {
+                                html += ' bordercolor="' + borderColor + '"';
+                            }
+                            html += '>';
+                            for (var i = 0; i < rows; i++) {
+                                html += '<tr>';
+                                for (var j = 0; j < cols; j++) {
+                                    html += '<td>' + (K.IE ? '&nbsp;' : '<br />') + '</td>';
+                                }
+                                html += '</tr>';
+                            }
+                            html += '</table>';
+                            if (!K.IE) {
+                                html += '<br />';
+                            }
+
+                            function getAncestorTag(range) {
+                                var ancestor = K(range.commonAncestor());
+                                while (ancestor) {
+                                    if (ancestor.type == 1 && !ancestor.isStyle()) {
+                                        break;
+                                    }
+                                    ancestor = ancestor.parent();
+                                }
+                                return ancestor;
+                            }
+
+                            var tag = getAncestorTag(self.cmd.range);
+                            if (tag.name == 'p') {
+                                tag.before(K(html));
+                                tag.remove();
+                                self.cmd.selection();
+                                self.insertHtml('<br />');
+                                self.select().hideDialog().focus();
+                            } else {
+                                self.insertHtml(html);
+                                self.select().hideDialog().focus();
+                                self.addBookmark();
+                            }
+                        }
+                    }
+                }),
+                div = dialog.div,
+                rowsBox = K('[name="rows"]', div).val(3),
+                colsBox = K('[name="cols"]', div).val(2),
+                widthBox = K('[name="width"]', div).val(100),
+                heightBox = K('[name="height"]', div),
+                widthTypeBox = K('[name="widthType"]', div),
+                heightTypeBox = K('[name="heightType"]', div),
+                paddingBox = K('[name="padding"]', div).val(0),
+                spacingBox = K('[name="spacing"]', div).val(0),
+                alignBox = K('[name="align"]', div),
+                borderBox = K('[name="border"]', div).val(1),
+                colorBox = K('.ke-input-color', div);
+            _initColorPicker(div, colorBox.eq(0));
+            _initColorPicker(div, colorBox.eq(1));
+            _setColor(colorBox.eq(1), '');
+            rowsBox[0].focus();
+            rowsBox[0].select();
+            var table;
+            if (isInsert) {
+                return;
+            }
+            table = self.plugin.getSelectedTable();
+            if (table) {
+                rowsBox.val(table[0].rows.length);
+                colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0);
+                rowsBox.attr('disabled', true);
+                colsBox.attr('disabled', true);
+                var match,
+                    tableWidth = table[0].style.width || table[0].width,
+                    tableHeight = table[0].style.height || table[0].height;
+                if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) {
+                    widthBox.val(match[1]);
+                    widthTypeBox.val(match[2]);
+                } else {
+                    widthBox.val('');
+                }
+                if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) {
+                    heightBox.val(match[1]);
+                    heightTypeBox.val(match[2]);
+                }
+                paddingBox.val(table[0].cellPadding || '');
+                spacingBox.val(table[0].cellSpacing || '');
+                alignBox.val(table[0].align || '');
+                borderBox.val(table[0].border === undefined ? '' : table[0].border);
+                _setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || ''));
+                _setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || ''));
+                widthBox[0].focus();
+                widthBox[0].select();
+            }
+        },
+        cellprop: function () {
+            var html = [
+                '<div style="padding:20px;">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
+                lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+                '<select name="widthType">',
+                '<option value="%">' + lang.percent + '</option>',
+                '<option value="px">' + lang.px + '</option>',
+                '</select> &nbsp; ',
+                lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+                '<select name="heightType">',
+                '<option value="%">' + lang.percent + '</option>',
+                '<option value="px">' + lang.px + '</option>',
+                '</select>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
+                lang.textAlign + ' <select id="keAlign" name="textAlign">',
+                '<option value="">' + lang.alignDefault + '</option>',
+                '<option value="left">' + lang.alignLeft + '</option>',
+                '<option value="center">' + lang.alignCenter + '</option>',
+                '<option value="right">' + lang.alignRight + '</option>',
+                '</select> ',
+                lang.verticalAlign + ' <select name="verticalAlign">',
+                '<option value="">' + lang.alignDefault + '</option>',
+                '<option value="top">' + lang.alignTop + '</option>',
+                '<option value="middle">' + lang.alignMiddle + '</option>',
+                '<option value="bottom">' + lang.alignBottom + '</option>',
+                '<option value="baseline">' + lang.alignBaseline + '</option>',
+                '</select>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
+                lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+                lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
+                '<span class="ke-inline-block ke-input-color"></span>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var bookmark = self.cmd.range.createBookmark();
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 500,
+                    title: self.lang('tablecell'),
+                    body: html,
+                    beforeRemove: function () {
+                        colorBox.unbind();
+                    },
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var width = widthBox.val(),
+                                height = heightBox.val(),
+                                widthType = widthTypeBox.val(),
+                                heightType = heightTypeBox.val(),
+                                padding = paddingBox.val(),
+                                spacing = spacingBox.val(),
+                                textAlign = textAlignBox.val(),
+                                verticalAlign = verticalAlignBox.val(),
+                                border = borderBox.val(),
+                                borderColor = K(colorBox[0]).html() || '',
+                                bgColor = K(colorBox[1]).html() || '';
+                            if (!/^\d*$/.test(width)) {
+                                K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                                widthBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(height)) {
+                                K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                                heightBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(border)) {
+                                K.options.errorMsgHandler(self.lang('invalidBorder'), "error");
+                                borderBox[0].focus();
+                                return;
+                            }
+                            cell.css({
+                                width: width !== '' ? (width + widthType) : '',
+                                height: height !== '' ? (height + heightType) : '',
+                                'background-color': bgColor,
+                                'text-align': textAlign,
+                                'vertical-align': verticalAlign,
+                                'border-width': border,
+                                'border-style': border !== '' ? 'solid' : '',
+                                'border-color': borderColor
+                            });
+                            self.hideDialog().focus();
+                            self.cmd.range.moveToBookmark(bookmark);
+                            self.cmd.select();
+                            self.addBookmark();
+                        }
+                    }
+                }),
+                div = dialog.div,
+                widthBox = K('[name="width"]', div).val(100),
+                heightBox = K('[name="height"]', div),
+                widthTypeBox = K('[name="widthType"]', div),
+                heightTypeBox = K('[name="heightType"]', div),
+                paddingBox = K('[name="padding"]', div).val(0),
+                spacingBox = K('[name="spacing"]', div).val(0),
+                textAlignBox = K('[name="textAlign"]', div),
+                verticalAlignBox = K('[name="verticalAlign"]', div),
+                borderBox = K('[name="border"]', div).val(1),
+                colorBox = K('.ke-input-color', div);
+            _initColorPicker(div, colorBox.eq(0));
+            _initColorPicker(div, colorBox.eq(1));
+            _setColor(colorBox.eq(1), '');
+            widthBox[0].focus();
+            widthBox[0].select();
+            var cell = self.plugin.getSelectedCell();
+            var match,
+                cellWidth = cell[0].style.width || cell[0].width || '',
+                cellHeight = cell[0].style.height || cell[0].height || '';
+            if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) {
+                widthBox.val(match[1]);
+                widthTypeBox.val(match[2]);
+            } else {
+                widthBox.val('');
+            }
+            if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) {
+                heightBox.val(match[1]);
+                heightTypeBox.val(match[2]);
+            }
+            textAlignBox.val(cell[0].style.textAlign || '');
+            verticalAlignBox.val(cell[0].style.verticalAlign || '');
+            var border = cell[0].style.borderWidth || '';
+            if (border) {
+                border = parseInt(border);
+            }
+            borderBox.val(border);
+            _setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || ''));
+            _setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || ''));
+            widthBox[0].focus();
+            widthBox[0].select();
+        },
+        insert: function () {
+            this.prop(true);
+        },
+        'delete': function () {
+            var table = self.plugin.getSelectedTable();
+            self.cmd.range.setStartBefore(table[0]).collapse(true);
+            self.cmd.select();
+            table.remove();
+            self.addBookmark();
+        },
+        colinsert: function (offset) {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                index = cell.cellIndex + offset;
+            index += table.rows[0].cells.length - row.cells.length;
+            for (var i = 0, len = table.rows.length; i < len; i++) {
+                var newRow = table.rows[i],
+                    newCell = newRow.insertCell(index);
+                newCell.innerHTML = K.IE ? '' : '<br />';
+                index = _getCellIndex(table, newRow, newCell);
+            }
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        colinsertleft: function () {
+            this.colinsert(0);
+        },
+        colinsertright: function () {
+            this.colinsert(1);
+        },
+        rowinsert: function (offset) {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0];
+            var rowIndex = row.rowIndex;
+            if (offset === 1) {
+                rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset;
+            }
+            var newRow = table.insertRow(rowIndex);
+            for (var i = 0, len = row.cells.length; i < len; i++) {
+                if (row.cells[i].rowSpan > 1) {
+                    len -= row.cells[i].rowSpan - 1;
+                }
+                var newCell = newRow.insertCell(i);
+                if (offset === 1 && row.cells[i].colSpan > 1) {
+                    newCell.colSpan = row.cells[i].colSpan;
+                }
+                newCell.innerHTML = K.IE ? '' : '<br />';
+            }
+            for (var j = rowIndex; j >= 0; j--) {
+                var cells = table.rows[j].cells;
+                if (cells.length > i) {
+                    for (var k = cell.cellIndex; k >= 0; k--) {
+                        if (cells[k].rowSpan > 1) {
+                            cells[k].rowSpan += 1;
+                        }
+                    }
+                    break;
+                }
+            }
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        rowinsertabove: function () {
+            this.rowinsert(0);
+        },
+        rowinsertbelow: function () {
+            this.rowinsert(1);
+        },
+        rowmerge: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                rowIndex = row.rowIndex,
+                nextRowIndex = rowIndex + cell.rowSpan,
+                nextRow = table.rows[nextRowIndex];
+            if (table.rows.length <= nextRowIndex) {
+                return;
+            }
+            var cellIndex = cell.cellIndex;
+            if (nextRow.cells.length <= cellIndex) {
+                return;
+            }
+            var nextCell = nextRow.cells[cellIndex];
+            if (cell.colSpan !== nextCell.colSpan) {
+                return;
+            }
+            cell.rowSpan += nextCell.rowSpan;
+            nextRow.deleteCell(cellIndex);
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        colmerge: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                rowIndex = row.rowIndex,
+                cellIndex = cell.cellIndex,
+                nextCellIndex = cellIndex + 1;
+            if (row.cells.length <= nextCellIndex) {
+                return;
+            }
+            var nextCell = row.cells[nextCellIndex];
+            if (cell.rowSpan !== nextCell.rowSpan) {
+                return;
+            }
+            cell.colSpan += nextCell.colSpan;
+            row.deleteCell(nextCellIndex);
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        rowsplit: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                rowIndex = row.rowIndex;
+            if (cell.rowSpan === 1) {
+                return;
+            }
+            var cellIndex = _getCellIndex(table, row, cell);
+            for (var i = 1, len = cell.rowSpan; i < len; i++) {
+                var newRow = table.rows[rowIndex + i],
+                    newCell = newRow.insertCell(cellIndex);
+                if (cell.colSpan > 1) {
+                    newCell.colSpan = cell.colSpan;
+                }
+                newCell.innerHTML = K.IE ? '' : '<br />';
+                cellIndex = _getCellIndex(table, newRow, newCell);
+            }
+            K(cell).removeAttr('rowSpan');
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        colsplit: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                cellIndex = cell.cellIndex;
+            if (cell.colSpan === 1) {
+                return;
+            }
+            for (var i = 1, len = cell.colSpan; i < len; i++) {
+                var newCell = row.insertCell(cellIndex + i);
+                if (cell.rowSpan > 1) {
+                    newCell.rowSpan = cell.rowSpan;
+                }
+                newCell.innerHTML = K.IE ? '' : '<br />';
+            }
+            K(cell).removeAttr('colSpan');
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        coldelete: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                index = cell.cellIndex;
+            for (var i = 0, len = table.rows.length; i < len; i++) {
+                var newRow = table.rows[i],
+                    newCell = newRow.cells[index];
+                if (newCell.colSpan > 1) {
+                    newCell.colSpan -= 1;
+                    if (newCell.colSpan === 1) {
+                        K(newCell).removeAttr('colSpan');
+                    }
+                } else {
+                    newRow.deleteCell(index);
+                }
+                if (newCell.rowSpan > 1) {
+                    i += newCell.rowSpan - 1;
+                }
+            }
+            if (row.cells.length === 0) {
+                self.cmd.range.setStartBefore(table).collapse(true);
+                self.cmd.select();
+                K(table).remove();
+            } else {
+                self.cmd.selection(true);
+            }
+            self.addBookmark();
+        },
+        rowdelete: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                rowIndex = row.rowIndex;
+            for (var i = cell.rowSpan - 1; i >= 0; i--) {
+                table.deleteRow(rowIndex + i);
+            }
+            if (table.rows.length === 0) {
+                self.cmd.range.setStartBefore(table).collapse(true);
+                self.cmd.select();
+                K(table).remove();
+            } else {
+                self.cmd.selection(true);
+            }
+            self.addBookmark();
+        }
+    };
+    self.clickToolbar(name, self.plugin.table.prop);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('template', function (K) {
+    var self = this, name = 'template', lang = self.lang(name + '.'),
+        htmlPath = self.pluginsPath + name + '/html/';
+
+    function getFilePath(fileName) {
+        return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION);
+    }
+
+    self.clickToolbar(name, function () {
+        var lang = self.lang(name + '.'),
+            arr = ['<div class="ke-dialog-content-inner" style="padding-top:0">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<div class="ke-header" style="height: 32px;">',
+                lang.selectTemplate + ' <select class="ke-select">'];
+        K.each(lang.fileList, function (key, val) {
+            arr.push('<option value="' + key + '">' + val + '</option>');
+        });
+        html = [arr.join(''),
+            '</select>',
+            '<input type="checkbox" id="keReplaceFlag" class="checkbox" name="replaceFlag" value="1" /> <label for="keReplaceFlag">' + lang.replaceContent + '</label>',
+            '</div>',
+            '</div>',
+            '<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',
+            '</div>'].join('');
+        var dialog = self.createDialog({
+            name: name,
+            width: 500,
+            title: self.lang(name),
+            body: html,
+            yesBtn: {
+                name: self.lang('yes'),
+                click: function (e) {
+                    var doc = K.iframeDoc(iframe);
+                    self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus();
+                }
+            }
+        });
+        var selectBox = K('select', dialog.div),
+            checkbox = K('[name="replaceFlag"]', dialog.div),
+            iframe = K('iframe', dialog.div);
+        checkbox[0].checked = true;
+        iframe.attr('src', getFilePath(selectBox.val()));
+        selectBox.change(function () {
+            iframe.attr('src', getFilePath(this.value));
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('wordpaste', function (K) {
+    var self = this, name = 'wordpaste';
+    self.clickToolbar(name, function () {
+        var jsonp = function (url, callback) {
+            var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
+            window[callbackName] = function (data) {
+                delete window[callbackName];
+                document.body.removeChild(script);
+                callback(data);
+            };
+
+            var script = document.createElement('script');
+            script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
+            document.body.appendChild(script);
+        };
+        var lang = self.lang(name + '.'),
+            html = '<div style="padding:10px 20px;">' +
+                '<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+                '<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>' +
+                '</div>',
+            dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var str = doc.body.innerHTML;
+                        str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags);
+                        if (typeof self.wordImageServer !== 'undefined' && self.wordImageServer) {
+                            var i = 0;
+                            var arr = [];
+                            var replacedStr = str.replace(/file:\/\/+(localhost)?(\S+\.(png|jpg|jpeg|gif|bmp))/ig, function (value) {
+                                arr[i] = value;
+                                var replaced = "##" + i + "##";
+                                i++;
+                                return replaced;
+                            });
+                            for (var j = 0; j < arr.length; j++) {
+                                jsonp("http://" + self.wordImageServer + "/word?index=" + j + "&file=" + encodeURIComponent(arr[j]), function (data) {
+                                    K.uploadwordimage.call(self, data.index, data.info);
+                                });
+                            }
+                            str = replacedStr;
+                        }
+                        self.insertHtml(str).hideDialog().focus();
+                    }
+                }
+            }),
+            div = dialog.div,
+            iframe = K('iframe', div),
+            doc = K.iframeDoc(iframe);
+        if (!K.IE) {
+            doc.designMode = 'on';
+        }
+        doc.open();
+        doc.write('<!doctype html><html><head><title>WordPaste</title></head>');
+        doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');
+        if (!K.IE) {
+            doc.write('<br />');
+        }
+        doc.write('</body></html>');
+        doc.close();
+        if (K.IE) {
+            doc.body.contentEditable = 'true';
+        }
+        iframe[0].contentWindow.focus();
+    });
+});
+
+
+KindEditor.plugin('fixtoolbar', function (K) {
+    var self = this;
+    if (!self.fixToolBar) {
+        return;
+    }
+
+    function init() {
+        var toolbar = K('.ke-toolbar');
+        var originY = toolbar.pos().y;
+        K(window).bind('scroll', function () {
+            if (toolbar.css('position') == 'fixed') {
+                if (document.body.scrollTop - originY < 0) {
+                    toolbar.css('position', 'static');
+                    toolbar.css('top', 'auto');
+                }
+            } else {
+                if (toolbar.pos().y - document.body.scrollTop < 0) {
+                    toolbar.css('position', 'fixed');
+                    toolbar.css('top', 0);
+                }
+            }
+        });
+    }
+
+    if (self.isCreated) {
+        init();
+    } else {
+        self.afterCreate(init);
+    }
+});
diff --git a/addons/nkeditor/assets/nkeditor.min.js b/addons/nkeditor/assets/nkeditor.min.js
new file mode 100644
index 0000000..1c399aa
--- /dev/null
+++ b/addons/nkeditor/assets/nkeditor.min.js
@@ -0,0 +1 @@
+(function(window,undefined){if(window.KindEditor){return}if(!window.console){window.console={}}if(!console.log){console.log=function(){}}var _VERSION="5.0.3 (2018-10-25)",_ua=navigator.userAgent.toLowerCase(),_IE=_ua.indexOf("msie")>-1&&_ua.indexOf("opera")==-1,_NEWIE=_ua.indexOf("msie")==-1&&_ua.indexOf("trident")>-1,_GECKO=_ua.indexOf("gecko")>-1&&_ua.indexOf("khtml")==-1,_WEBKIT=_ua.indexOf("applewebkit")>-1,_OPERA=_ua.indexOf("opera")>-1,_MOBILE=_ua.indexOf("mobile")>-1,_IOS=/ipad|iphone|ipod/.test(_ua),_QUIRKS=document.compatMode!="CSS1Compat",_IERANGE=!window.getSelection,_matches=/(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(_ua),_V=_matches?_matches[1]:"0",_TIME=(new Date).getTime();function _isArray(val){if(!val){return false}return Object.prototype.toString.call(val)==="[object Array]"}function _isFunction(val){if(!val){return false}return Object.prototype.toString.call(val)==="[object Function]"}function _inArray(val,arr){for(var i=0,len=arr.length;i<len;i++){if(val===arr[i]){return i}}return-1}function _each(obj,fn){if(_isArray(obj)){for(var i=0,len=obj.length;i<len;i++){if(fn.call(obj[i],i,obj[i])===false){break}}}else{for(var key in obj){if(obj.hasOwnProperty(key)){if(fn.call(obj[key],key,obj[key])===false){break}}}}}function _trim(str){return str.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"")}function _inString(val,str,delimiter){delimiter=delimiter===undefined?",":delimiter;return(delimiter+str+delimiter).indexOf(delimiter+val+delimiter)>=0}function _addUnit(val,unit){unit=unit||"px";return val&&/^-?\d+(?:\.\d+)?$/.test(val)?val+unit:val}function _removeUnit(val){var match;return val&&(match=/(\d+)/.exec(val))?parseInt(match[1],10):0}function _escape(val){return val.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function _unescape(val){return val.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&amp;/g,"&")}function _toCamel(str){var arr=str.split("-");str="";_each(arr,function(key,val){str+=key>0?val.charAt(0).toUpperCase()+val.substr(1):val});return str}function _toHex(val){function hex(d){var s=parseInt(d,10).toString(16).toUpperCase();return s.length>1?s:"0"+s}return val.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/gi,function($0,$1,$2,$3){return"#"+hex($1)+hex($2)+hex($3)})}function _toMap(val,delimiter){delimiter=delimiter===undefined?",":delimiter;var map={},arr=_isArray(val)?val:val.split(delimiter),match;_each(arr,function(key,val){if(match=/^(\d+)\.\.(\d+)$/.exec(val)){for(var i=parseInt(match[1],10);i<=parseInt(match[2],10);i++){map[i.toString()]=true}}else{map[val]=true}});return map}function _toArray(obj,offset){return Array.prototype.slice.call(obj,offset||0)}function _undef(val,defaultVal){return val===undefined?defaultVal:val}function _invalidUrl(url){return!url||/[<>"]/.test(url)}function _addParam(url,param){return url.indexOf("?")>=0?url+"&"+param:url+"?"+param}function _extend(child,parent,proto){if(!proto){proto=parent;parent=null}var childProto;if(parent){var fn=function(){};fn.prototype=parent.prototype;childProto=new fn;_each(proto,function(key,val){childProto[key]=val})}else{childProto=proto}childProto.constructor=child;child.prototype=childProto;child.parent=parent?parent.prototype:null}function _json(text){var match;if(match=/\{[\s\S]*\}|\[[\s\S]*\]/.exec(text)){text=match[0]}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){return eval("("+text+")")}throw"JSON parse error"}function _merge(distObj,obj){for(var name in distObj){obj[name]=distObj[name]}return obj}var _round=Math.round;var K={DEBUG:false,VERSION:_VERSION,IE:_IE,GECKO:_GECKO,WEBKIT:_WEBKIT,OPERA:_OPERA,V:_V,TIME:_TIME,each:_each,isArray:_isArray,isFunction:_isFunction,inArray:_inArray,inString:_inString,trim:_trim,addUnit:_addUnit,removeUnit:_removeUnit,escape:_escape,unescape:_unescape,toCamel:_toCamel,toHex:_toHex,toMap:_toMap,toArray:_toArray,undef:_undef,invalidUrl:_invalidUrl,addParam:_addParam,extend:_extend,merge:_merge,json:_json};var _INLINE_TAG_MAP=_toMap("a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"),_BLOCK_TAG_MAP=_toMap("address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul"),_SINGLE_TAG_MAP=_toMap("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed"),_STYLE_TAG_MAP=_toMap("b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u"),_CONTROL_TAG_MAP=_toMap("img,table,input,textarea,button"),_PRE_TAG_MAP=_toMap("pre,style,script"),_NOSPLIT_TAG_MAP=_toMap("html,head,body,td,tr,table,ol,ul,li"),_AUTOCLOSE_TAG_MAP=_toMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"),_FILL_ATTR_MAP=_toMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),_VALUE_TAG_MAP=_toMap("input,button,textarea,select");function _getBasePath(){var els=document.getElementsByTagName("script"),src;for(var i=0,len=els.length;i<len;i++){src=els[i].src||"";if(/NKeditor[\w\-\.]*\.js/i.test(src)){return src.substring(0,src.lastIndexOf("/")+1)}}return""}K.basePath=_getBasePath();K.options={designMode:true,fullscreenMode:false,filterMode:true,wellFormatMode:true,loadStyleMode:true,basePath:K.basePath,themesPath:K.basePath+"themes/",langPath:K.basePath+"lang/",pluginsPath:K.basePath+"plugins/",themeType:"primary",langType:"zh-CN",urlType:"",newlineTag:"p",resizeType:2,syncType:"form",pasteType:2,dialogAlignType:"page",useContextmenu:true,fullscreenShortcut:false,bodyClass:"ke-content",indentChar:"\t",cssPath:[],jsPath:[],showHelpGrid:false,cssData:"",minWidth:650,minHeight:300,minChangeSize:50,zIndex:811213,items:["source","undo","redo","preview","print","template","code","quote","cut","copy","paste","plainpaste","wordpaste","justifyleft","justifycenter","justifyright","justifyfull","insertorderedlist","insertunorderedlist","indent","outdent","subscript","superscript","clearhtml","quickformat","selectall","formatblock","fontname","fontsize","forecolor","hilitecolor","bold","italic","underline","strikethrough","lineheight","removeformat","image","multiimage","graft","flash","media","insertfile","table","hr","emoticons","baidumap","pagebreak","anchor","link","unlink","about","fullscreen"],noDisableItems:["source","fullscreen"],colorTable:[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#DDDDDD","#999999","#666666","#333333","#000000"]],fontSizeTable:["9px","10px","12px","14px","16px","18px","24px","32px"],htmlTags:{font:["id","class","color","size","face",".background-color"],span:["id","class",".color",".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".line-height"],div:["id","class","align",".border",".margin",".padding",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".background",".font-style",".text-decoration",".vertical-align",".margin-left"],table:["id","class","border","cellspacing","cellpadding","width","height","align","bordercolor",".padding",".margin",".border","bgcolor",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".background",".width",".height",".border-collapse"],"td,th":["id","class","align","valign","width","height","colspan","rowspan","bgcolor",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".vertical-align",".background",".border"],a:["id","class","href","target","name"],embed:["id","class","src","width","height","type","loop","autostart","quality",".width",".height","align","allowscriptaccess","wmode","controls"],img:["id","class","src","width","height","border","alt","title","align",".width",".height",".border"],"p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6":["id","class","align",".text-align",".color",".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".text-indent",".margin-left"],pre:["id","class"],hr:["id","class",".page-break-after"],"br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del":["id","class"],iframe:["id","class","src","frameborder","width","height",".width",".height"]},layout:'<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>',afterBlur:function(){this.sync()},errorMsgHandler:function(message,type){console.log(message);console.log(type);alert(message)},dialogOffset:0,allowUploadGraft:true,resLoadCache:{},tableBorderColor:"#cccccc"};var _useCapture=false;var _INPUT_KEY_MAP=_toMap("8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222");var _CURSORMOVE_KEY_MAP=_toMap("33..40");var _CHANGE_KEY_MAP={};_each(_INPUT_KEY_MAP,function(key,val){_CHANGE_KEY_MAP[key]=val});_each(_CURSORMOVE_KEY_MAP,function(key,val){_CHANGE_KEY_MAP[key]=val});function _bindEvent(el,type,fn){if(el.addEventListener){el.addEventListener(type,fn,_useCapture)}else if(el.attachEvent){el.attachEvent("on"+type,fn)}}function _unbindEvent(el,type,fn){if(el.removeEventListener){el.removeEventListener(type,fn,_useCapture)}else if(el.detachEvent){el.detachEvent("on"+type,fn)}}var _EVENT_PROPS=("altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,"+"data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,"+"pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which").split(",");function KEvent(el,event){this.init(el,event)}_extend(KEvent,{init:function(el,event){var self=this,doc=el.ownerDocument||el.document||el;self.event=event;_each(_EVENT_PROPS,function(key,val){self[val]=event[val]});if(!self.target){self.target=self.srcElement||doc}if(self.target.nodeType===3){self.target=self.target.parentNode}if(!self.relatedTarget&&self.fromElement){self.relatedTarget=self.fromElement===self.target?self.toElement:self.fromElement}if(self.pageX==null&&self.clientX!=null){var d=doc.documentElement,body=doc.body;self.pageX=self.clientX+(d&&d.scrollLeft||body&&body.scrollLeft||0)-(d&&d.clientLeft||body&&body.clientLeft||0);self.pageY=self.clientY+(d&&d.scrollTop||body&&body.scrollTop||0)-(d&&d.clientTop||body&&body.clientTop||0)}if(!self.which&&(self.charCode||self.charCode===0?self.charCode:self.keyCode)){self.which=self.charCode||self.keyCode}if(!self.metaKey&&self.ctrlKey){self.metaKey=self.ctrlKey}if(!self.which&&self.button!==undefined){self.which=self.button&1?1:self.button&2?3:self.button&4?2:0}switch(self.which){case 186:self.which=59;break;case 187:case 107:case 43:self.which=61;break;case 189:case 45:self.which=109;break;case 42:self.which=106;break;case 47:self.which=111;break;case 78:self.which=110;break}if(self.which>=96&&self.which<=105){self.which-=48}},preventDefault:function(){var ev=this.event;if(ev.preventDefault){ev.preventDefault()}else{ev.returnValue=false}},stopPropagation:function(){var ev=this.event;if(ev.stopPropagation){ev.stopPropagation()}else{ev.cancelBubble=true}},stop:function(){this.preventDefault();this.stopPropagation()}});var _eventExpendo="kindeditor_"+_TIME,_eventId=0,_eventData={};function _getId(el){return el[_eventExpendo]||null}function _setId(el){el[_eventExpendo]=++_eventId;return _eventId}function _removeId(el){try{delete el[_eventExpendo]}catch(e){if(el.removeAttribute){el.removeAttribute(_eventExpendo)}}}function _bind(el,type,fn){if(type.indexOf(",")>=0){_each(type.split(","),function(){_bind(el,this,fn)});return}var id=_getId(el);if(!id){id=_setId(el)}if(_eventData[id]===undefined){_eventData[id]={}}var events=_eventData[id][type];if(events&&events.length>0){_unbindEvent(el,type,events[0])}else{_eventData[id][type]=[];_eventData[id].el=el}events=_eventData[id][type];if(events.length===0){events[0]=function(e){var kevent=e?new KEvent(el,e):undefined;_each(events,function(i,event){if(i>0&&event){event.call(el,kevent)}})}}if(_inArray(fn,events)<0){events.push(fn)}_bindEvent(el,type,events[0])}function _unbind(el,type,fn){if(type&&type.indexOf(",")>=0){_each(type.split(","),function(){_unbind(el,this,fn)});return}var id=_getId(el);if(!id){return}if(type===undefined){if(id in _eventData){_each(_eventData[id],function(key,events){if(key!="el"&&events.length>0){_unbindEvent(el,key,events[0])}});delete _eventData[id];_removeId(el)}return}if(!_eventData[id]){return}var events=_eventData[id][type];if(events&&events.length>0){if(fn===undefined){_unbindEvent(el,type,events[0]);delete _eventData[id][type]}else{_each(events,function(i,event){if(i>0&&event===fn){events.splice(i,1)}});if(events.length==1){_unbindEvent(el,type,events[0]);delete _eventData[id][type]}}var count=0;_each(_eventData[id],function(){count++});if(count<2){delete _eventData[id];_removeId(el)}}}function _fire(el,type){if(type.indexOf(",")>=0){_each(type.split(","),function(){_fire(el,this)});return}var id=_getId(el);if(!id){return}var events=_eventData[id][type];if(_eventData[id]&&events&&events.length>0){events[0]()}}function _ctrl(el,key,fn){var self=this;key=/^\d{2,}$/.test(key)?key:key.toUpperCase().charCodeAt(0);_bind(el,"keydown",function(e){if(e.ctrlKey&&e.which==key&&!e.shiftKey&&!e.altKey){fn.call(el);e.stop()}})}var _readyFinished=false;function _ready(fn){if(_readyFinished){fn(KindEditor);return}var loaded=false;function readyFunc(){if(!loaded){loaded=true;fn(KindEditor);_readyFinished=true}}function ieReadyFunc(){if(!loaded){try{document.documentElement.doScroll("left")}catch(e){setTimeout(ieReadyFunc,100);return}readyFunc()}}function ieReadyStateFunc(){if(document.readyState==="complete"){readyFunc()}}if(document.addEventListener){_bind(document,"DOMContentLoaded",readyFunc)}else if(document.attachEvent){_bind(document,"readystatechange",ieReadyStateFunc);var toplevel=false;try{toplevel=window.frameElement==null}catch(e){}if(document.documentElement.doScroll&&toplevel){ieReadyFunc()}}_bind(window,"load",readyFunc)}if(window.attachEvent){window.attachEvent("onunload",function(){_each(_eventData,function(key,events){if(events.el){_unbind(events.el)}})})}K.ctrl=_ctrl;K.ready=_ready;function _getCssList(css){css=css.replace(/&quot;/g,'"');var list={},reg=/\s*([\w\-]+)\s*:([^;]*)(;|$)/g,match;while(match=reg.exec(css)){var key=_trim(match[1].toLowerCase()),val=_trim(_toHex(match[2]));list[key]=val}return list}function _getAttrList(tag){var list={},reg=/\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,match;while(match=reg.exec(tag)){var key=(match[1]||match[2]||match[4]||match[6]).toLowerCase(),val=(match[2]?match[3]:match[4]?match[5]:match[7])||"";list[key]=val}return list}function _addClassToTag(tag,className){if(/\s+class\s*=/.test(tag)){tag=tag.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/,function($0,$1,$2,$3){if((" "+$2+" ").indexOf(" "+className+" ")<0){return $2===""?$1+className+$3:$1+$2+" "+className+$3}else{return $0}})}else{tag=tag.substr(0,tag.length-1)+' class="'+className+'">'}return tag}function _formatCss(css){var str="";_each(_getCssList(css),function(key,val){str+=key+":"+val+";"});return str}function _formatUrl(url,mode,host,pathname){mode=_undef(mode,"").toLowerCase();if(url.substr(0,5)!="data:"){url=url.replace(/([^:])\/\//g,"$1/")}if(_inArray(mode,["absolute","relative","domain"])<0){return url}host=host||location.protocol+"//"+location.host;if(pathname===undefined){var m=location.pathname.match(/^(\/.*)\//);pathname=m?m[1]:""}if(/^\w+:/.test(url)){return url}var match;if(match=/^(\w+:\/\/[^\/]*)/.exec(url)){if(match[1]!==host){return url}}function getRealPath(path){var parts=path.split("/"),paths=[];for(var i=0,len=parts.length;i<len;i++){var part=parts[i];if(part==".."){if(paths.length>0){paths.pop()}}else if(part!==""&&part!="."){paths.push(part)}}return"/"+paths.join("/")}if(/^\//.test(url)){url=host+getRealPath(url.substr(1))}else if(!/^\w+:\/\//.test(url)){url=host+getRealPath(pathname+"/"+url)}function getRelativePath(path,depth){if(url.substr(0,path.length)===path){var arr=[];for(var i=0;i<depth;i++){arr.push("..")}var prefix=".";if(arr.length>0){prefix+="/"+arr.join("/")}if(pathname=="/"){prefix+="/"}return prefix+url.substr(path.length)}else{if(match=/^(.*)\//.exec(path)){return getRelativePath(match[1],++depth)}}}if(mode==="relative"){url=getRelativePath(host+pathname,0).substr(2)}else if(mode==="absolute"){if(url.substr(0,host.length)===host){url=url.substr(host.length)}}return url}function _formatHtml(html,htmlTags,urlType,wellFormatted,indentChar){if(html==null){html=""}urlType=urlType||"";wellFormatted=_undef(wellFormatted,false);indentChar=_undef(indentChar,"\t");var fontSizeList="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");html=html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/gi,function($0,$1,$2,$3){return $1+$2.replace(/<(?:br|br\s[^>]*)>/gi,"\n")+$3});html=html.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/gi,"</p>");html=html.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/gi,"$1<br />$2");html=html.replace(/\u200B/g,"");html=html.replace(/\u00A9/g,"&copy;");html=html.replace(/\u00AE/g,"&reg;");html=html.replace(/\u2003/g,"&emsp;");html=html.replace(/\u3000/g,"&emsp;");html=html.replace(/<[^>]+/g,function($0){return $0.replace(/\s+/g," ")});var htmlTagMap={};if(htmlTags){_each(htmlTags,function(key,val){var arr=key.split(",");for(var i=0,len=arr.length;i<len;i++){htmlTagMap[arr[i]]=_toMap(val)}});if(!htmlTagMap.script){html=html.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/gi,"")}if(!htmlTagMap.style){html=html.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/gi,"")}}var re=/(\s*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>(\s*)/g;var tagStack=[];html=html.replace(re,function($0,$1,$2,$3,$4,$5,$6){var full=$0,startNewline=$1||"",startSlash=$2||"",tagName=$3.toLowerCase(),attr=$4||"",endSlash=$5?" "+$5:"",endNewline=$6||"";if(tagName=="code"){return full}if(htmlTags&&!htmlTagMap[tagName]){return""}if(endSlash===""&&_SINGLE_TAG_MAP[tagName]){endSlash=" /"}if(_INLINE_TAG_MAP[tagName]){if(startNewline){startNewline=" "}if(endNewline){endNewline=" "}}if(_PRE_TAG_MAP[tagName]){if(startSlash){endNewline="\n"}else{startNewline="\n"}}if(wellFormatted&&tagName=="br"){endNewline="\n"}if(_BLOCK_TAG_MAP[tagName]&&!_PRE_TAG_MAP[tagName]){if(wellFormatted){if(startSlash&&tagStack.length>0&&tagStack[tagStack.length-1]===tagName){tagStack.pop()}else{tagStack.push(tagName)}startNewline="\n";endNewline="\n";for(var i=0,len=startSlash?tagStack.length:tagStack.length-1;i<len;i++){startNewline+=indentChar;if(!startSlash){endNewline+=indentChar}}if(endSlash){tagStack.pop()}else if(!startSlash){endNewline+=indentChar}}else{startNewline=endNewline=""}}if(attr!==""){var attrMap=_getAttrList(full);if(tagName==="font"){var fontStyleMap={},fontStyle="";_each(attrMap,function(key,val){if(key==="color"){fontStyleMap.color=val;delete attrMap[key]}if(key==="size"){fontStyleMap["font-size"]=fontSizeList[parseInt(val,10)-1]||"";delete attrMap[key]}if(key==="face"){fontStyleMap["font-family"]=val;delete attrMap[key]}if(key==="style"){fontStyle=val}});if(fontStyle&&!/;$/.test(fontStyle)){fontStyle+=";"}_each(fontStyleMap,function(key,val){if(val===""){return}if(/\s/.test(val)){val="'"+val+"'"}fontStyle+=key+":"+val+";"});attrMap.style=fontStyle}_each(attrMap,function(key,val){if(_FILL_ATTR_MAP[key]){attrMap[key]=key}if(_inArray(key,["src","href"])>=0){attrMap[key]=_formatUrl(val,urlType)}if(htmlTags&&key!=="style"&&!htmlTagMap[tagName]["*"]&&!htmlTagMap[tagName][key]||tagName==="body"&&key==="contenteditable"||/^kindeditor_\d+$/.test(key)){delete attrMap[key]}if(key==="style"&&val!==""){var styleMap=_getCssList(val);_each(styleMap,function(k,v){if(htmlTags&&!htmlTagMap[tagName].style&&!htmlTagMap[tagName]["."+k]){delete styleMap[k]}});var style="";_each(styleMap,function(k,v){style+=k+":"+v+";"});attrMap.style=style}});attr="";_each(attrMap,function(key,val){if(key==="style"&&val===""){return}val=val.replace(/"/g,"&quot;");attr+=" "+key+'="'+val+'"'})}if(tagName==="font"){tagName="span"}return startNewline+"<"+startSlash+tagName+attr+endSlash+">"+endNewline});html=html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/gi,function($0,$1,$2,$3){return $1+$2.replace(/\n/g,'<span id="__kindeditor_pre_newline__">\n')+$3});html=html.replace(/\n\s*\n/g,"\n");html=html.replace(/<span id="__kindeditor_pre_newline__">\n/g,"\n");return _trim(html)}function _clearMsWord(html,htmlTags){html=html.replace(/<meta[\s\S]*?>/gi,"").replace(/<![\s\S]*?>/gi,"").replace(/<style[^>]*>[\s\S]*?<\/style>/gi,"").replace(/<script[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/gi,"").replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/gi,"").replace(/<xml>[\s\S]*?<\/xml>/gi,"").replace(/<(?:table|td)[^>]*>/gi,function(full){return full.replace(/border-bottom:([#\w\s]+)/gi,"border:$1")});return _formatHtml(html,htmlTags)}function _mediaType(src){if(/\.(rm|rmvb)(\?|$)/i.test(src)){return"audio/x-pn-realaudio-plugin"}if(/\.(mp4)(\?|$)/i.test(src)){return"video/mpeg4"}if(/\.(swf|flv)(\?|$)/i.test(src)){return"application/x-shockwave-flash"}return"video/x-ms-asf-plugin"}function _mediaClass(type){if(/realaudio/i.test(type)){return"ke-rm"}if(/flash/i.test(type)){return"ke-flash"}return"ke-media"}function _mediaAttrs(srcTag){return _getAttrList(unescape(srcTag))}function _mediaEmbed(attrs){var type=attrs.type=="video/mpeg4"?"video":"embed";if(type=="video"){attrs.controls="controls"}var html="<"+type+" ";_each(attrs,function(key,val){html+=key+'="'+val+'" '});html+="/>";return html}function _mediaImg(blankPath,attrs){var width=attrs.width,height=attrs.height,type=attrs.type||_mediaType(attrs.src),srcTag=_mediaEmbed(attrs),style="";if(/\D/.test(width)){style+="width:"+width+";"}else if(width>0){style+="width:"+width+"px;"}if(/\D/.test(height)){style+="height:"+height+";"}else if(height>0){style+="height:"+height+"px;"}var html='<img class="'+_mediaClass(type)+'" src="'+blankPath+'" ';if(style!==""){html+='style="'+style+'" '}html+='data-ke-tag="'+escape(srcTag)+'" alt="" />';return html}function _tmpl(str,data){var fn=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};"+"with(obj){p.push('"+str.replace(/[\r\t\n]/g," ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return data?fn(data):fn}K.formatUrl=_formatUrl;K.formatHtml=_formatHtml;K.getCssList=_getCssList;K.getAttrList=_getAttrList;K.mediaType=_mediaType;K.mediaAttrs=_mediaAttrs;K.mediaEmbed=_mediaEmbed;K.mediaImg=_mediaImg;K.clearMsWord=_clearMsWord;K.tmpl=_tmpl;function _contains(nodeA,nodeB){if(nodeA.nodeType==9&&nodeB.nodeType!=9){return true}while(nodeB=nodeB.parentNode){if(nodeB==nodeA){return true}}return false}var _getSetAttrDiv=document.createElement("div");_getSetAttrDiv.setAttribute("className","t");var _GET_SET_ATTRIBUTE=_getSetAttrDiv.className!=="t";function _getAttr(el,key){key=key.toLowerCase();var val=null;if(!_GET_SET_ATTRIBUTE&&el.nodeName.toLowerCase()!="script"){var div=el.ownerDocument.createElement("div");div.appendChild(el.cloneNode(false));var list=_getAttrList(_unescape(div.innerHTML));if(key in list){val=list[key]}}else{try{val=el.getAttribute(key,2)}catch(e){val=el.getAttribute(key,1)}}if(key==="style"&&val!==null){val=_formatCss(val)}return val}function _queryAll(expr,root){var exprList=expr.split(",");if(exprList.length>1){var mergedResults=[];_each(exprList,function(){_each(_queryAll(this,root),function(){if(_inArray(this,mergedResults)<0){mergedResults.push(this)}})});return mergedResults}root=root||document;function escape(str){if(typeof str!="string"){return str}return str.replace(/([^\w\-])/g,"\\$1")}function stripslashes(str){return str.replace(/\\/g,"")}function cmpTag(tagA,tagB){return tagA==="*"||tagA.toLowerCase()===escape(tagB.toLowerCase())}function byId(id,tag,root){var arr=[],doc=root.ownerDocument||root,el=doc.getElementById(stripslashes(id));if(el){if(cmpTag(tag,el.nodeName)&&_contains(root,el)){arr.push(el)}}return arr}function byClass(className,tag,root){var doc=root.ownerDocument||root,arr=[],els,i,len,el;if(root.getElementsByClassName){els=root.getElementsByClassName(stripslashes(className));for(i=0,len=els.length;i<len;i++){el=els[i];if(cmpTag(tag,el.nodeName)){arr.push(el)}}}else if(doc.querySelectorAll){els=doc.querySelectorAll((root.nodeName!=="#document"?root.nodeName+" ":"")+tag+"."+className);for(i=0,len=els.length;i<len;i++){el=els[i];if(_contains(root,el)){arr.push(el)}}}else{els=root.getElementsByTagName(tag);className=" "+className+" ";for(i=0,len=els.length;i<len;i++){el=els[i];if(el.nodeType==1){var cls=el.className;if(cls&&(" "+cls+" ").indexOf(className)>-1){arr.push(el)}}}}return arr}function byName(name,tag,root){var arr=[],doc=root.ownerDocument||root,els=doc.getElementsByName(stripslashes(name)),el;for(var i=0,len=els.length;i<len;i++){el=els[i];if(cmpTag(tag,el.nodeName)&&_contains(root,el)){if(el.getAttribute("name")!==null){arr.push(el)}}}return arr}function byAttr(key,val,tag,root){var arr=[],els=root.getElementsByTagName(tag),el;for(var i=0,len=els.length;i<len;i++){el=els[i];if(el.nodeType==1){if(val===null){if(_getAttr(el,key)!==null){arr.push(el)}}else{if(val===escape(_getAttr(el,key))){arr.push(el)}}}}return arr}function select(expr,root){var arr=[],matches;matches=/^((?:\\.|[^.#\s\[<>])+)/.exec(expr);var tag=matches?matches[1]:"*";if(matches=/#((?:[\w\-]|\\.)+)$/.exec(expr)){arr=byId(matches[1],tag,root)}else if(matches=/\.((?:[\w\-]|\\.)+)$/.exec(expr)){arr=byClass(matches[1],tag,root)}else if(matches=/\[((?:[\w\-]|\\.)+)\]/.exec(expr)){arr=byAttr(matches[1].toLowerCase(),null,tag,root)}else if(matches=/\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(expr)){var key=matches[1].toLowerCase(),val=matches[2];if(key==="id"){arr=byId(val,tag,root)}else if(key==="class"){arr=byClass(val,tag,root)}else if(key==="name"){arr=byName(val,tag,root)}else{arr=byAttr(key,val,tag,root)}}else{var els=root.getElementsByTagName(tag),el;for(var i=0,len=els.length;i<len;i++){el=els[i];if(el.nodeType==1){arr.push(el)}}}return arr}var parts=[],arr,re=/((?:\\.|[^\s>])+|[\s>])/g;while(arr=re.exec(expr)){if(arr[1]!==" "){parts.push(arr[1])}}var results=[];if(parts.length==1){return select(parts[0],root)}var isChild=false,part,els,subResults,val,v,i,j,k,length,len,l;for(i=0,lenth=parts.length;i<lenth;i++){part=parts[i];if(part===">"){isChild=true;continue}if(i>0){els=[];for(j=0,len=results.length;j<len;j++){val=results[j];subResults=select(part,val);for(k=0,l=subResults.length;k<l;k++){v=subResults[k];if(isChild){if(val===v.parentNode){els.push(v)}}else{els.push(v)}}}results=els}else{results=select(part,root)}if(results.length===0){return[]}}return results}function _query(expr,root){var arr=_queryAll(expr,root);return arr.length>0?arr[0]:null}K.query=_query;K.queryAll=_queryAll;function _get(val){return K(val)[0]}function _getDoc(node){if(!node){return document}return node.ownerDocument||node.document||node}function _getWin(node){if(!node){return window}var doc=_getDoc(node);return doc.parentWindow||doc.defaultView}function _setHtml(el,html){if(el.nodeType!=1){return}var doc=_getDoc(el);try{el.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+html;var temp=doc.getElementById("__kindeditor_temp_tag__");temp.parentNode.removeChild(temp)}catch(e){K(el).empty();K("@"+html,doc).each(function(){el.appendChild(this)})}}function _hasClass(el,cls){return _inString(cls,el.className," ")}function _setAttr(el,key,val){if(_IE&&_V<8&&key.toLowerCase()=="class"){key="className"}el.setAttribute(key,""+val)}function _removeAttr(el,key){if(_IE&&_V<8&&key.toLowerCase()=="class"){key="className"}_setAttr(el,key,"");el.removeAttribute(key)}function _getNodeName(node){if(!node||!node.nodeName){return""}return node.nodeName.toLowerCase()}function _computedCss(el,key){var self=this,win=_getWin(el),camelKey=_toCamel(key),val="";if(win.getComputedStyle){var style=win.getComputedStyle(el,null);val=style[camelKey]||style.getPropertyValue(key)||el.style[camelKey]}else if(el.currentStyle){val=el.currentStyle[camelKey]||el.style[camelKey]}return val}function _hasVal(node){return!!_VALUE_TAG_MAP[_getNodeName(node)]}function _docElement(doc){doc=doc||document;return _QUIRKS?doc.body:doc.documentElement}function _docHeight(doc){var el=_docElement(doc);return Math.max(el.scrollHeight,el.clientHeight)}function _docWidth(doc){var el=_docElement(doc);return Math.max(el.scrollWidth,el.clientWidth)}function _getScrollPos(doc){doc=doc||document;var x,y;if(_IE||_NEWIE||_OPERA){x=_docElement(doc).scrollLeft;y=_docElement(doc).scrollTop}else{x=_getWin(doc).scrollX;y=_getWin(doc).scrollY}return{x:x,y:y}}function KNode(node){this.init(node)}_extend(KNode,{init:function(node){var self=this;node=_isArray(node)?node:[node];var length=0;for(var i=0,len=node.length;i<len;i++){if(node[i]){self[i]=node[i].constructor===KNode?node[i][0]:node[i];length++}}self.length=length;self.doc=_getDoc(self[0]);self.name=_getNodeName(self[0]);self.type=self.length>0?self[0].nodeType:null;self.win=_getWin(self[0])},each:function(fn){var self=this;for(var i=0;i<self.length;i++){if(fn.call(self[i],i,self[i])===false){return self}}return self},bind:function(type,fn){this.each(function(){_bind(this,type,fn)});return this},unbind:function(type,fn){this.each(function(){_unbind(this,type,fn)});return this},fire:function(type){if(this.length<1){return this}_fire(this[0],type);return this},hasAttr:function(key){if(this.length<1){return false}return!!_getAttr(this[0],key)},attr:function(key,val){var self=this;if(key===undefined){return _getAttrList(self.outer())}if(typeof key==="object"){_each(key,function(k,v){self.attr(k,v)});return self}if(val===undefined){val=self.length<1?null:_getAttr(self[0],key);return val===null?"":val}self.each(function(){_setAttr(this,key,val)});return self},removeAttr:function(key){this.each(function(){_removeAttr(this,key)});return this},get:function(i){if(this.length<1){return null}return this[i||0]},eq:function(i){if(this.length<1){return null}return this[i]?new KNode(this[i]):null},hasClass:function(cls){if(this.length<1){return false}return _hasClass(this[0],cls)},addClass:function(cls){this.each(function(){if(!_hasClass(this,cls)){this.className=_trim(this.className+" "+cls)}});return this},removeClass:function(cls){this.each(function(){if(_hasClass(this,cls)){this.className=_trim(this.className.replace(new RegExp("(^|\\s)"+cls+"(\\s|$)")," "))}});return this},html:function(val){var self=this;if(val===undefined){if(self.length<1||self.type!=1){return""}return _formatHtml(self[0].innerHTML)}self.each(function(){_setHtml(this,val)});return self},text:function(){var self=this;if(self.length<1){return""}return _IE?self[0].innerText:self[0].textContent},hasVal:function(){if(this.length<1){return false}return _hasVal(this[0])},val:function(val){var self=this;if(val===undefined){if(self.length<1){return""}return self.hasVal()?self[0].value:self.attr("value")}else{self.each(function(){if(_hasVal(this)){this.value=val}else{_setAttr(this,"value",val)}});return self}},css:function(key,val){var self=this;if(key===undefined){return _getCssList(self.attr("style"))}if(typeof key==="object"){_each(key,function(k,v){self.css(k,v)});return self}if(val===undefined){if(self.length<1){return""}return self[0].style[_toCamel(key)]||_computedCss(self[0],key)||""}self.each(function(){this.style[_toCamel(key)]=val});return self},width:function(val){var self=this;if(val===undefined){if(self.length<1){return 0}return self[0].offsetWidth}return self.css("width",_addUnit(val))},height:function(val){var self=this;if(val===undefined){if(self.length<1){return 0}return self[0].offsetHeight}return self.css("height",_addUnit(val))},opacity:function(val){this.each(function(){if(this.style.opacity===undefined){this.style.filter=val==1?"":"alpha(opacity="+val*100+")"}else{this.style.opacity=val==1?"":val}});return this},data:function(key,val){var self=this;key="kindeditor_data_"+key;if(val===undefined){if(self.length<1){return null}return self[0][key]}this.each(function(){this[key]=val});return self},pos:function(){var self=this,node=self[0],x=0,y=0;if(node){if(node.getBoundingClientRect){var box=node.getBoundingClientRect(),pos=_getScrollPos(self.doc);x=box.left+pos.x;y=box.top+pos.y}else{while(node){x+=node.offsetLeft;y+=node.offsetTop;node=node.offsetParent}}}return{x:_round(x),y:_round(y)}},clone:function(bool){if(this.length<1){return new KNode([])}return new KNode(this[0].cloneNode(bool))},append:function(expr){this.each(function(){if(this.appendChild){this.appendChild(_get(expr))}});return this},appendTo:function(expr){this.each(function(){_get(expr).appendChild(this)});return this},before:function(expr){this.each(function(){try{this.parentNode.insertBefore(_get(expr),this)}catch(e){}});return this},after:function(expr){this.each(function(){if(this.nextSibling){this.parentNode.insertBefore(_get(expr),this.nextSibling)}else{this.parentNode.appendChild(_get(expr))}});return this},replaceWith:function(expr){var nodes=[];this.each(function(i,node){_unbind(node);var newNode=_get(expr);node.parentNode.replaceChild(newNode,node);nodes.push(newNode)});return K(nodes)},empty:function(){var self=this;self.each(function(i,node){var child=node.firstChild;while(child){if(!node.parentNode){return}var next=child.nextSibling;child.parentNode.removeChild(child);child=next}});return self},remove:function(keepChilds){var self=this;self.each(function(i,node){if(!node.parentNode){return}_unbind(node);if(keepChilds){var child=node.firstChild;while(child){var next=child.nextSibling;node.parentNode.insertBefore(child,node);child=next}}node.parentNode.removeChild(node);delete self[i]});self.length=0;return self},show:function(val){var self=this;if(val===undefined){val=self._originDisplay||""}if(self.css("display")!="none"){return self}return self.css("display",val)},hide:function(){var self=this;if(self.length<1){return self}self._originDisplay=self[0].style.display;return self.css("display","none")},outer:function(){var self=this;if(self.length<1){return""}var div=self.doc.createElement("div"),html;div.appendChild(self[0].cloneNode(true));html=_formatHtml(div.innerHTML);div=null;return html},isSingle:function(){return!!_SINGLE_TAG_MAP[this.name]},isInline:function(){return!!_INLINE_TAG_MAP[this.name]},isBlock:function(){return!!_BLOCK_TAG_MAP[this.name]},isStyle:function(){return!!_STYLE_TAG_MAP[this.name]},isControl:function(){return!!_CONTROL_TAG_MAP[this.name]},contains:function(otherNode){if(this.length<1){return false}return _contains(this[0],_get(otherNode))},parent:function(){if(this.length<1){return null}var node=this[0].parentNode;return node?new KNode(node):null},children:function(){if(this.length<1){return new KNode([])}var list=[],child=this[0].firstChild;while(child){if(child.nodeType!=3||_trim(child.nodeValue)!==""){list.push(child)}child=child.nextSibling}return new KNode(list)},first:function(){var list=this.children();return list.length>0?list.eq(0):null},last:function(){var list=this.children();return list.length>0?list.eq(list.length-1):null},index:function(){if(this.length<1){return-1}var i=-1,sibling=this[0];while(sibling){i++;sibling=sibling.previousSibling}return i},prev:function(){if(this.length<1){return null}var node=this[0].previousSibling;return node?new KNode(node):null},next:function(){if(this.length<1){return null}var node=this[0].nextSibling;return node?new KNode(node):null},scan:function(fn,order){if(this.length<1){return}order=order===undefined?true:order;function walk(node){var n=order?node.firstChild:node.lastChild;while(n){var next=order?n.nextSibling:n.previousSibling;if(fn(n)===false){return false}if(walk(n)===false){return false}n=next}}walk(this[0]);return this}});_each(("blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,"+"change,select,submit,keydown,keypress,keyup,error,contextmenu").split(","),function(i,type){KNode.prototype[type]=function(fn){return fn?this.bind(type,fn):this.fire(type)}});var _K=K;K=function(expr,root){if(expr===undefined||expr===null){return}function newNode(node){if(!node[0]){node=[]}return new KNode(node)}if(typeof expr==="string"){if(root){root=_get(root)}var length=expr.length;if(expr.charAt(0)==="@"){expr=expr.substr(1)}if(expr.length!==length||/<.+>/.test(expr)){var doc=root?root.ownerDocument||root:document,div=doc.createElement("div"),list=[];div.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+expr;for(var i=0,len=div.childNodes.length;i<len;i++){var child=div.childNodes[i];if(child.id=="__kindeditor_temp_tag__"){continue}list.push(child)}return newNode(list)}return newNode(_queryAll(expr,root))}if(expr&&expr.constructor===KNode){return expr}if(expr.toArray){expr=expr.toArray()}if(_isArray(expr)){return newNode(expr)}return newNode(_toArray(arguments))};_each(_K,function(key,val){K[key]=val});K.NodeClass=KNode;window.KindEditor=K;var _START_TO_START=0,_START_TO_END=1,_END_TO_END=2,_END_TO_START=3,_BOOKMARK_ID=0;function _updateCollapsed(range){range.collapsed=range.startContainer===range.endContainer&&range.startOffset===range.endOffset;return range}function _copyAndDelete(range,isCopy,isDelete){var doc=range.doc,nodeList=[];function splitTextNode(node,startOffset,endOffset){var length=node.nodeValue.length,centerNode;if(isCopy){var cloneNode=node.cloneNode(true);if(startOffset>0){centerNode=cloneNode.splitText(startOffset)}else{centerNode=cloneNode}if(endOffset<length){centerNode.splitText(endOffset-startOffset)}}if(isDelete){var center=node;if(startOffset>0){center=node.splitText(startOffset);range.setStart(node,startOffset)}if(endOffset<length){var right=center.splitText(endOffset-startOffset);range.setEnd(right,0)}nodeList.push(center)}return centerNode}function removeNodes(){if(isDelete){range.up().collapse(true)}for(var i=0,len=nodeList.length;i<len;i++){var node=nodeList[i];if(node.parentNode){node.parentNode.removeChild(node)}}}var copyRange=range.cloneRange().down();var start=-1,incStart=-1,incEnd=-1,end=-1,ancestor=range.commonAncestor(),frag=doc.createDocumentFragment();if(ancestor.nodeType==3){var textNode=splitTextNode(ancestor,range.startOffset,range.endOffset);if(isCopy){frag.appendChild(textNode)}removeNodes();return isCopy?frag:range}function extractNodes(parent,frag){var node=parent.firstChild,nextNode;while(node){var testRange=new KRange(doc).selectNode(node);start=testRange.compareBoundaryPoints(_START_TO_END,range);if(start>=0&&incStart<=0){incStart=testRange.compareBoundaryPoints(_START_TO_START,range)}if(incStart>=0&&incEnd<=0){incEnd=testRange.compareBoundaryPoints(_END_TO_END,range)}if(incEnd>=0&&end<=0){end=testRange.compareBoundaryPoints(_END_TO_START,range)}if(end>=0){return false}nextNode=node.nextSibling;if(start>0){if(node.nodeType==1){if(incStart>=0&&incEnd<=0){if(isCopy){frag.appendChild(node.cloneNode(true))}if(isDelete){nodeList.push(node)}}else{var childFlag;if(isCopy){childFlag=node.cloneNode(false);frag.appendChild(childFlag)}if(extractNodes(node,childFlag)===false){return false}}}else if(node.nodeType==3){var textNode;if(node==copyRange.startContainer){textNode=splitTextNode(node,copyRange.startOffset,node.nodeValue.length)}else if(node==copyRange.endContainer){textNode=splitTextNode(node,0,copyRange.endOffset)}else{textNode=splitTextNode(node,0,node.nodeValue.length)}if(isCopy){try{frag.appendChild(textNode)}catch(e){}}}}node=nextNode}}extractNodes(ancestor,frag);if(isDelete){range.up().collapse(true)}for(var i=0,len=nodeList.length;i<len;i++){var node=nodeList[i];if(node.parentNode){node.parentNode.removeChild(node)}}return isCopy?frag:range}function _moveToElementText(range,el){var node=el;while(node){var knode=K(node);if(knode.name=="marquee"||knode.name=="select"){return}node=node.parentNode}try{range.moveToElementText(el)}catch(e){}}function _getStartEnd(rng,isStart){var doc=rng.parentElement().ownerDocument,pointRange=rng.duplicate();pointRange.collapse(isStart);var parent=pointRange.parentElement(),nodes=parent.childNodes;if(nodes.length===0){return{node:parent.parentNode,offset:K(parent).index()}}var startNode=doc,startPos=0,cmp=-1;var testRange=rng.duplicate();_moveToElementText(testRange,parent);for(var i=0,len=nodes.length;i<len;i++){var node=nodes[i];cmp=testRange.compareEndPoints("StartToStart",pointRange);if(cmp===0){return{node:node.parentNode,offset:i}}if(node.nodeType==1){var nodeRange=rng.duplicate(),dummy,knode=K(node),newNode=node;if(knode.isControl()){dummy=doc.createElement("span");knode.after(dummy);newNode=dummy;startPos+=knode.text().replace(/\r\n|\n|\r/g,"").length}_moveToElementText(nodeRange,newNode);testRange.setEndPoint("StartToEnd",nodeRange);if(cmp>0){startPos+=nodeRange.text.replace(/\r\n|\n|\r/g,"").length}else{startPos=0}if(dummy){K(dummy).remove()}}else if(node.nodeType==3){testRange.moveStart("character",node.nodeValue.length);startPos+=node.nodeValue.length}if(cmp<0){startNode=node}}if(cmp<0&&startNode.nodeType==1){return{node:parent,offset:K(parent.lastChild).index()+1}}if(cmp>0){while(startNode.nextSibling&&startNode.nodeType==1){startNode=startNode.nextSibling}}testRange=rng.duplicate();_moveToElementText(testRange,parent);testRange.setEndPoint("StartToEnd",pointRange);startPos-=testRange.text.replace(/\r\n|\n|\r/g,"").length;if(cmp>0&&startNode.nodeType==3){var prevNode=startNode.previousSibling;while(prevNode&&prevNode.nodeType==3){startPos-=prevNode.nodeValue.length;prevNode=prevNode.previousSibling}}return{node:startNode,offset:startPos}}function _getEndRange(node,offset){var doc=node.ownerDocument||node,range=doc.body.createTextRange();if(doc==node){range.collapse(true);return range}if(node.nodeType==1&&node.childNodes.length>0){var children=node.childNodes,isStart,child;if(offset===0){child=children[0];isStart=true}else{child=children[offset-1];isStart=false}if(!child){return range}if(K(child).name==="head"){if(offset===1){isStart=true}if(offset===2){isStart=false}range.collapse(isStart);return range}if(child.nodeType==1){var kchild=K(child),span;if(kchild.isControl()){span=doc.createElement("span");if(isStart){kchild.before(span)}else{kchild.after(span)}child=span}_moveToElementText(range,child);range.collapse(isStart);if(span){K(span).remove()}return range}node=child;offset=isStart?0:child.nodeValue.length}var dummy=doc.createElement("span");K(node).before(dummy);_moveToElementText(range,dummy);range.moveStart("character",offset);K(dummy).remove();return range}function _toRange(rng){var doc,range;function tr2td(start){if(K(start.node).name=="tr"){start.node=start.node.cells[start.offset];start.offset=0}}if(_IERANGE){if(rng.item){doc=_getDoc(rng.item(0));range=new KRange(doc);range.selectNode(rng.item(0));return range}doc=rng.parentElement().ownerDocument;var start=_getStartEnd(rng,true),end=_getStartEnd(rng,false);tr2td(start);tr2td(end);range=new KRange(doc);range.setStart(start.node,start.offset);range.setEnd(end.node,end.offset);return range}var startContainer=rng.startContainer;doc=startContainer.ownerDocument||startContainer;range=new KRange(doc);range.setStart(startContainer,rng.startOffset);range.setEnd(rng.endContainer,rng.endOffset);return range}function KRange(doc){this.init(doc)}_extend(KRange,{init:function(doc){var self=this;self.startContainer=doc;self.startOffset=0;self.endContainer=doc;self.endOffset=0;self.collapsed=true;self.doc=doc},commonAncestor:function(){function getParents(node){var parents=[];while(node){parents.push(node);node=node.parentNode}return parents}var parentsA=getParents(this.startContainer),parentsB=getParents(this.endContainer),i=0,lenA=parentsA.length,lenB=parentsB.length,parentA,parentB;while(++i){parentA=parentsA[lenA-i];parentB=parentsB[lenB-i];if(!parentA||!parentB||parentA!==parentB){break}}return parentsA[lenA-i+1]},setStart:function(node,offset){var self=this,doc=self.doc;self.startContainer=node;self.startOffset=offset;if(self.endContainer===doc){self.endContainer=node;self.endOffset=offset}return _updateCollapsed(this)},setEnd:function(node,offset){var self=this,doc=self.doc;self.endContainer=node;self.endOffset=offset;if(self.startContainer===doc){self.startContainer=node;self.startOffset=offset}return _updateCollapsed(this)},setStartBefore:function(node){return this.setStart(node.parentNode||this.doc,K(node).index())},setStartAfter:function(node){return this.setStart(node.parentNode||this.doc,K(node).index()+1)},setEndBefore:function(node){return this.setEnd(node.parentNode||this.doc,K(node).index())},setEndAfter:function(node){return this.setEnd(node.parentNode||this.doc,K(node).index()+1)},selectNode:function(node){return this.setStartBefore(node).setEndAfter(node)},selectNodeContents:function(node){var knode=K(node);if(knode.type==3||knode.isSingle()){return this.selectNode(node)}var children=knode.children();if(children.length>0){return this.setStartBefore(children[0]).setEndAfter(children[children.length-1])}return this.setStart(node,0).setEnd(node,0)},collapse:function(toStart){if(toStart){return this.setEnd(this.startContainer,this.startOffset)}return this.setStart(this.endContainer,this.endOffset)},compareBoundaryPoints:function(how,range){var rangeA=this.get(),rangeB=range.get();if(_IERANGE){var arr={};arr[_START_TO_START]="StartToStart";arr[_START_TO_END]="EndToStart";arr[_END_TO_END]="EndToEnd";arr[_END_TO_START]="StartToEnd";var cmp=rangeA.compareEndPoints(arr[how],rangeB);if(cmp!==0){return cmp}var nodeA,nodeB,nodeC,posA,posB;if(how===_START_TO_START||how===_END_TO_START){nodeA=this.startContainer;posA=this.startOffset}if(how===_START_TO_END||how===_END_TO_END){nodeA=this.endContainer;posA=this.endOffset}if(how===_START_TO_START||how===_START_TO_END){nodeB=range.startContainer;posB=range.startOffset}if(how===_END_TO_END||how===_END_TO_START){nodeB=range.endContainer;posB=range.endOffset}if(nodeA===nodeB){var diff=posA-posB;return diff>0?1:diff<0?-1:0}nodeC=nodeB;while(nodeC&&nodeC.parentNode!==nodeA){nodeC=nodeC.parentNode}if(nodeC){return K(nodeC).index()>=posA?-1:1}nodeC=nodeA;while(nodeC&&nodeC.parentNode!==nodeB){nodeC=nodeC.parentNode}if(nodeC){return K(nodeC).index()>=posB?1:-1}nodeC=K(nodeB).next();if(nodeC&&nodeC.contains(nodeA)){return 1}nodeC=K(nodeA).next();if(nodeC&&nodeC.contains(nodeB)){return-1}}else{return rangeA.compareBoundaryPoints(how,rangeB)}},cloneRange:function(){return new KRange(this.doc).setStart(this.startContainer,this.startOffset).setEnd(this.endContainer,this.endOffset)},toString:function(){var rng=this.get(),str=_IERANGE?rng.text:rng.toString();return str.replace(/\r\n|\n|\r/g,"")},cloneContents:function(){return _copyAndDelete(this,true,false)},deleteContents:function(){return _copyAndDelete(this,false,true)},extractContents:function(){return _copyAndDelete(this,true,true)},insertNode:function(node){var self=this,sc=self.startContainer,so=self.startOffset,ec=self.endContainer,eo=self.endOffset,firstChild,lastChild,c,nodeCount=1;if(node.nodeName.toLowerCase()==="#document-fragment"){firstChild=node.firstChild;lastChild=node.lastChild;nodeCount=node.childNodes.length}if(sc.nodeType==1){c=sc.childNodes[so];if(c){sc.insertBefore(node,c);if(sc===ec){eo+=nodeCount}}else{sc.appendChild(node)}}else if(sc.nodeType==3){if(so===0){sc.parentNode.insertBefore(node,sc);if(sc.parentNode===ec){eo+=nodeCount}}else if(so>=sc.nodeValue.length){if(sc.nextSibling){sc.parentNode.insertBefore(node,sc.nextSibling)}else{sc.parentNode.appendChild(node)}}else{if(so>0){c=sc.splitText(so)}else{c=sc}sc.parentNode.insertBefore(node,c);if(sc===ec){ec=c;eo-=so}}}if(firstChild){self.setStartBefore(firstChild).setEndAfter(lastChild)}else{self.selectNode(node)}if(self.compareBoundaryPoints(_END_TO_END,self.cloneRange().setEnd(ec,eo))>=1){return self}return self.setEnd(ec,eo)},surroundContents:function(node){node.appendChild(this.extractContents());return this.insertNode(node).selectNode(node)},isControl:function(){var self=this,sc=self.startContainer,so=self.startOffset,ec=self.endContainer,eo=self.endOffset,rng;return sc.nodeType==1&&sc===ec&&so+1===eo&&K(sc.childNodes[so]).isControl()},get:function(hasControlRange){var self=this,doc=self.doc,node,rng;if(!_IERANGE){rng=doc.createRange();try{rng.setStart(self.startContainer,self.startOffset);rng.setEnd(self.endContainer,self.endOffset)}catch(e){}return rng}if(hasControlRange&&self.isControl()){rng=doc.body.createControlRange();rng.addElement(self.startContainer.childNodes[self.startOffset]);return rng}var range=self.cloneRange().down();rng=doc.body.createTextRange();rng.setEndPoint("StartToStart",_getEndRange(range.startContainer,range.startOffset));rng.setEndPoint("EndToStart",_getEndRange(range.endContainer,range.endOffset));return rng},html:function(){return K(this.cloneContents()).outer()},down:function(){var self=this;function downPos(node,pos,isStart){if(node.nodeType!=1){return}var children=K(node).children();if(children.length===0){return}var left,right,child,offset;if(pos>0){left=children.eq(pos-1)}if(pos<children.length){right=children.eq(pos)}if(left&&left.type==3){child=left[0];offset=child.nodeValue.length}if(right&&right.type==3){child=right[0];offset=0}if(!child){return}if(isStart){self.setStart(child,offset)}else{self.setEnd(child,offset)}}downPos(self.startContainer,self.startOffset,true);downPos(self.endContainer,self.endOffset,false);return self},up:function(){var self=this;function upPos(node,pos,isStart){if(node.nodeType!=3){return}if(pos===0){if(isStart){self.setStartBefore(node)}else{self.setEndBefore(node)}}else if(pos==node.nodeValue.length){if(isStart){self.setStartAfter(node)}else{self.setEndAfter(node)}}}upPos(self.startContainer,self.startOffset,true);upPos(self.endContainer,self.endOffset,false);return self},enlarge:function(toBlock){var self=this;self.up();function enlargePos(node,pos,isStart){var knode=K(node),parent;if(knode.type==3||_NOSPLIT_TAG_MAP[knode.name]||!toBlock&&knode.isBlock()){return}if(pos===0){while(!knode.prev()){parent=knode.parent();if(!parent||_NOSPLIT_TAG_MAP[parent.name]||!toBlock&&parent.isBlock()){break}knode=parent}if(isStart){self.setStartBefore(knode[0])}else{self.setEndBefore(knode[0])}}else if(pos==knode.children().length){while(!knode.next()){parent=knode.parent();if(!parent||_NOSPLIT_TAG_MAP[parent.name]||!toBlock&&parent.isBlock()){break}knode=parent}if(isStart){self.setStartAfter(knode[0])}else{self.setEndAfter(knode[0])}}}enlargePos(self.startContainer,self.startOffset,true);enlargePos(self.endContainer,self.endOffset,false);return self},shrink:function(){var self=this,child,collapsed=self.collapsed;while(self.startContainer.nodeType==1&&(child=self.startContainer.childNodes[self.startOffset])&&child.nodeType==1&&!K(child).isSingle()){self.setStart(child,0)}if(collapsed){return self.collapse(collapsed)}while(self.endContainer.nodeType==1&&self.endOffset>0&&(child=self.endContainer.childNodes[self.endOffset-1])&&child.nodeType==1&&!K(child).isSingle()){self.setEnd(child,child.childNodes.length)}return self},createBookmark:function(serialize){var self=this,doc=self.doc,endNode,startNode=K('<span style="display:none;"></span>',doc)[0];startNode.id="__kindeditor_bookmark_start_"+_BOOKMARK_ID+++"__";if(!self.collapsed){endNode=startNode.cloneNode(true);endNode.id="__kindeditor_bookmark_end_"+_BOOKMARK_ID+++"__"}if(endNode){self.cloneRange().collapse(false).insertNode(endNode).setEndBefore(endNode)}self.insertNode(startNode).setStartAfter(startNode);return{start:serialize?"#"+startNode.id:startNode,end:endNode?serialize?"#"+endNode.id:endNode:null}},moveToBookmark:function(bookmark){var self=this,doc=self.doc,start=K(bookmark.start,doc),end=bookmark.end?K(bookmark.end,doc):null;if(!start||start.length<1){return self}self.setStartBefore(start[0]);start.remove();if(end&&end.length>0){self.setEndBefore(end[0]);end.remove()}else{self.collapse(true)}return self},dump:function(){console.log("--------------------");console.log(this.startContainer.nodeType==3?this.startContainer.nodeValue:this.startContainer,this.startOffset);console.log(this.endContainer.nodeType==3?this.endContainer.nodeValue:this.endContainer,this.endOffset)}});function _range(mixed){if(!mixed.nodeName){return mixed.constructor===KRange?mixed:_toRange(mixed)}return new KRange(mixed)}K.RangeClass=KRange;K.range=_range;K.START_TO_START=_START_TO_START;K.START_TO_END=_START_TO_END;K.END_TO_END=_END_TO_END;K.END_TO_START=_END_TO_START;function _nativeCommand(doc,key,val){try{doc.execCommand(key,false,val)}catch(e){}}function _nativeCommandValue(doc,key){var val="";try{val=doc.queryCommandValue(key)}catch(e){}if(typeof val!=="string"){val=""}return val}function _getSel(doc){var win=_getWin(doc);return _IERANGE?doc.selection:win.getSelection()}function _getRng(doc){var sel=_getSel(doc),rng;try{if(sel.rangeCount>0){rng=sel.getRangeAt(0)}else{rng=sel.createRange()}}catch(e){}if(_IERANGE&&(!rng||!rng.item&&rng.parentElement().ownerDocument!==doc)){return null}return rng}function _singleKeyMap(map){var newMap={},arr,v;_each(map,function(key,val){arr=key.split(",");for(var i=0,len=arr.length;i<len;i++){v=arr[i];newMap[v]=val}});return newMap}function _hasAttrOrCss(knode,map){return _hasAttrOrCssByKey(knode,map,"*")||_hasAttrOrCssByKey(knode,map)}function _hasAttrOrCssByKey(knode,map,mapKey){mapKey=mapKey||knode.name;if(knode.type!==1){return false}var newMap=_singleKeyMap(map);if(!newMap[mapKey]){return false}var arr=newMap[mapKey].split(",");for(var i=0,len=arr.length;i<len;i++){var key=arr[i];if(key==="*"){return true}var match=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);var method=match[1]?"css":"attr";key=match[2];var val=match[3]||"";if(val===""&&knode[method](key)!==""){return true}if(val!==""&&knode[method](key)===val){return true}}return false}function _removeAttrOrCss(knode,map){if(knode.type!=1){return}_removeAttrOrCssByKey(knode,map,"*");_removeAttrOrCssByKey(knode,map)}function _removeAttrOrCssByKey(knode,map,mapKey){mapKey=mapKey||knode.name;if(knode.type!==1){return}var newMap=_singleKeyMap(map);if(!newMap[mapKey]){return}var arr=newMap[mapKey].split(","),allFlag=false;for(var i=0,len=arr.length;i<len;i++){var key=arr[i];if(key==="*"){allFlag=true;break}var match=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);key=match[2];if(match[1]){key=_toCamel(key);if(knode[0].style[key]){knode[0].style[key]=""}}else{knode.removeAttr(key)}}if(allFlag){knode.remove(true)}}function _getInnerNode(knode){var inner=knode;while(inner.first()){inner=inner.first()}return inner}function _isEmptyNode(knode){if(knode.type!=1||knode.isSingle()){return false}return knode.html().replace(/<[^>]+>/g,"")===""}function _mergeWrapper(a,b){a=a.clone(true);var lastA=_getInnerNode(a),childA=a,merged=false;while(b){while(childA){if(childA.name===b.name){_mergeAttrs(childA,b.attr(),b.css());merged=true}childA=childA.first()}if(!merged){lastA.append(b.clone(false))}merged=false;b=b.first()}return a}function _wrapNode(knode,wrapper){wrapper=wrapper.clone(true);if(knode.type==3){_getInnerNode(wrapper).append(knode.clone(false));knode.replaceWith(wrapper);return wrapper}var nodeWrapper=knode,child;while((child=knode.first())&&child.children().length==1){knode=child}child=knode.first();var frag=knode.doc.createDocumentFragment();while(child){frag.appendChild(child[0]);child=child.next()}wrapper=_mergeWrapper(nodeWrapper,wrapper);if(frag.firstChild){_getInnerNode(wrapper).append(frag)}nodeWrapper.replaceWith(wrapper);return wrapper}function _mergeAttrs(knode,attrs,styles){_each(attrs,function(key,val){if(key!=="style"){knode.attr(key,val)}});_each(styles,function(key,val){knode.css(key,val)})}function _inPreElement(knode){while(knode&&knode.name!="body"){if(_PRE_TAG_MAP[knode.name]||knode.name=="div"&&knode.hasClass("ke-script")){return true}knode=knode.parent()}return false}function KCmd(range){this.init(range)}_extend(KCmd,{init:function(range){var self=this,doc=range.doc;self.doc=doc;self.win=_getWin(doc);self.sel=_getSel(doc);self.range=range},selection:function(forceReset){var self=this,doc=self.doc,rng=_getRng(doc);self.sel=_getSel(doc);if(rng){self.range=_range(rng);if(K(self.range.startContainer).name=="html"){self.range.selectNodeContents(doc.body).collapse(false)}return self}if(forceReset){self.range.selectNodeContents(doc.body).collapse(false)}return self},select:function(hasDummy){hasDummy=_undef(hasDummy,true);var self=this,sel=self.sel,range=self.range.cloneRange().shrink(),sc=range.startContainer,so=range.startOffset,ec=range.endContainer,eo=range.endOffset,doc=_getDoc(sc),win=self.win,rng,hasU200b=false;if(hasDummy&&sc.nodeType==1&&range.collapsed){if(_IERANGE){var dummy=K("<span>&nbsp;</span>",doc);range.insertNode(dummy[0]);rng=doc.body.createTextRange();try{rng.moveToElementText(dummy[0])}catch(ex){}rng.collapse(false);rng.select();dummy.remove();win.focus();return self}if(_WEBKIT){var children=sc.childNodes;if(K(sc).isInline()||so>0&&K(children[so-1]).isInline()||children[so]&&K(children[so]).isInline()){range.insertNode(doc.createTextNode("​"));hasU200b=true}}}if(_IERANGE){try{rng=range.get(true);rng.select()}catch(e){}}else{if(hasU200b){range.collapse(false)}rng=range.get(true);sel.removeAllRanges();sel.addRange(rng);if(doc!==document){var pos=K(rng.endContainer).pos();win.scrollTo(pos.x,pos.y)}}win.focus();return self},wrap:function(val){var self=this,doc=self.doc,range=self.range,wrapper;wrapper=K(val,doc);if(range.collapsed){range.shrink();range.insertNode(wrapper[0]).selectNodeContents(wrapper[0]);return self}if(wrapper.isBlock()){var copyWrapper=wrapper.clone(true),child=copyWrapper;while(child.first()){child=child.first()}child.append(range.extractContents());range.insertNode(copyWrapper[0]).selectNode(copyWrapper[0]);return self}range.enlarge();var bookmark=range.createBookmark(),ancestor=range.commonAncestor(),isStart=false;K(ancestor).scan(function(node){if(!isStart&&node==bookmark.start){isStart=true;return}if(isStart){if(node==bookmark.end){return false}var knode=K(node);if(_inPreElement(knode)){return}if(knode.type==3&&_trim(node.nodeValue).length>0){var parent;while((parent=knode.parent())&&parent.isStyle()&&parent.children().length==1){knode=parent}_wrapNode(knode,wrapper)}}});range.moveToBookmark(bookmark);return self},split:function(isStart,map){var range=this.range,doc=range.doc;var tempRange=range.cloneRange().collapse(isStart);var node=tempRange.startContainer,pos=tempRange.startOffset,parent=node.nodeType==3?node.parentNode:node,needSplit=false,knode;while(parent&&parent.parentNode){knode=K(parent);if(map){if(!knode.isStyle()){break}if(!_hasAttrOrCss(knode,map)){break}}else{if(_NOSPLIT_TAG_MAP[knode.name]){break}}needSplit=true;parent=parent.parentNode}if(needSplit){var dummy=doc.createElement("span");range.cloneRange().collapse(!isStart).insertNode(dummy);if(isStart){tempRange.setStartBefore(parent.firstChild).setEnd(node,pos)}else{tempRange.setStart(node,pos).setEndAfter(parent.lastChild)}var frag=tempRange.extractContents(),first=frag.firstChild,last=frag.lastChild;if(isStart){tempRange.insertNode(frag);range.setStartAfter(last).setEndBefore(dummy)}else{parent.appendChild(frag);range.setStartBefore(dummy).setEndBefore(first)}var dummyParent=dummy.parentNode;if(dummyParent==range.endContainer){var prev=K(dummy).prev(),next=K(dummy).next();if(prev&&next&&prev.type==3&&next.type==3){range.setEnd(prev[0],prev[0].nodeValue.length)}else if(!isStart){range.setEnd(range.endContainer,range.endOffset-1)}}dummyParent.removeChild(dummy)}return this},remove:function(map){var self=this,doc=self.doc,range=self.range;range.enlarge();if(range.startOffset===0){var ksc=K(range.startContainer),parent;while((parent=ksc.parent())&&parent.isStyle()&&parent.children().length==1){ksc=parent}range.setStart(ksc[0],0);ksc=K(range.startContainer);if(ksc.isBlock()){_removeAttrOrCss(ksc,map)}var kscp=ksc.parent();if(kscp&&kscp.isBlock()){_removeAttrOrCss(kscp,map)}}var sc,so;if(range.collapsed){self.split(true,map);sc=range.startContainer;so=range.startOffset;if(so>0){var sb=K(sc.childNodes[so-1]);if(sb&&_isEmptyNode(sb)){sb.remove();range.setStart(sc,so-1)}}var sa=K(sc.childNodes[so]);if(sa&&_isEmptyNode(sa)){sa.remove()}if(_isEmptyNode(sc)){range.startBefore(sc);sc.remove()}range.collapse(true);return self}self.split(true,map);self.split(false,map);var startDummy=doc.createElement("span"),endDummy=doc.createElement("span");range.cloneRange().collapse(false).insertNode(endDummy);range.cloneRange().collapse(true).insertNode(startDummy);var nodeList=[],cmpStart=false;K(range.commonAncestor()).scan(function(node){if(!cmpStart&&node==startDummy){cmpStart=true;return}if(node==endDummy){return false}if(cmpStart){nodeList.push(node)}});K(startDummy).remove();K(endDummy).remove();sc=range.startContainer;so=range.startOffset;var ec=range.endContainer,eo=range.endOffset;if(so>0){var startBefore=K(sc.childNodes[so-1]);if(startBefore&&_isEmptyNode(startBefore)){startBefore.remove();range.setStart(sc,so-1);if(sc==ec){range.setEnd(ec,eo-1)}}var startAfter=K(sc.childNodes[so]);if(startAfter&&_isEmptyNode(startAfter)){startAfter.remove();if(sc==ec){range.setEnd(ec,eo-1)}}}var endAfter=K(ec.childNodes[range.endOffset]);if(endAfter&&_isEmptyNode(endAfter)){endAfter.remove()}var bookmark=range.createBookmark(true);_each(nodeList,function(i,node){_removeAttrOrCss(K(node),map)});range.moveToBookmark(bookmark);return self},commonNode:function(map){var range=this.range;var ec=range.endContainer,eo=range.endOffset,node=ec.nodeType==3||eo===0?ec:ec.childNodes[eo-1];function find(node){var child=node,parent=node;while(parent){if(_hasAttrOrCss(K(parent),map)){return K(parent)}parent=parent.parentNode}while(child&&(child=child.lastChild)){if(_hasAttrOrCss(K(child),map)){return K(child)}}return null}var cNode=find(node);if(cNode){return cNode}if(node.nodeType==1||ec.nodeType==3&&eo===0){var prev=K(node).prev();if(prev){return find(prev)}}return null},commonAncestor:function(tagName){var range=this.range,sc=range.startContainer,so=range.startOffset,ec=range.endContainer,eo=range.endOffset,startNode=sc.nodeType==3||so===0?sc:sc.childNodes[so-1],endNode=ec.nodeType==3||eo===0?ec:ec.childNodes[eo-1];function find(node){while(node){if(node.nodeType==1){if(node.tagName.toLowerCase()===tagName){return node}}node=node.parentNode}return null}var start=find(startNode),end=find(endNode);if(start&&end&&start===end){return K(start)}return null},state:function(key){var self=this,doc=self.doc,bool=false;try{bool=doc.queryCommandState(key)}catch(e){}return bool},val:function(key){var self=this,doc=self.doc,range=self.range;function lc(val){return val.toLowerCase()}key=lc(key);var val="",knode;if(key==="fontfamily"||key==="fontname"){val=_nativeCommandValue(doc,"fontname");val=val.replace(/['"]/g,"");return lc(val)}if(key==="formatblock"){val=_nativeCommandValue(doc,key);if(val===""){knode=self.commonNode({"h1,h2,h3,h4,h5,h6,p,div,pre,address":"*"});if(knode){val=knode.name}}if(val==="Normal"){val="p"}return lc(val)}if(key==="fontsize"){knode=self.commonNode({"*":".font-size"});if(knode){val=knode.css("font-size")}return lc(val)}if(key==="forecolor"){knode=self.commonNode({"*":".color"});if(knode){val=knode.css("color")}val=_toHex(val);if(val===""){val="default"}return lc(val)}if(key==="hilitecolor"){knode=self.commonNode({"*":".background-color"});if(knode){val=knode.css("background-color")}val=_toHex(val);if(val===""){val="default"}return lc(val)}return val},toggle:function(wrapper,map){var self=this;if(self.commonNode(map)){self.remove(map)}else{self.wrap(wrapper)}return self.select()},bold:function(){return this.toggle("<strong></strong>",{span:".font-weight=bold",strong:"*",b:"*"})},italic:function(){return this.toggle("<em></em>",{span:".font-style=italic",em:"*",i:"*"})},underline:function(){return this.toggle("<u></u>",{span:".text-decoration=underline",u:"*"})},strikethrough:function(){return this.toggle("<s></s>",{span:".text-decoration=line-through",s:"*"})},forecolor:function(val){return this.wrap('<span style="color:'+val+';"></span>').select()},hilitecolor:function(val){return this.wrap('<span style="background-color:'+val+';"></span>').select()},fontsize:function(val){return this.wrap('<span style="font-size:'+val+';"></span>').select()},fontname:function(val){return this.fontfamily(val)},fontfamily:function(val){return this.wrap('<span style="font-family:'+val+';"></span>').select()},removeformat:function(){var map={"*":".font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent"},tags=_STYLE_TAG_MAP;_each(tags,function(key,val){map[key]="*"});this.remove(map);return this.select()},inserthtml:function(val,quickMode){var self=this,range=self.range;if(val===""){return self}function pasteHtml(range,val){val='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+val;var rng=range.get();if(rng.item){rng.item(0).outerHTML=val}else{rng.pasteHTML(val)}var temp=range.doc.getElementById("__kindeditor_temp_tag__");temp.parentNode.removeChild(temp);var newRange=_toRange(rng);range.setEnd(newRange.endContainer,newRange.endOffset);range.collapse(false);self.select(false)}function insertHtml(range,val){var doc=range.doc,frag=doc.createDocumentFragment();K("@"+val,doc).each(function(){frag.appendChild(this)});range.deleteContents();range.insertNode(frag);range.collapse(false);self.select(false)}if(_IERANGE&&quickMode){try{pasteHtml(range,val)}catch(e){insertHtml(range,val)}return self}insertHtml(range,val);return self},hr:function(){return this.inserthtml("<hr />")},print:function(){this.win.print();return this},insertimage:function(url,title,width,height,border,align){title=_undef(title,"");border=_undef(border,0);var html='<img src="'+_escape(url)+'" data-ke-src="'+_escape(url)+'" ';if(width){html+='width="'+_escape(width)+'" '}if(height){html+='height="'+_escape(height)+'" '}if(title){html+='title="'+_escape(title)+'" '}if(align){html+='align="'+_escape(align)+'" '}html+='alt="'+_escape(title)+'" ';html+="/>";return this.inserthtml(html)},createlink:function(url,type){var self=this,doc=self.doc,range=self.range;self.select();var a=self.commonNode({a:"*"});if(a&&!range.isControl()){range.selectNode(a.get());self.select()}var html='<a href="'+_escape(url)+'" data-ke-src="'+_escape(url)+'" ';if(type){html+=' target="'+_escape(type)+'"'}if(range.collapsed){html+=">"+_escape(url)+"</a>";return self.inserthtml(html)}if(range.isControl()){var node=K(range.startContainer.childNodes[range.startOffset]);html+="></a>";node.after(K(html,doc));node.next().append(node);range.selectNode(node[0]);return self.select()}function setAttr(node,url,type){K(node).attr("href",url).attr("data-ke-src",url);if(type){K(node).attr("target",type)}else{K(node).removeAttr("target")}}var sc=range.startContainer,so=range.startOffset,ec=range.endContainer,eo=range.endOffset;if(sc.nodeType==1&&sc===ec&&so+1===eo){var child=sc.childNodes[so];if(child.nodeName.toLowerCase()=="a"){setAttr(child,url,type);return self}}_nativeCommand(doc,"createlink","__kindeditor_temp_url__");K('a[href="__kindeditor_temp_url__"]',doc).each(function(){setAttr(this,url,type)});return self},unlink:function(){var self=this,doc=self.doc,range=self.range;self.select();if(range.collapsed){var a=self.commonNode({a:"*"});if(a){range.selectNode(a.get());self.select()}_nativeCommand(doc,"unlink",null);if(_WEBKIT&&K(range.startContainer).name==="img"){var parent=K(range.startContainer).parent();if(parent.name==="a"){parent.remove(true)}}}else{_nativeCommand(doc,"unlink",null)}return self}});_each(("formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,"+"insertunorderedlist,indent,outdent,subscript,superscript").split(","),function(i,name){KCmd.prototype[name]=function(val){var self=this;self.select();_nativeCommand(self.doc,name,val);if(_IERANGE&&_inArray(name,"justifyleft,justifycenter,justifyright,justifyfull".split(","))>=0){self.selection()}if(!_IERANGE||_inArray(name,"formatblock,selectall,insertorderedlist,insertunorderedlist".split(","))>=0){self.selection()}return self}});_each("cut,copy,paste".split(","),function(i,name){KCmd.prototype[name]=function(){var self=this;if(!self.doc.queryCommandSupported(name)){throw"not supported"}self.select();_nativeCommand(self.doc,name,null);return self}});function _cmd(mixed){if(mixed.nodeName){var doc=_getDoc(mixed);mixed=_range(doc).selectNodeContents(doc.body).collapse(false)}return new KCmd(mixed)}K.CmdClass=KCmd;K.cmd=_cmd;function _drag(options){var moveEl=options.moveEl,moveFn=options.moveFn,clickEl=options.clickEl||moveEl,beforeDrag=options.beforeDrag,iframeFix=options.iframeFix===undefined?true:options.iframeFix;var docs=[document];if(iframeFix){K("iframe").each(function(){var src=_formatUrl(this.src||"","absolute");if(/^https?:\/\//.test(src)){return}var doc;try{doc=_iframeDoc(this)}catch(e){}if(doc){var pos=K(this).pos();K(doc).data("pos-x",pos.x);K(doc).data("pos-y",pos.y);docs.push(doc)}})}clickEl.mousedown(function(e){if(e.button!==0&&e.button!==1){return}e.stopPropagation();var self=clickEl.get(),x=_removeUnit(moveEl.css("left")),y=_removeUnit(moveEl.css("top")),width=moveEl.width(),height=moveEl.height(),pageX=e.pageX,pageY=e.pageY;if(beforeDrag){beforeDrag()}function moveListener(e){e.preventDefault();var kdoc=K(_getDoc(e.target));var diffX=_round((kdoc.data("pos-x")||0)+e.pageX-pageX);var diffY=_round((kdoc.data("pos-y")||0)+e.pageY-pageY);moveFn.call(clickEl,x,y,width,height,diffX,diffY)}function selectListener(e){e.preventDefault()}function upListener(e){e.preventDefault();K(docs).unbind("mousemove",moveListener).unbind("mouseup",upListener).unbind("selectstart",selectListener);if(self.releaseCapture){self.releaseCapture()}}K(docs).mousemove(moveListener).mouseup(upListener).bind("selectstart",selectListener);if(self.setCapture){self.setCapture()}})}function KWidget(options){this.init(options)}_extend(KWidget,{init:function(options){var self=this;self.name=options.name||"";self.doc=options.doc||document;self.win=_getWin(self.doc);self.x=_addUnit(options.x);self.y=_addUnit(options.y);self.z=options.z;self.width=_addUnit(options.width);self.height=_addUnit(options.height);self.div=K('<div style="display:block;"></div>');self.options=options;self._alignEl=options.alignEl;if(self.width){self.div.css("width",self.width)}if(self.height){self.div.css("height",self.height)}if(self.z){self.div.css({position:"absolute",left:self.x,top:self.y,"z-index":self.z})}if(self.z&&(self.x===undefined||self.y===undefined)){self.autoPos(self.width,self.height)}if(options.cls){self.div.addClass(options.cls)}if(options.shadowMode){self.div.addClass("ke-shadow")}if(options.css){self.div.css(options.css)}if(options.src){K(options.src).replaceWith(self.div)}else{K(self.doc.body).append(self.div)}if(options.html){self.div.html(options.html)}if(options.autoScroll){if(_IE&&_V<7||_QUIRKS){var scrollPos=_getScrollPos();K(self.win).bind("scroll",function(e){var pos=_getScrollPos(),diffX=pos.x-scrollPos.x,diffY=pos.y-scrollPos.y;self.pos(_removeUnit(self.x)+diffX,_removeUnit(self.y)+diffY,false)})}else{self.div.css("position","fixed")}}},pos:function(x,y,updateProp){var self=this;updateProp=_undef(updateProp,true);if(x!==null){x=x<0?0:_addUnit(x);self.div.css("left",x);if(updateProp){self.x=x}}if(y!==null){y=y<0?0:_addUnit(y);self.div.css("top",y);if(updateProp){self.y=y}}return self},autoPos:function(width,height){var x,y,self=this,w=_removeUnit(width)||0,h=_removeUnit(height)||0,scrollPos=_getScrollPos();if(self._alignEl){var knode=K(self._alignEl),pos=knode.pos(),diffX=_round(knode[0].clientWidth/2-w/2),diffY=_round(knode[0].clientHeight/2-h/2);x=diffX<0?pos.x:pos.x+diffX}else{var docEl=_docElement(self.doc);x=_round(scrollPos.x+(docEl.clientWidth-w)/2);y=_round(scrollPos.y+(docEl.clientHeight-h)/2)}if(K.options.dialogOffset>0){y=scrollPos.y+20}if(!(_IE&&_V<7||_QUIRKS)){x-=scrollPos.x;y-=scrollPos.y}return self.pos(x,y)},remove:function(){var self=this;if(_IE&&_V<7||_QUIRKS){K(self.win).unbind("scroll")}self.div.remove();_each(self,function(i){self[i]=null});return this},show:function(){this.div.show();return this},hide:function(){this.div.hide();return this},draggable:function(options){var self=this;options=options||{};options.moveEl=self.div;options.moveFn=function(x,y,width,height,diffX,diffY){if((x=x+diffX)<0){x=0}if((y=y+diffY)<0){y=0}self.pos(x,y)};_drag(options);return self}});function _widget(options){return new KWidget(options)}K.WidgetClass=KWidget;K.widget=_widget;function _iframeDoc(iframe){iframe=_get(iframe);return iframe.contentDocument||iframe.contentWindow.document}var html,_direction="";if(html=document.getElementsByTagName("html")){_direction=html[0].dir}function _getInitHtml(options){var themesPath=_undef(options.themesPath,""),bodyClass=options.bodyClass,cssPath=options.cssPath,jsPath=options.jsPath,cssData=options.cssData;var arr=[_direction===""?"<html>":'<html dir="'+_direction+'">','<head><meta charset="utf-8" /><title></title>',"<style>","html {margin:0;padding:0;}","body {margin:0;padding:5px;}",'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',"body, p, div {word-wrap: break-word;}","p {margin:5px 0;}","table {border-collapse:collapse;}","img {border:0;}","noscript {display:none;}","table.ke-zeroborder td {border:1px dotted #AAA;}","img.ke-flash {","\tborder:1px solid #AAA;","\tbackground-image:url("+themesPath+"common/flash.svg);","\t*background-image:url("+themesPath+"common/flash.png);","\tbackground-size:64px 64px;","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-rm {","\tborder:1px solid #AAA;","\tbackground-image:url("+themesPath+"common/rm.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-media {","\tborder:1px solid #AAA;","\tbackground-image:url("+themesPath+"common/play.svg);","\t*background-image:url("+themesPath+"common/play.png);","\tbackground-position:center center;","\tbackground-size:64px 64px;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-anchor {","\tborder:1px dashed #666;","\twidth:16px;","\theight:16px;","}",".ke-script, .ke-noscript, .ke-display-none {","\tdisplay:none;","\tfont-size:0;","\twidth:0;","\theight:0;","}",".ke-pagebreak {","\tborder:1px dotted #AAA;","\tfont-size:0;","\theight:2px;","}"];if(options.showHelpGrid){arr.push("p,ul,ol,li,div{border: 1px dashed #c1c1c1;}");arr.push("li{margin:5px 0px}");arr.push("div,ul,ol{margin-bottom:10px}")}arr.push("</style>");if(!_isArray(cssPath)){cssPath=[cssPath]}if(_inArray(K.basePath+"themes/app.css",cssPath)<0){cssPath.push(K.basePath+"themes/app.css")}_each(cssPath,function(i,path){if(path){arr.push('<link href="'+path+'" rel="stylesheet" />')}});if(cssData){arr.push("<style>"+cssData+"</style>")}arr.push("</head><body "+(bodyClass?'class="'+bodyClass+'"':"")+">");if(!_isArray(jsPath)){jsPath=[jsPath]}_each(jsPath,function(i,path){if(path){arr.push('<script type="text/javascript" src="'+path+'"><\/script>')}});arr.push("</body></html>");return arr.join("\n")}function _elementVal(knode,val){if(knode.hasVal()){if(val===undefined){var html=knode.val();html=html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/gi,"");return html}return knode.val(val)}return knode.html(val)}function KEdit(options){this.init(options)}_extend(KEdit,KWidget,{init:function(options){var self=this;KEdit.parent.init.call(self,options);self.srcElement=K(options.srcElement);self.div.addClass("ke-edit");self.designMode=_undef(options.designMode,true);self.beforeGetHtml=options.beforeGetHtml;self.beforeSetHtml=options.beforeSetHtml;self.afterSetHtml=options.afterSetHtml;var isDocumentDomain=location.protocol!="res:"&&location.host.replace(/:\d+/,"")!==document.domain,srcScript="document.open();"+(isDocumentDomain?'document.domain="'+document.domain+'";':"")+"document.close();",iframeSrc=_IE?' src="javascript:void(function(){'+encodeURIComponent(srcScript)+'}())"':"";self.iframe=K('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"'+iframeSrc+"></iframe>").css("width","100%");self.textarea=K('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css("width","100%");self.tabIndex=isNaN(parseInt(options.tabIndex,10))?self.srcElement.attr("tabindex"):parseInt(options.tabIndex,10);self.iframe.attr("tabindex",self.tabIndex);self.textarea.attr("tabindex",self.tabIndex);if(self.width){self.setWidth(self.width)}if(self.height){self.setHeight(self.height)}if(self.designMode){self.textarea.hide()}else{self.iframe.hide()}function ready(){var doc=_iframeDoc(self.iframe);doc.open();if(isDocumentDomain){doc.domain=document.domain}doc.write(_getInitHtml(self.options));doc.close();self.win=self.iframe[0].contentWindow;self.doc=doc;var cmd=_cmd(doc);self.afterChange(function(e){cmd.selection()});if(_WEBKIT){K(doc).click(function(e){if(K(e.target).name==="img"){cmd.selection(true);cmd.range.selectNode(e.target);cmd.select()}})}if(_IE){self._mousedownHandler=function(){var newRange=cmd.range.cloneRange();newRange.shrink();if(newRange.isControl()){self.blur()}};K(document).mousedown(self._mousedownHandler);K(doc).keydown(function(e){if(e.which==8){cmd.selection();var rng=cmd.range;if(rng.isControl()){rng.collapse(true);K(rng.startContainer.childNodes[rng.startOffset]).remove();e.preventDefault()}}})}self.cmd=cmd;self.html(_elementVal(self.srcElement));if(_IE){doc.body.disabled=true;doc.body.contentEditable=true;doc.body.removeAttribute("disabled")}else{doc.designMode="on"}if(options.afterCreate){options.afterCreate.call(self)}}if(isDocumentDomain){self.iframe.bind("load",function(e){self.iframe.unbind("load");if(_IE){ready()}else{setTimeout(ready,0)}})}self.div.append(self.iframe);self.div.append(self.textarea);self.srcElement.hide();!isDocumentDomain&&ready()},setWidth:function(val){var self=this;val=_addUnit(val);self.width=val;self.div.css("width",val);return self},setHeight:function(val){var self=this;val=_addUnit(val);self.height=val;self.div.css("height",val);self.iframe.css("height",val);if(_IE&&_V<8||_QUIRKS){val=_addUnit(_removeUnit(val)-2)}self.textarea.css("height",val);return self},remove:function(){var self=this,doc=self.doc;K(doc.body).unbind();K(doc).unbind();K(self.win).unbind();if(self._mousedownHandler){K(document).unbind("mousedown",self._mousedownHandler)}_elementVal(self.srcElement,self.html());self.srcElement.show();self.iframe.unbind();self.textarea.unbind();KEdit.parent.remove.call(self)},html:function(val,isFull){var self=this,doc=self.doc;if(self.designMode){var body=doc.body;if(val===undefined){if(isFull){val="<!doctype html><html>"+body.parentNode.innerHTML+"</html>"}else{val=body.innerHTML}if(self.beforeGetHtml){val=self.beforeGetHtml(val)}if(_GECKO&&val=="<br />"){val=""}return val}if(self.beforeSetHtml){val=self.beforeSetHtml(val)}if(_IE&&_V>=9){val=val.replace(/(<.*?checked=")checked(".*>)/gi,"$1$2")}K(body).html(val);if(self.afterSetHtml){self.afterSetHtml()}return self}if(val===undefined){return self.textarea.val()}self.textarea.val(val);return self},design:function(bool){var self=this,val;if(bool===undefined?!self.designMode:bool){if(!self.designMode){val=self.html();self.designMode=true;self.textarea.hide();self.html(val);var iframe=self.iframe;var height=_removeUnit(self.height);iframe.height(height-2);iframe.show();setTimeout(function(){iframe.height(height)},0)}}else{if(self.designMode){val=self.html();self.designMode=false;self.html(val);self.iframe.hide();self.textarea.show()}}return self.focus()},focus:function(){var self=this;self.designMode?self.win.focus():self.textarea[0].focus();return self},blur:function(){var self=this;if(_IE){var input=K('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />',self.div);self.div.append(input);input[0].focus();input.remove()}else{self.designMode?self.win.blur():self.textarea[0].blur()}return self},afterChange:function(fn){var self=this,doc=self.doc,body=doc.body;K(doc).keyup(function(e){if(!e.ctrlKey&&!e.altKey&&_CHANGE_KEY_MAP[e.which]){fn(e)}});K(doc).mouseup(fn).contextmenu(fn);K(self.win).blur(fn);function timeoutHandler(e){setTimeout(function(){fn(e)},1)}K(body).bind("paste",timeoutHandler);K(body).bind("cut",timeoutHandler);return self}});function _edit(options){return new KEdit(options)}K.EditClass=KEdit;K.edit=_edit;K.iframeDoc=_iframeDoc;function _selectToolbar(name,fn){var self=this,knode=self.get(name);if(knode){if(knode.hasClass("ke-disabled")){return}fn(knode)}}function KToolbar(options){this.init(options)}_extend(KToolbar,KWidget,{init:function(options){var self=this;KToolbar.parent.init.call(self,options);self.disableMode=_undef(options.disableMode,false);self.noDisableItemMap=_toMap(_undef(options.noDisableItems,[]));self._itemMap={};self.div.addClass("ke-toolbar").bind("contextmenu,mousedown,mousemove",function(e){e.preventDefault()}).attr("unselectable","on");function find(target){var knode=K(target);if(knode.hasClass("ke-outline")){return knode}if(knode.hasClass("ke-toolbar-icon")){return knode.parent()}}function hover(e,method){var knode=find(e.target);if(knode){if(knode.hasClass("ke-disabled")){return}if(knode.hasClass("ke-selected")){return}knode[method]("ke-on")}}self.div.mouseover(function(e){hover(e,"addClass")}).mouseout(function(e){hover(e,"removeClass")}).click(function(e){var knode=find(e.target);if(knode){if(knode.hasClass("ke-disabled")){return}self.options.click.call(this,e,knode.attr("data-name"))}})},get:function(name){if(this._itemMap[name]){return this._itemMap[name]}return this._itemMap[name]=K("span.ke-icon-"+name,this.div).parent()},select:function(name){_selectToolbar.call(this,name,function(knode){knode.addClass("ke-selected")});return self},unselect:function(name){_selectToolbar.call(this,name,function(knode){knode.removeClass("ke-selected").removeClass("ke-on")});return self},enable:function(name){var self=this,knode=name.get?name:self.get(name);if(knode){knode.removeClass("ke-disabled");knode.opacity(1)}return self},disable:function(name){var self=this,knode=name.get?name:self.get(name);if(knode){knode.removeClass("ke-selected").addClass("ke-disabled");knode.opacity(.5)}return self},disableAll:function(bool,noDisableItems){var self=this,map=self.noDisableItemMap,item;if(noDisableItems){map=_toMap(noDisableItems)}if(bool===undefined?!self.disableMode:bool){K("span.ke-outline",self.div).each(function(){var knode=K(this),name=knode[0].getAttribute("data-name",2);if(!map[name]){self.disable(knode)}});self.disableMode=true}else{K("span.ke-outline",self.div).each(function(){var knode=K(this),name=knode[0].getAttribute("data-name",2);if(!map[name]){self.enable(knode)}});self.disableMode=false}return self}});function _toolbar(options){return new KToolbar(options)}K.ToolbarClass=KToolbar;K.toolbar=_toolbar;function KMenu(options){this.init(options)}_extend(KMenu,KWidget,{init:function(options){var self=this;options.z=options.z||811213;KMenu.parent.init.call(self,options);self.centerLineMode=_undef(options.centerLineMode,true);self.div.addClass("ke-menu ke-menu-"+options.themeType).bind("click,mousedown",function(e){e.stopPropagation()}).attr("unselectable","on")},addItem:function(item){var self=this;if(item.title==="-"){self.div.append(K('<div class="ke-menu-separator"></div>'));return}var itemDiv=K('<div class="ke-menu-item" unselectable="on"></div>'),leftDiv=K('<div class="ke-inline-block ke-menu-item-left"></div>'),rightDiv=K('<div class="ke-inline-block ke-menu-item-right"></div>'),height=_addUnit(item.height),iconClass=_undef(item.iconClass,"");self.div.append(itemDiv);if(height){itemDiv.css("height",height);rightDiv.css("line-height",height)}var centerDiv;if(self.centerLineMode){centerDiv=K('<div class="ke-inline-block ke-menu-item-center"></div>');if(height){centerDiv.css("height",height)}}itemDiv.mouseover(function(e){K(this).addClass("ke-menu-item-on");if(centerDiv){centerDiv.addClass("ke-menu-item-center-on")}}).mouseout(function(e){K(this).removeClass("ke-menu-item-on");if(centerDiv){centerDiv.removeClass("ke-menu-item-center-on")}}).click(function(e){item.click.call(K(this));e.stopPropagation()}).append(leftDiv);if(centerDiv){itemDiv.append(centerDiv)}itemDiv.append(rightDiv);if(item.checked){iconClass="ke-icon-checked"}if(iconClass!==""){leftDiv.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url '+iconClass+'"></span>')}rightDiv.html(item.title);return self},remove:function(){var self=this;if(self.options.beforeRemove){self.options.beforeRemove.call(self)}K(".ke-menu-item",self.div[0]).unbind();KMenu.parent.remove.call(self);return self}});function _menu(options){return new KMenu(options)}K.MenuClass=KMenu;K.menu=_menu;function KColorPicker(options){this.init(options)}_extend(KColorPicker,KWidget,{init:function(options){var self=this;options.z=options.z||811213;KColorPicker.parent.init.call(self,options);var colors=options.colors||[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]];self.selectedColor=(options.selectedColor||"").toLowerCase();self._cells=[];self.div.addClass("ke-colorpicker").bind("click,mousedown",function(e){e.stopPropagation()}).attr("unselectable","on");var table=self.doc.createElement("table");self.div.append(table);table.className="ke-colorpicker-table";table.cellPadding=0;table.cellSpacing=0;table.border=0;var row=table.insertRow(0),cell=row.insertCell(0);cell.colSpan=colors[0].length;self._addAttr(cell,"","ke-colorpicker-cell-top");for(var i=0;i<colors.length;i++){row=table.insertRow(i+1);for(var j=0;j<colors[i].length;j++){cell=row.insertCell(j);self._addAttr(cell,colors[i][j],"ke-colorpicker-cell")}}},_addAttr:function(cell,color,cls){var self=this;cell=K(cell).addClass(cls);if(self.selectedColor===color.toLowerCase()){cell.addClass("ke-colorpicker-cell-selected")}cell.attr("title",color||self.options.noColor);cell.mouseover(function(e){K(this).addClass("ke-colorpicker-cell-on")});cell.mouseout(function(e){K(this).removeClass("ke-colorpicker-cell-on")});cell.click(function(e){e.stop();self.options.click.call(K(this),color)});if(color){cell.append(K('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css("background-color",color))}else{cell.html(self.options.noColor)}K(cell).attr("unselectable","on");self._cells.push(cell)},remove:function(){var self=this;_each(self._cells,function(){this.unbind()});KColorPicker.parent.remove.call(self);return self}});function _colorpicker(options){return new KColorPicker(options)}K.ColorPickerClass=KColorPicker;K.colorpicker=_colorpicker;function KUploadButton(options){this.init(options)}_extend(KUploadButton,{init:function(options){var self=this,button=K(options.button),fieldName=options.fieldName||"file",url=options.url||"",title=button.val(),extraParams=options.extraParams||{},cls=button[0].className||"",target=options.target||"kindeditor_upload_iframe_"+(new Date).getTime();options.afterError=options.afterError||function(str){K.options.errorMsgHandler(str,"error")};var hiddenElements=[];for(var k in extraParams){hiddenElements.push('<input type="hidden" name="'+k+'" value="'+extraParams[k]+'" />')}var html=['<div class="ke-inline-block '+cls+'">',options.target?"":'<iframe name="'+target+'" style="display:none;"></iframe>',options.form?'<div class="ke-upload-area">':'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="'+target+'" action="'+url+'">','<span class="ke-button-common">',hiddenElements.join(""),'<input type="button" class="ke-button-common ke-button" value="'+title+'" />',"</span>",'<input type="file" class="ke-upload-file" name="'+fieldName+'" tabindex="-1" />',options.form?"</div>":"</form>","</div>"].join("");var div=K(html,button.doc);button.hide();button.before(div);self.div=div;self.button=button;self.iframe=options.target?K('iframe[name="'+target+'"]'):K("iframe",div);self.form=options.form?K(options.form):K("form",div);self.fileBox=K(".ke-upload-file",div);var width=options.width||K(".ke-button-common",div).width();K(".ke-upload-area",div).width(width);self.options=options},submit:function(){var self=this,iframe=self.iframe;if(typeof self.options.beforeUpload=="function"){var result=self.options.beforeUpload.call(self);if(!result){return false}}iframe.bind("load",function(){iframe.unbind();var tempForm=document.createElement("form");self.fileBox.before(tempForm);K(tempForm).append(self.fileBox);tempForm.reset();K(tempForm).remove(true);var doc=K.iframeDoc(iframe),pre=doc.getElementsByTagName("pre")[0],str="",data;if(pre){str=pre.innerHTML}else{str=doc.body.innerHTML}str=_unescape(str);iframe[0].src="javascript:false";try{data=K.json(str)}catch(e){self.options.afterError.call(self,"<!doctype html><html>"+doc.body.parentNode.innerHTML+"</html>")}if(data){self.options.afterUpload.call(self,data)}});self.form[0].submit();return self},remove:function(){var self=this;if(self.fileBox){self.fileBox.unbind()}self.iframe.remove();self.div.remove();self.button.show();return self}});function _uploadbutton(options){return new KUploadButton(options)}K.UploadButtonClass=KUploadButton;K.uploadbutton=_uploadbutton;function _createButton(arg){arg=arg||{};var name=arg.name||"",btn=K('<a href="javascript:;" class="ke-dialog-btn" title="'+name+'">'+name+"</a>");if(arg.click){btn.click(arg.click)}return btn}function KDialog(options){this.init(options)}_extend(KDialog,KWidget,{init:function(options){var self=this;options.z=options.z||811213;options.shadowMode=false;options.autoScroll=_undef(options.autoScroll,true);KDialog.parent.init.call(self,options);var title=options.title,body=K(options.body,self.doc),previewBtn=options.previewBtn,yesBtn=options.yesBtn,noBtn=options.noBtn,closeBtn=options.closeBtn,showMask=_undef(options.showMask,true);self.div.addClass("ke-dialog ke-animated").bind("click,mousedown",function(e){e.stopPropagation()});var contentDiv=K('<div class="ke-dialog-content"></div>').appendTo(self.div);var headerDiv=K('<div class="ke-dialog-header"></div>');contentDiv.append(headerDiv);headerDiv.html(title);self.closeIcon=K('<span class="ke-dialog-icon-close" title="'+closeBtn.name+'"></span>').click(closeBtn.click);headerDiv.append(self.closeIcon);self.draggable({clickEl:headerDiv,beforeDrag:options.beforeDrag});var bodyDiv=K('<div class="ke-dialog-body"></div>');contentDiv.append(bodyDiv);bodyDiv.append(body);var footerDiv=K('<div class="ke-dialog-footer"></div>');if(previewBtn||yesBtn||noBtn){self.div.append(footerDiv);contentDiv.height(self.div.height()-footerDiv.height())}_each([{btn:previewBtn,name:"preview"},{btn:yesBtn,name:"yes"},{btn:noBtn,name:"no"}],function(){if(this.btn){var button=_createButton(this.btn);button.addClass("ke-dialog-"+this.name);footerDiv.append(button)}});if(self.height){bodyDiv.height(_removeUnit(self.height)-headerDiv.height()-footerDiv.height())}self.div.width(self.div.width());self.div.height(self.div.height());self.mask=null;if(showMask){var docEl=_docElement(self.doc),docWidth=Math.max(docEl.scrollWidth,docEl.clientWidth),docHeight=Math.max(docEl.scrollHeight,docEl.clientHeight);self.mask=_widget({x:0,y:0,z:self.z-1,cls:"ke-dialog-mask",width:docWidth,height:docHeight})}self.autoPos(self.div.width(),self.div.height());self.footerDiv=footerDiv;self.bodyDiv=bodyDiv;self.headerDiv=headerDiv;self.isLoading=false},setMaskIndex:function(z){var self=this;self.mask.div.css("z-index",z)},showLoading:function(msg){msg=_undef(msg,"");var self=this,body=self.bodyDiv;self.loading=K('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:'+Math.round(body.height()/3)+'px;">'+msg+"</div></div>").width(body.width()).height(body.height()).css("top",self.headerDiv.height()+"px");body.css("visibility","hidden").after(self.loading);self.isLoading=true;return self},hideLoading:function(){this.loading&&this.loading.remove();this.bodyDiv.css("visibility","visible");this.isLoading=false;return this},remove:function(){var self=this;if(self.options.beforeRemove){self.options.beforeRemove.call(self)}self.mask&&self.mask.remove();self.iframeMask&&self.iframeMask.remove();self.closeIcon.unbind();K("input",self.div).unbind();K("button",self.div).unbind();self.footerDiv.unbind();self.bodyDiv.unbind();self.headerDiv.unbind();K("iframe",self.div).each(function(){K(this).remove()});KDialog.parent.remove.call(self);return self}});function _dialog(options){return new KDialog(options)}K.DialogClass=KDialog;K.dialog=_dialog;function _tabs(options){var self=_widget(options),remove=self.remove,afterSelect=options.afterSelect,div=self.div,liList=[];div.addClass("ke-tabs").bind("contextmenu,mousedown,mousemove",function(e){e.preventDefault()});var ul=K('<ul class="ke-tabs-ul ke-clearfix"></ul>');div.append(ul);self.add=function(tab){var li=K('<li class="ke-tabs-li">'+tab.title+"</li>");li.data("tab",tab);liList.push(li);ul.append(li)};self.selectedIndex=0;self.select=function(index){self.selectedIndex=index;_each(liList,function(i,li){li.unbind();if(i===index){li.addClass("ke-tabs-li-selected");K(li.data("tab").panel).show("")}else{li.removeClass("ke-tabs-li-selected").removeClass("ke-tabs-li-on").mouseover(function(){K(this).addClass("ke-tabs-li-on")}).mouseout(function(){K(this).removeClass("ke-tabs-li-on")}).click(function(){self.select(i)});K(li.data("tab").panel).hide()}});if(afterSelect){afterSelect.call(self,index)}};self.remove=function(){_each(liList,function(){this.remove()});ul.remove();remove.call(self)};return self}K.tabs=_tabs;function _loadScript(url,fn){if(K.options.resLoadCache[url]){return}var head=document.getElementsByTagName("head")[0]||(_QUIRKS?document.body:document.documentElement),script=document.createElement("script");head.appendChild(script);K.options.resLoadCache[url]=1;script.src=url;script.charset="utf-8";script.onload=script.onreadystatechange=function(){if(!this.readyState||this.readyState==="loaded"){if(fn){fn()}script.onload=script.onreadystatechange=null;head.removeChild(script)}}}function _chopQuery(url){var index=url.indexOf("?");return index>0?url.substr(0,index):url}function _loadStyle(url){if(K.options.resLoadCache[url]){return}var head=document.getElementsByTagName("head")[0]||(_QUIRKS?document.body:document.documentElement),link=document.createElement("link"),absoluteUrl=_chopQuery(_formatUrl(url,"absolute"));var links=K('link[rel="stylesheet"]',head);for(var i=0,len=links.length;i<len;i++){if(_chopQuery(_formatUrl(links[i].href,"absolute"))===absoluteUrl){return}}head.appendChild(link);K.options.resLoadCache[url]=1;link.href=url;link.rel="stylesheet"}function _ajax(url,fn,method,param,dataType){method=method||"GET";dataType=dataType||"json";var xhr=window.XMLHttpRequest?new window.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");xhr.open(method,url,true);xhr.onreadystatechange=function(){if(xhr.readyState==4&&xhr.status==200){if(fn){var data=_trim(xhr.responseText);if(dataType=="json"){data=_json(data)}fn(data)}}};if(method=="POST"){var params=[];_each(param,function(key,val){params.push(encodeURIComponent(key)+"="+encodeURIComponent(val))});try{xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}catch(e){}xhr.send(params.join("&"))}else{xhr.send(null)}}K.loadScript=_loadScript;K.loadStyle=_loadStyle;K.ajax=_ajax;var _plugins={};function _plugin(name,fn){if(name===undefined){return _plugins}if(!fn){return _plugins[name]}_plugins[name]=fn}var _language={};function _parseLangKey(key){var match,ns="core";if(match=/^(\w+)\.(\w+)$/.exec(key)){ns=match[1];key=match[2]}return{ns:ns,key:key}}function _lang(mixed,langType){langType=langType===undefined?K.options.langType:langType;if(typeof mixed==="string"){if(!_language[langType]){return"no language"}var pos=mixed.length-1;if(mixed.substr(pos)==="."){return _language[langType][mixed.substr(0,pos)]}var obj=_parseLangKey(mixed);return _language[langType][obj.ns][obj.key]}_each(mixed,function(key,val){var obj=_parseLangKey(key);if(!_language[langType]){_language[langType]={}}if(!_language[langType][obj.ns]){_language[langType][obj.ns]={}}_language[langType][obj.ns][obj.key]=val})}function _getImageFromRange(range,fn){if(range.collapsed){return}range=range.cloneRange().up();var sc=range.startContainer,so=range.startOffset;if(!_WEBKIT&&!range.isControl()){return}var img=K(sc.childNodes[so]);if(!img||img.name!="img"){return}if(fn(img)){return img}}function _bindContextmenuEvent(){var self=this,doc=self.edit.doc;K(doc).contextmenu(function(e){if(self.menu){self.hideMenu()}if(!self.useContextmenu){e.preventDefault();return}if(self._contextmenus.length===0){return}var maxWidth=0,items=[];_each(self._contextmenus,function(){if(this.title=="-"){items.push(this);return}if(this.cond&&this.cond()){items.push(this);if(this.width&&this.width>maxWidth){maxWidth=this.width}}});while(items.length>0&&items[0].title=="-"){items.shift()}while(items.length>0&&items[items.length-1].title=="-"){items.pop()}var prevItem=null;_each(items,function(i){if(this.title=="-"&&prevItem.title=="-"){delete items[i]}prevItem=this});if(items.length>0){e.preventDefault();var pos=K(self.edit.iframe).pos(),menu=_menu({x:pos.x+e.clientX,themeType:self.themeType,y:pos.y+e.clientY,width:maxWidth,css:{visibility:"hidden"},shadowMode:self.shadowMode});_each(items,function(){if(this.title){menu.addItem(this)}});var docEl=_docElement(menu.doc),menuHeight=menu.div.height();if(e.clientY+menuHeight>=docEl.clientHeight-100){menu.pos(menu.x,_removeUnit(menu.y)-menuHeight)}menu.div.css("visibility","visible");self.menu=menu}})}function _bindNewlineEvent(){var self=this,doc=self.edit.doc,newlineTag=self.newlineTag;if(_IE&&newlineTag!=="br"){return}if(_GECKO&&_V<3&&newlineTag!=="p"){return}if(_OPERA&&_V<9){return}var brSkipTagMap=_toMap("h1,h2,h3,h4,h5,h6,pre,li"),pSkipTagMap=_toMap("p,h1,h2,h3,h4,h5,h6,pre,li,blockquote");function getAncestorTagName(range){var ancestor=K(range.commonAncestor());while(ancestor){if(ancestor.type==1&&!ancestor.isStyle()){break}ancestor=ancestor.parent()}return ancestor.name}K(doc).keydown(function(e){if(e.which==39){if(self.__startOffset==self.cmd.range.startOffset){var tagName=getAncestorTagName(self.cmd.range);if(tagName!="body"){self.appendHtml("<br />")}}else{self.__startOffset=self.cmd.range.startOffset}return}if(e.which!=13||e.shiftKey||e.ctrlKey||e.altKey){return}self.cmd.selection();var tagName=getAncestorTagName(self.cmd.range);if(tagName=="marquee"||tagName=="select"){return}if(newlineTag==="br"&&!brSkipTagMap[tagName]){e.preventDefault();self.insertHtml("<br />"+(_IE&&_V<9?"":"​"));return}if(!pSkipTagMap[tagName]){_nativeCommand(doc,"formatblock","<p>")}});K(doc).keyup(function(e){if(e.which!=13||e.shiftKey||e.ctrlKey||e.altKey){return}if(newlineTag=="br"){return}if(_GECKO){var root=self.cmd.commonAncestor("p");var a=self.cmd.commonAncestor("a");if(a&&a.text()==""){a.remove(true);self.cmd.range.selectNodeContents(root[0]).collapse(true);self.cmd.select()}return}self.cmd.selection();var tagName=getAncestorTagName(self.cmd.range);if(tagName=="marquee"||tagName=="select"){return}if(!pSkipTagMap[tagName]){_nativeCommand(doc,"formatblock","<p>")}var div=self.cmd.commonAncestor("div");if(div){var p=K("<p></p>"),child=div[0].firstChild;while(child){var next=child.nextSibling;p.append(child);child=next}div.before(p);div.remove();self.cmd.range.selectNodeContents(p[0]);self.cmd.select()}})}function _bindTabEvent(){var self=this,doc=self.edit.doc;K(doc).keydown(function(e){if(e.which==9){e.preventDefault();if(self.afterTab){self.afterTab.call(self,e);return}var cmd=self.cmd,range=cmd.range;range.shrink();if(range.collapsed&&range.startContainer.nodeType==1){range.insertNode(K("@&nbsp;",doc)[0]);cmd.select()}self.insertHtml("&nbsp;&nbsp;&nbsp;&nbsp;")}})}function _bindFocusEvent(){var self=this;K(self.edit.textarea[0],self.edit.win).focus(function(e){if(self.afterFocus){self.afterFocus.call(self,e)}}).blur(function(e){if(self.afterBlur){self.afterBlur.call(self,e)}})}function _removeBookmarkTag(html){return _trim(html.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/gi,""))}function _removeTempTag(html){return html.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/gi,"")}function _addBookmarkToStack(stack,bookmark){if(stack.length===0){stack.push(bookmark);return}var prev=stack[stack.length-1];if(_removeBookmarkTag(bookmark.html)!==_removeBookmarkTag(prev.html)){stack.push(bookmark)}}function _undoToRedo(fromStack,toStack){var self=this,edit=self.edit,body=edit.doc.body,range,bookmark;if(fromStack.length===0){return self}if(edit.designMode){range=self.cmd.range;bookmark=range.createBookmark(true);bookmark.html=body.innerHTML}else{bookmark={html:body.innerHTML}}_addBookmarkToStack(toStack,bookmark);var prev=fromStack.pop();if(_removeBookmarkTag(bookmark.html)===_removeBookmarkTag(prev.html)&&fromStack.length>0){prev=fromStack.pop()}if(edit.designMode){edit.html(prev.html);if(prev.start){range.moveToBookmark(prev);self.select()}}else{K(body).html(_removeBookmarkTag(prev.html))}return self}function KEditor(options){var self=this;self.options={};function setOption(key,val){if(KEditor.prototype[key]===undefined){self[key]=val}self.options[key]=val}_each(options,function(key,val){setOption(key,options[key])});_each(K.options,function(key,val){if(self[key]===undefined){setOption(key,val)}});var se=K(self.srcElement||"<textarea/>");if(!self.width){self.width=se[0].style.width||se.width()}if(!self.height){self.height=se[0].style.height||se.height()}setOption("width",_undef(self.width,self.minWidth));setOption("height",_undef(self.height,self.minHeight));setOption("width",_addUnit(self.width));setOption("height",_addUnit(self.height));if(_MOBILE&&(!_IOS||_V<534)){self.designMode=false}self.srcElement=se;self.initContent="";self.plugin={};self.isCreated=false;self._handlers={};self._contextmenus=[];self._undoStack=[];self._redoStack=[];self._firstAddBookmark=true;self.menu=self.contextmenu=null;self.dialogs=[]}KEditor.prototype={lang:function(mixed){return _lang(mixed,this.langType)},loadPlugin:function(name,fn){var self=this;var _pluginStatus=this._pluginStatus;if(!_pluginStatus){_pluginStatus=this._pluginStatus={}}if(_plugins[name]){if(!_isFunction(_plugins[name])){setTimeout(function(){self.loadPlugin(name,fn)},100);return self}if(!_pluginStatus[name]){_plugins[name].call(self,KindEditor);_pluginStatus[name]="inited"}if(fn){fn.call(self)}return self}_plugins[name]="loading";_loadScript(self.pluginsPath+name+"/"+name+".js?ver="+encodeURIComponent(K.DEBUG?_TIME:_VERSION),function(){setTimeout(function(){if(_plugins[name]){self.loadPlugin(name,fn)}},0)});return self},handler:function(key,fn){var self=this;if(!self._handlers[key]){self._handlers[key]=[]}if(_isFunction(fn)){self._handlers[key].push(fn);return self}_each(self._handlers[key],function(){fn=this.call(self,fn)});return fn},clickToolbar:function(name,fn){var self=this,key="clickToolbar"+name;if(fn===undefined){if(self._handlers[key]){return self.handler(key)}self.loadPlugin(name,function(){self.handler(key)});return self}return self.handler(key,fn)},updateState:function(){var self=this;_each(("justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,"+"subscript,superscript,bold,italic,underline,strikethrough").split(","),function(i,name){self.cmd.state(name)?self.toolbar.select(name):self.toolbar.unselect(name)});return self},addContextmenu:function(item){this._contextmenus.push(item);return this},afterCreate:function(fn){return this.handler("afterCreate",fn)},beforeRemove:function(fn){return this.handler("beforeRemove",fn)},beforeGetHtml:function(fn){return this.handler("beforeGetHtml",fn)},beforeSetHtml:function(fn){return this.handler("beforeSetHtml",fn)},afterSetHtml:function(fn){return this.handler("afterSetHtml",fn)},create:function(){var self=this,fullscreenMode=self.fullscreenMode;if(self.isCreated){return self}if(self.srcElement.data("kindeditor")){return self}self.srcElement.data("kindeditor","true");if(fullscreenMode){_docElement().style.overflow="hidden"}else{_docElement().style.overflow=""}var width=fullscreenMode?_docElement().clientWidth+"px":self.width,height=fullscreenMode?_docElement().clientHeight+"px":self.height;if(_IE&&_V<8||_QUIRKS){height=_addUnit(_removeUnit(height)+2)}var container=self.container=K(self.layout);if(fullscreenMode){K(document.body).append(container)}else{self.srcElement.before(container)}var toolbarDiv=K(".toolbar",container),editDiv=K(".edit",container),statusbar=self.statusbar=K(".statusbar",container);container.removeClass("container").addClass("ke-container ke-container-"+self.themeType).css("width",width);if(fullscreenMode){container.css({position:"absolute",left:0,top:0,"z-index":811211});if(!_GECKO){self._scrollPos=_getScrollPos()}window.scrollTo(0,0);K(document.body).css({height:"1px",overflow:"hidden"});K(document.body.parentNode).css("overflow","hidden");self._fullscreenExecuted=true}else{if(self._fullscreenExecuted){K(document.body).css({height:"",overflow:""});K(document.body.parentNode).css("overflow","")}if(self._scrollPos){window.scrollTo(self._scrollPos.x,self._scrollPos.y)}}var htmlList=[];K.each(self.items,function(i,name){if(name=="|"){htmlList.push('<span class="ke-inline-block ke-separator"></span>')}else if(name=="/"){htmlList.push('<div class="ke-hr"></div>')}else{htmlList.push('<span class="ke-outline" data-name="'+name+'" title="'+self.lang(name)+'" unselectable="on">');htmlList.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-'+name+'" unselectable="on"></span></span>')}});var toolbar=self.toolbar=_toolbar({src:toolbarDiv,html:htmlList.join(""),noDisableItems:self.noDisableItems,click:function(e,name){e.stop();if(self.menu){var menuName=self.menu.name;self.hideMenu();if(menuName===name){return}}self.clickToolbar(name)}});var editHeight=_removeUnit(height)-toolbar.div.height();var edit=self.edit=_edit({height:editHeight>0&&_removeUnit(height)>self.minHeight?editHeight:self.minHeight,src:editDiv,srcElement:self.srcElement,designMode:self.designMode,themesPath:self.themesPath,bodyClass:self.bodyClass,cssPath:self.cssPath,jsPath:self.jsPath,showHelpGrid:self.showHelpGrid,cssData:self.cssData,beforeGetHtml:function(html){html=self.beforeGetHtml(html);html=_removeBookmarkTag(_removeTempTag(html));return _formatHtml(html,self.filterMode?self.htmlTags:null,self.urlType,self.wellFormatMode,self.indentChar)},beforeSetHtml:function(html){html=_formatHtml(html,self.filterMode?self.htmlTags:null,"",false);return self.beforeSetHtml(html)},afterSetHtml:function(){self.edit=edit=this;self.afterSetHtml()},afterCreate:function(){self.edit=edit=this;self.cmd=edit.cmd;self._docMousedownFn=function(e){if(self.menu){self.hideMenu()}};K(edit.doc,document).mousedown(self._docMousedownFn);_bindContextmenuEvent.call(self);_bindNewlineEvent.call(self);_bindTabEvent.call(self);_bindFocusEvent.call(self);edit.afterChange(function(e){if(!edit.designMode){return}self.updateState();self.addBookmark();if(self.options.afterChange){self.options.afterChange.call(self)}});edit.textarea.keyup(function(e){if(!e.ctrlKey&&!e.altKey&&_INPUT_KEY_MAP[e.which]){if(self.options.afterChange){self.options.afterChange.call(self)}}});if(self.readonlyMode){self.readonly()}self.isCreated=true;if(self.initContent===""){self.initContent=self.html()}if(self._undoStack.length>0){var prev=self._undoStack.pop();if(prev.start){self.html(prev.html);edit.cmd.range.moveToBookmark(prev);self.select()}}self.afterCreate();if(self.options.afterCreate){self.options.afterCreate.call(self)}}});statusbar.removeClass("statusbar").addClass("ke-statusbar").append('<span class="ke-inline-block ke-statusbar-center-icon"></span>').append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');if(self._fullscreenResizeHandler){K(window).unbind("resize",self._fullscreenResizeHandler);self._fullscreenResizeHandler=null}function initResize(){if(statusbar.height()===0){setTimeout(initResize,100);return}self.resize(width,height,false)}initResize();if(fullscreenMode){self._fullscreenResizeHandler=function(e){if(self.isCreated){self.resize(_docElement().clientWidth,_docElement().clientHeight,false)}};K(window).bind("resize",self._fullscreenResizeHandler);toolbar.select("fullscreen");statusbar.first().css("visibility","hidden");statusbar.last().css("visibility","hidden")}else{if(_GECKO){K(window).bind("scroll",function(e){self._scrollPos=_getScrollPos()})}if(self.resizeType>0){_drag({moveEl:container,clickEl:statusbar,moveFn:function(x,y,width,height,diffX,diffY){height+=diffY;self.resize(null,height)}})}else{statusbar.first().css("visibility","hidden")}if(self.resizeType===2){_drag({moveEl:container,clickEl:statusbar.last(),moveFn:function(x,y,width,height,diffX,diffY){width+=diffX;height+=diffY;self.resize(width,height)}})}else{statusbar.last().css("visibility","hidden")}}return self},remove:function(){var self=this;if(!self.isCreated){return self}self.beforeRemove();self.srcElement.data("kindeditor","");if(self.menu){self.hideMenu()}_each(self.dialogs,function(){self.hideDialog()});K(document).unbind("mousedown",self._docMousedownFn);self.toolbar.remove();self.edit.remove();self.statusbar.last().unbind();self.statusbar.unbind();self.container.remove();self.container=self.toolbar=self.edit=self.menu=null;self.dialogs=[];self.isCreated=false;return self},resize:function(width,height,updateProp){var self=this;updateProp=_undef(updateProp,true);if(width){if(!/%/.test(width)){width=_removeUnit(width);width=width<self.minWidth?self.minWidth:width}self.container.css("width",_addUnit(width));if(updateProp){self.width=_addUnit(width)}}if(height){height=_removeUnit(height);var editHeight=_removeUnit(height)-self.toolbar.div.height()-self.statusbar.height();editHeight=editHeight<self.minHeight?self.minHeight:editHeight;self.edit.setHeight(editHeight);if(updateProp){self.height=_addUnit(height)}}return self},select:function(){this.isCreated&&this.cmd.select();return this},html:function(val){var self=this;if(val===undefined){return self.isCreated?self.edit.html():_elementVal(self.srcElement)}self.isCreated?self.edit.html(val):_elementVal(self.srcElement,val);if(self.isCreated){self.cmd.selection()}return self},fullHtml:function(){return this.isCreated?this.edit.html(undefined,true):""},text:function(val){var self=this;if(val===undefined){return _trim(self.html().replace(/<(?!img|embed).*?>/gi,"").replace(/&nbsp;/gi," "))}else{return self.html(_escape(val))}},isEmpty:function(){return _trim(this.text().replace(/\r\n|\n|\r/,""))===""},isDirty:function(){return _trim(this.initContent.replace(/\r\n|\n|\r|t/g,""))!==_trim(this.html().replace(/\r\n|\n|\r|t/g,""))},selectedHtml:function(){var val=this.isCreated?this.cmd.range.html():"";val=_removeBookmarkTag(_removeTempTag(val));return val},count:function(mode){var self=this;mode=(mode||"html").toLowerCase();if(mode==="html"){return self.html().length}if(mode==="text"){return self.text().replace(/<(?:img|embed).*?>/gi,"K").replace(/\r\n|\n|\r/g,"").length}return 0},exec:function(key){key=key.toLowerCase();var self=this,cmd=self.cmd,changeFlag=_inArray(key,"selectall,copy,paste,print".split(","))<0;if(changeFlag){self.addBookmark(false)}cmd[key].apply(cmd,_toArray(arguments,1));if(changeFlag){self.updateState();self.addBookmark(false);if(self.options.afterChange){self.options.afterChange.call(self)}}return self},insertHtml:function(val,quickMode){if(!this.isCreated){return this}val=this.beforeSetHtml(val);this.exec("inserthtml",val,quickMode);return this},appendHtml:function(val){this.html(this.html()+val);if(this.isCreated){var cmd=this.cmd;cmd.range.selectNodeContents(cmd.doc.body).collapse(false);cmd.select()}return this},sync:function(){_elementVal(this.srcElement,this.html());return this},focus:function(){this.isCreated?this.edit.focus():this.srcElement[0].focus();return this},blur:function(){this.isCreated?this.edit.blur():this.srcElement[0].blur();return this},addBookmark:function(checkSize){checkSize=_undef(checkSize,true);var self=this,edit=self.edit,body=edit.doc.body,html=_removeTempTag(body.innerHTML),bookmark;if(checkSize&&self._undoStack.length>0){var prev=self._undoStack[self._undoStack.length-1];if(Math.abs(html.length-_removeBookmarkTag(prev.html).length)<self.minChangeSize){return self}}if(edit.designMode&&!self._firstAddBookmark){var range=self.cmd.range;bookmark=range.createBookmark(true);bookmark.html=_removeTempTag(body.innerHTML);range.moveToBookmark(bookmark)}else{bookmark={html:html}}self._firstAddBookmark=false;_addBookmarkToStack(self._undoStack,bookmark);return self},undo:function(){return _undoToRedo.call(this,this._undoStack,this._redoStack)},redo:function(){return _undoToRedo.call(this,this._redoStack,this._undoStack)},fullscreen:function(bool){this.fullscreenMode=bool===undefined?!this.fullscreenMode:bool;this.addBookmark(false);return this.remove().create()},readonly:function(isReadonly){isReadonly=_undef(isReadonly,true);var self=this,edit=self.edit,doc=edit.doc;if(self.designMode){self.toolbar.disableAll(isReadonly,[])}else{_each(self.noDisableItems,function(){self.toolbar[isReadonly?"disable":"enable"](this)})}if(_IE){doc.body.contentEditable=!isReadonly}else{doc.designMode=isReadonly?"off":"on"}edit.textarea[0].disabled=isReadonly},createMenu:function(options){var self=this,name=options.name,knode=self.toolbar.get(name),pos=knode.pos();options.x=pos.x;options.y=pos.y+knode.height();options.z=self.options.zIndex;options.shadowMode=_undef(options.shadowMode,self.shadowMode);if(options.selectedColor!==undefined){options.cls="ke-colorpicker-"+self.themeType;options.noColor=self.lang("noColor");self.menu=_colorpicker(options)}else{options.cls="ke-menu-"+self.themeType;options.centerLineMode=false;self.menu=_menu(options)}return self.menu},hideMenu:function(){this.menu.remove();this.menu=null;return this},hideContextmenu:function(){this.contextmenu.remove();this.contextmenu=null;return this},createDialog:function(options){var self=this;options.z=self.options.zIndex;options.shadowMode=_undef(options.shadowMode,self.shadowMode);options.closeBtn=_undef(options.closeBtn,{name:self.lang("close"),click:function(e){self.hideDialog();if(_IE&&self.cmd){self.cmd.select()}}});options.noBtn=_undef(options.noBtn,{name:self.lang(options.yesBtn?"no":"close"),click:function(e){self.hideDialog();if(_IE&&self.cmd){self.cmd.select()}}});if(self.dialogAlignType!="page"){options.alignEl=self.container}options.cls="ke-dialog-"+self.themeType;if(self.dialogs.length>0){var firstDialog=self.dialogs[0],parentDialog=self.dialogs[self.dialogs.length-1];firstDialog.setMaskIndex(parentDialog.z+2);options.z=parentDialog.z+3;options.showMask=false}var dialog=_dialog(options);self.dialogs.push(dialog);return dialog},hideDialog:function(){var self=this;if(self.dialogs.length>0){self.dialogs.pop().remove()}if(self.dialogs.length>0){var firstDialog=self.dialogs[0],parentDialog=self.dialogs[self.dialogs.length-1];firstDialog.setMaskIndex(parentDialog.z-1)}return self},errorDialog:function(html){var self=this;var dialog=self.createDialog({width:750,title:self.lang("uploadError"),body:'<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'});var iframe=K("iframe",dialog.div),doc=K.iframeDoc(iframe);doc.open();doc.write(html);doc.close();K(doc.body).css("background-color","#FFF");iframe[0].contentWindow.focus();return self}};function _editor(options){return new KEditor(options)}var _instances=[];function _create(expr,options){options=options||{};options.basePath=_undef(options.basePath,K.basePath);options.themesPath=_undef(options.themesPath,options.basePath+"themes/");options.langPath=_undef(options.langPath,options.basePath+"lang/");options.pluginsPath=_undef(options.pluginsPath,options.basePath+"plugins/");if(typeof options.errorMsgHandler=="function"){K.options.errorMsgHandler=options.errorMsgHandler}if(_undef(options.loadStyleMode,K.options.loadStyleMode)){var themeType=_undef(options.themeType,K.options.themeType);_loadStyle(options.themesPath+themeType+"/editor.min.css")}function create(editor){_each(_plugins,function(name,fn){if(_isFunction(fn)){fn.call(editor,KindEditor);if(!editor._pluginStatus){editor._pluginStatus={}}editor._pluginStatus[name]="inited"}});return editor.create()}var knode=K(expr);if(!knode||knode.length===0){return}if(knode.length>1){knode.each(function(){_create(this,options)});return _instances[0]}options.srcElement=knode[0];var editor=new KEditor(options);_instances.push(editor);if(_language[editor.langType]){return create(editor)}_loadScript(editor.langPath+editor.langType+".js?ver="+encodeURIComponent(K.DEBUG?_TIME:_VERSION),function(){create(editor)});return editor}function _eachEditor(expr,fn){K(expr).each(function(i,el){K.each(_instances,function(j,editor){if(editor&&editor.srcElement[0]==el){fn.call(editor,j);return false}})})}K.remove=function(expr){_eachEditor(expr,function(i){this.remove();_instances.splice(i,1)})};K.sync=function(expr){_eachEditor(expr,function(){this.sync()})};K.html=function(expr,val){_eachEditor(expr,function(){this.html(val)})};K.insertHtml=function(expr,val){_eachEditor(expr,function(){this.insertHtml(val)})};K.appendHtml=function(expr,val){_eachEditor(expr,function(){this.appendHtml(val)})};if(_IE&&_V<7){_nativeCommand(document,"BackgroundImageCache",true)}K.EditorClass=KEditor;K.editor=_editor;K.create=_create;K.instances=_instances;K.plugin=_plugin;K.lang=_lang;_plugin("core",function(K){var self=this,shortcutKeys={undo:"Z",redo:"Y",bold:"B",italic:"I",underline:"U",print:"P",selectall:"A"};self.afterSetHtml(function(){if(self.options.afterChange){self.options.afterChange.call(self)}});self.afterCreate(function(){if(self.syncType!="form"){return}var el=K(self.srcElement),hasForm=false;while(el=el.parent()){if(el.name=="form"){hasForm=true;break}}if(hasForm){el.bind("submit",function(e){self.sync();K(window).bind("unload",function(){self.edit.textarea.remove()})});var resetBtn=K('[type="reset"]',el);resetBtn.click(function(){self.html(self.initContent);self.cmd.selection()});self.beforeRemove(function(){el.unbind();resetBtn.unbind()})}});self.clickToolbar("source",function(){if(self.edit.designMode){self.toolbar.disableAll(true);self.edit.design(false);self.toolbar.select("source")}else{self.toolbar.disableAll(false);self.edit.design(true);self.toolbar.unselect("source");if(_GECKO){setTimeout(function(){self.cmd.selection()},0)}else{self.cmd.selection()}}self.designMode=self.edit.designMode});self.afterCreate(function(){if(!self.designMode){self.toolbar.disableAll(true).select("source")}});self.clickToolbar("fullscreen",function(){self.fullscreen()});if(self.fullscreenShortcut){var loaded=false;self.afterCreate(function(){K(self.edit.doc,self.edit.textarea).keyup(function(e){if(e.which==27){setTimeout(function(){self.fullscreen()},0)}});if(loaded){if(_IE&&!self.designMode){return}self.focus()}if(!loaded){loaded=true}})}_each("undo,redo".split(","),function(i,name){if(shortcutKeys[name]){self.afterCreate(function(){_ctrl(this.edit.doc,shortcutKeys[name],function(){self.clickToolbar(name)})})}self.clickToolbar(name,function(){self[name]()})});self.clickToolbar("formatblock",function(){var blocks=self.lang("formatblock.formatBlock"),heights={h1:28,h2:24,h3:18,H4:14,p:12},curVal=self.cmd.val("formatblock"),menu=self.createMenu({name:"formatblock",width:self.langType=="en"?200:150});_each(blocks,function(key,val){var style="font-size:"+heights[key]+"px;";if(key.charAt(0)==="h"){style+="font-weight:bold;"}menu.addItem({title:'<span style="'+style+'" unselectable="on">'+val+"</span>",height:heights[key]+12,checked:curVal===key||curVal===val,click:function(){self.select().exec("formatblock","<"+key+">").hideMenu()}})})});self.clickToolbar("fontname",function(){var curVal=self.cmd.val("fontname"),menu=self.createMenu({name:"fontname",width:150});console;_each(self.lang("fontname.fontName"),function(key,val){menu.addItem({title:'<span style="font-family: '+key+';" unselectable="on">'+val+"</span>",checked:curVal===key.toLowerCase()||curVal===val.toLowerCase(),click:function(){self.exec("fontname",key).hideMenu()}})})});self.clickToolbar("fontsize",function(){var curVal=self.cmd.val("fontsize"),menu=self.createMenu({name:"fontsize",width:150});_each(self.fontSizeTable,function(i,val){menu.addItem({title:'<span style="font-size:'+val+';" unselectable="on">'+val+"</span>",height:_removeUnit(val)+12,checked:curVal===val,click:function(){self.exec("fontsize",val).hideMenu()}})})});_each("forecolor,hilitecolor".split(","),function(i,name){self.clickToolbar(name,function(){self.createMenu({name:name,selectedColor:self.cmd.val(name)||"default",colors:self.colorTable,click:function(color){self.exec(name,color).hideMenu()}})})});_each("cut,copy,paste".split(","),function(i,name){self.clickToolbar(name,function(){self.focus();try{self.exec(name,null)}catch(e){K.options.errorMsgHandler(self.lang(name+"Error"),"error")}})});self.clickToolbar("about",function(){var html='<div style="margin:20px;">'+"<div>NKeditor "+_VERSION+"</div>"+'<div>Forked from KindEditor By BlackFox. <a href="http://git.oschina.net/blackfox/kindeditor">Git项目地址</a>.</div>'+"</div>";self.createDialog({name:"about",width:350,title:self.lang("about"),body:html})});self.plugin.getSelectedLink=function(){return self.cmd.commonAncestor("a")};self.plugin.getSelectedImage=function(){return _getImageFromRange(self.edit.cmd.range,function(img){return!/^ke-\w+$/i.test(img[0].className)})};self.plugin.getSelectedFlash=function(){return _getImageFromRange(self.edit.cmd.range,function(img){return img[0].className=="ke-flash"})};self.plugin.getSelectedMedia=function(){return _getImageFromRange(self.edit.cmd.range,function(img){return img[0].className=="ke-media"||img[0].className=="ke-rm"})};self.plugin.getSelectedAnchor=function(){return _getImageFromRange(self.edit.cmd.range,function(img){return img[0].className=="ke-anchor"})};_each("link,image,flash,media,anchor".split(","),function(i,name){var uName=name.charAt(0).toUpperCase()+name.substr(1);_each("edit,delete".split(","),function(j,val){self.addContextmenu({title:self.lang(val+uName),click:function(){self.loadPlugin(name,function(){self.plugin[name][val]();self.hideMenu()})},cond:self.plugin["getSelected"+uName],width:150,iconClass:val=="edit"?"ke-icon-"+name:undefined})});self.addContextmenu({title:"-"})});self.plugin.getSelectedTable=function(){return self.cmd.commonAncestor("table")};self.plugin.getSelectedRow=function(){return self.cmd.commonAncestor("tr")};self.plugin.getSelectedCell=function(){return self.cmd.commonAncestor("td")};_each(("prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,"+"rowsplit,colsplit,coldelete,rowdelete,insert,delete").split(","),function(i,val){var cond=_inArray(val,["prop","delete"])<0?self.plugin.getSelectedCell:self.plugin.getSelectedTable;self.addContextmenu({title:self.lang("table"+val),click:function(){self.loadPlugin("table",function(){self.plugin.table[val]();self.hideMenu()})},cond:cond,width:170,iconClass:"ke-icon-table"+val})});self.addContextmenu({title:"-"});_each(("selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,"+"insertunorderedlist,indent,outdent,subscript,superscript,hr,print,"+"bold,italic,underline,strikethrough,removeformat,unlink").split(","),function(i,name){if(shortcutKeys[name]){self.afterCreate(function(){_ctrl(this.edit.doc,shortcutKeys[name],function(){self.cmd.selection();self.clickToolbar(name)})})}self.clickToolbar(name,function(){self.focus().exec(name,null)})});self.afterCreate(function(){var doc=self.edit.doc,cmd,bookmark,div,cls="__kindeditor_paste__",pasting=false;function movePastedData(){cmd.range.moveToBookmark(bookmark);cmd.select();if(_WEBKIT){K("div."+cls,div).each(function(){K(this).after("<br />").remove(true)});K("span.Apple-style-span",div).remove(true);K("span.Apple-tab-span",div).remove(true);K("span[style]",div).each(function(){if(K(this).css("white-space")=="nowrap"){K(this).remove(true)}});K("meta",div).remove()}var html=div[0].innerHTML;div.remove();if(html===""){return}if(_WEBKIT){html=html.replace(/(<br>)\1/gi,"$1")}if(self.pasteType===2){html=html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/gi,"");if(/schemas-microsoft-com|worddocument|mso-\w+/i.test(html)){html=_clearMsWord(html,self.filterMode?self.htmlTags:K.options.htmlTags)}else{html=_formatHtml(html,self.filterMode?self.htmlTags:null);html=self.beforeSetHtml(html)}}if(self.pasteType===1){html=html.replace(/&nbsp;/gi," ");html=html.replace(/\n\s*\n/g,"\n");html=html.replace(/<br[^>]*>/gi,"\n");html=html.replace(/<\/p><p[^>]*>/gi,"\n");html=html.replace(/<[^>]+>/g,"");html=html.replace(/ {2}/g," &nbsp;");if(self.newlineTag=="p"){if(/\n/.test(html)){html=html.replace(/^/,"<p>").replace(/$/,"<br /></p>").replace(/\n/g,"<br /></p><p>")}}else{html=html.replace(/\n/g,"<br />$&")}}self.insertHtml(html,true)}K(doc.body).bind("paste",function(e){if(self.pasteType===0){e.stop();return}if(pasting){return}pasting=true;K("div."+cls,doc).remove();cmd=self.cmd.selection();bookmark=cmd.range.createBookmark();div=K('<div class="'+cls+'"></div>',doc).css({position:"absolute",width:"1px",height:"1px",overflow:"hidden",left:"-1981px",top:K(bookmark.start).pos().y+"px","white-space":"nowrap"});K(doc.body).append(div);if(_IE){var rng=cmd.range.get(true);rng.moveToElementText(div[0]);rng.select();rng.execCommand("paste");e.preventDefault()}else{cmd.range.selectNodeContents(div[0]);cmd.select();div[0].tabIndex=-1;div[0].focus()}setTimeout(function(){movePastedData();pasting=false},0)})});self.beforeGetHtml(function(html){if(_IE&&_V<=8){html=html.replace(/<div\s+[^>]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/gi,function(full,tag){return unescape(tag)});html=html.replace(/(<input)((?:\s+[^>]*)?>)/gi,function($0,$1,$2){if(!/\s+type="[^"]+"/i.test($0)){return $1+' type="text"'+$2}return $0})}return html.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/gi,function($0,$1,$2,$3){return $1+_unescape($2).replace(/\s+/g," ")+$3}).replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/gi,function(full){var imgAttrs=_getAttrList(full);var styles=_getCssList(imgAttrs.style||"");var attrs=_mediaAttrs(imgAttrs["data-ke-tag"]);var width=_undef(styles.width,"");var height=_undef(styles.height,"");if(/px/i.test(width)){width=_removeUnit(width)}if(/px/i.test(height)){height=_removeUnit(height)}attrs.width=_undef(imgAttrs.width,width);attrs.height=_undef(imgAttrs.height,height);return _mediaEmbed(attrs)}).replace(/<img[^>]*class="?ke-anchor"?[^>]*>/gi,function(full){var imgAttrs=_getAttrList(full);return'<a name="'+unescape(imgAttrs["data-ke-name"])+'"></a>'}).replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/gi,function(full,attr,code){return"<script"+unescape(attr)+">"+unescape(code)+"<\/script>"}).replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/gi,function(full,attr,code){return"<noscript"+unescape(attr)+">"+unescape(code)+"</noscript>"}).replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/gi,function(full,start,src,end){full=full.replace(/(\s+(?:href|src)=")[^"]*(")/i,function($0,$1,$2){return $1+_unescape(src)+$2});full=full.replace(/\s+data-ke-src="[^"]*"/i,"");return full}).replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/gi,function(full,start,end){return start+end})});self.beforeSetHtml(function(html){if(_IE&&_V<=8){html=html.replace(/<input[^>]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/gi,function(full){var attrs=_getAttrList(full);var styles=_getCssList(attrs.style||"");if(styles.display=="none"){return'<div class="ke-display-none" data-ke-input-tag="'+escape(full)+'"></div>'}return full})}return html.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/gi,function(full){var attrs=_getAttrList(full);attrs.src=_undef(attrs.src,"");attrs.width=_undef(attrs.width,0);attrs.height=_undef(attrs.height,0);return _mediaImg(self.themesPath+"common/blank.gif",attrs)}).replace(/<video[^>]*type="([^"]+)"[^>]*>(?:<\/video>)?/gi,function(full){var attrs=_getAttrList(full);attrs.src=_undef(attrs.src,"");attrs.width=_undef(attrs.width,0);attrs.height=_undef(attrs.height,0);return _mediaImg(self.themesPath+"common/blank.gif",attrs)}).replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/gi,function(full){var attrs=_getAttrList(full);if(attrs.href!==undefined){return full}return'<img class="ke-anchor" src="'+self.themesPath+'common/anchor.gif" data-ke-name="'+escape(attrs.name)+'" />'}).replace(/<script([^>]*)>([\s\S]*?)<\/script>/gi,function(full,attr,code){return'<div class="ke-script" data-ke-script-attr="'+escape(attr)+'">'+escape(code)+"</div>"}).replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/gi,function(full,attr,code){return'<div class="ke-noscript" data-ke-noscript-attr="'+escape(attr)+'">'+escape(code)+"</div>"}).replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/gi,function(full,start,key,src,end){if(full.match(/\sdata-ke-src="[^"]*"/i)){return full}full=start+key+'="'+src+'"'+' data-ke-src="'+_escape(src)+'"'+end;return full}).replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/gi,function(full,start,end){return start+"data-ke-"+end}).replace(/<table[^>]*\s+border="0"[^>]*>/gi,function(full){if(full.indexOf("ke-zeroborder")>=0){return full}return _addClassToTag(full,"ke-zeroborder")})})})})(window);KindEditor.lang({source:"HTML代码",preview:"预览",undo:"后退(Ctrl+Z)",redo:"前进(Ctrl+Y)",cut:"剪切(Ctrl+X)",copy:"复制(Ctrl+C)",paste:"粘贴(Ctrl+V)",plainpaste:"粘贴为无格式文本",wordpaste:"从Word粘贴",selectall:"全选(Ctrl+A)",justifyleft:"左对齐",justifycenter:"居中",justifyright:"右对齐",justifyfull:"两端对齐",insertorderedlist:"编号",insertunorderedlist:"项目符号",indent:"增加缩进",outdent:"减少缩进",subscript:"下标",superscript:"上标",formatblock:"段落",fontname:"字体",fontsize:"文字大小",forecolor:"文字颜色",hilitecolor:"文字背景",bold:"粗体(Ctrl+B)",italic:"斜体(Ctrl+I)",underline:"下划线(Ctrl+U)",strikethrough:"删除线",removeformat:"删除格式",image:"图片",multiimage:"批量图片上传",graft:"涂鸦",flash:"Flash",media:"视音频",table:"表格",tablecell:"单元格",hr:"插入横线",emoticons:"插入表情",link:"超级链接",unlink:"取消超级链接",fullscreen:"全屏显示",about:"关于",print:"打印(Ctrl+P)",filemanager:"文件空间",code:"插入程序代码",quote:"插入引用",map:"Google地图",baidumap:"百度地图",lineheight:"行距",clearhtml:"清理HTML代码",pagebreak:"插入分页符",quickformat:"一键排版",insertfile:"插入文件",template:"插入模板",anchor:"锚点",yes:"确定",no:"取消",close:"关闭",editImage:"图片属性",deleteImage:"删除图片",editFlash:"Flash属性",deleteFlash:"删除Flash",editMedia:"视音频属性",deleteMedia:"删除视音频",editLink:"超级链接属性",deleteLink:"取消超级链接",editAnchor:"锚点属性",deleteAnchor:"删除锚点",tableprop:"表格属性",tablecellprop:"单元格属性",tableinsert:"插入表格",tabledelete:"删除表格",tablecolinsertleft:"左侧插入列",tablecolinsertright:"右侧插入列",tablerowinsertabove:"上方插入行",tablerowinsertbelow:"下方插入行",tablerowmerge:"向下合并单元格",tablecolmerge:"向右合并单元格",tablerowsplit:"拆分行",tablecolsplit:"拆分列",tablecoldelete:"删除列",tablerowdelete:"删除行",noColor:"无颜色",pleaseSelectFile:"请选择文件。",invalidImg:"请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。",invalidMedia:"请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",invalidWidth:"宽度必须为数字。",invalidHeight:"高度必须为数字。",invalidBorder:"边框必须为数字。",invalidUrl:"请输入有效的URL地址。",invalidRows:"行数为必选项,只允许输入大于0的数字。",invalidCols:"列数为必选项,只允许输入大于0的数字。",invalidPadding:"边距必须为数字。",invalidSpacing:"间距必须为数字。",invalidJson:"服务器发生故障。",uploadSuccess:"上传成功。",cutError:"您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。",copyError:"您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。",pasteError:"您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。",ajaxLoading:"加载中,请稍候 ...",uploadLoading:"上传中,请稍候 ...",uploadError:"上传错误","plainpaste.comment":"请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。","wordpaste.comment":"请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。","code.pleaseInput":"请输入程序代码。","link.url":"URL","link.linkType":"打开类型","link.newWindow":"新窗口","link.selfWindow":"当前窗口","flash.url":"URL","flash.width":"宽度","flash.height":"高度","flash.upload":"上传","flash.viewServer":"文件空间","media.url":"URL","media.width":"宽度","media.height":"高度","media.autostart":"自动播放","media.upload":"上传","media.viewServer":"文件空间","image.remoteImage":"网络图片","image.localImage":"本地上传","image.remoteUrl":"图片地址","image.localUrl":"上传文件","image.size":"图片大小","image.width":"宽","image.height":"高","image.resetSize":"重置大小","image.align":"对齐方式","image.defaultAlign":"默认方式","image.leftAlign":"左对齐","image.rightAlign":"右对齐","image.imgTitle":"图片说明","image.upload":"浏览...","image.viewServer":"图片空间","multiimage.title":"多图上传","multiimage.uploadDesc":"共选择了 <%=numSelect%> 张图片,共 <%=totalSize%>, 还可以添加 <%=numLeft%> 张图片.","multiimage.startUpload":"开始上传","multiimage.noListUrl":"无法获取图片,请先配置 fileManagerJson.","multiimage.noSearchUrl":"无法进行图片搜索,请先配置 imageSearchJson.","multiimage.noDataText":"(⊙o⊙)亲,没有多数据了。","multiimage.closeText":"关闭对话框","multiimage.confirmBtnText":"确定","multiimage.cancelBtnText":"取消","multiimage.loadMoreData":"往下拉动滚动条可以加载更多数据.","multiimage.depJQueryError":"文件管理插件依赖 jQuery, 请先引入 jQuery.","multiimage.localUpload":"本地上传","multiimage.fileServer":"文件服务器","multiimage.imgSearch":"图片搜索","multiimage.selectFile":"点击选择图片","multiimage.continueAdd":"继续添加","multiimage.searchBtn":"搜索一下","multiimage.searchPlaceholder":"请输入搜索关键词","multiimage.searchClear":"清空搜索","multiimage.noFileAdded":"请至少添加一个文件!","multiimage.uploading":"正在上传","multiimage.fileNotUpload":"您还有文件没有上传!","multiimage.uploadLimit":"您本次最多上传 <%=uploadLimit%> 个文件.","multiimage.sizeLimit":"文件大小不能超过 <%=sizeLimit%> KB.","multiimage.invalidExt":"非法的文件后缀 <%=invalidExt%>.","multiimage.remove":"删除","multiimage.rotateRight":"向右旋转","multiimage.rotateLeft":"向左旋转","multiimage.uploadFail":"发生异常,上传失败!","multiimage.noFileSelected":"请至少选择一个文件或一张图片.","filemanager.noDataText":"(⊙o⊙)亲,没有多数据了。","filemanager.title":"文件服务器","filemanager.noListUrl":"无法获取图片,请先配置 fileManagerJson.","filemanager.closeText":"关闭对话框","filemanager.confirmBtnText":"确定","filemanager.cancelBtnText":"取消","filemanager.loadMoreData":"往下拉动滚动条可以加载更多数据.","filemanager.depJQueryError":"文件管理插件依赖 jQuery, 请先引入 jQuery.","filemanager.fileType":"类型","graft.btnText":"保存并插入涂鸦","graft.uploadSuccess":"涂鸦上传成功","graft.uploadFaild":"涂鸦上传失败","graft.empty":"您没有在画布上绘制任何图像","insertfile.url":"URL","insertfile.title":"文件说明","insertfile.upload":"上传","insertfile.viewServer":"文件空间","table.cells":"单元格数","table.rows":"行数","table.cols":"列数","table.size":"大小","table.width":"宽度","table.height":"高度","table.percent":"%","table.px":"px","table.space":"边距间距","table.padding":"边距","table.spacing":"间距","table.align":"对齐方式","table.textAlign":"水平对齐","table.verticalAlign":"垂直对齐","table.alignDefault":"默认","table.alignLeft":"左对齐","table.alignCenter":"居中","table.alignRight":"右对齐","table.alignTop":"顶部","table.alignMiddle":"中部","table.alignBottom":"底部","table.alignBaseline":"基线","table.border":"边框","table.borderWidth":"宽度","table.borderColor":"颜色","table.backgroundColor":"背景颜色","map.address":"地址: ","map.search":"搜索","baidumap.address":"地址: ","baidumap.search":"搜索","baidumap.insertDynamicMap":"插入动态地图","anchor.name":"锚点名称","formatblock.formatBlock":{h1:"标题 1",h2:"标题 2",h3:"标题 3",h4:"标题 4",p:"正 文"},"fontname.fontName":{SimSun:"宋体",NSimSun:"新宋体",FangSong:"仿宋",KaiTi:"楷体",SimHei:"黑体","Microsoft YaHei":"微软雅黑",Arial:"Arial","Arial Black":"Arial Black","Times New Roman":"Times New Roman","Courier New":"Courier New",Tahoma:"Tahoma",Verdana:"Verdana"},"lineheight.lineHeight":[{1:"单倍行距"},{1.5:"1.5倍行距"},{2:"2倍行距"},{2.5:"2.5倍行距"},{3:"3倍行距"}],"template.selectTemplate":"可选模板","template.replaceContent":"替换当前内容","template.fileList":{"1.html":"图片和文字","2.html":"表格","3.html":"项目编号"}},"zh-CN");KindEditor.options.langType="zh-CN";KindEditor.plugin("anchor",function(K){var self=this,name="anchor",lang=self.lang(name+".");self.plugin.anchor={edit:function(){var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keName">'+lang.name+":</label>",'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',"</div>","</div>"].join("");var dialog=self.createDialog({name:name,width:300,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){self.insertHtml('<a name="'+nameBox.val()+'">').hideDialog().focus()}}});var div=dialog.div,nameBox=K('input[name="name"]',div);var img=self.plugin.getSelectedAnchor();if(img){nameBox.val(unescape(img.attr("data-ke-name")))}nameBox[0].focus();nameBox[0].select()},delete:function(){self.plugin.getSelectedAnchor().remove()}};self.clickToolbar(name,self.plugin.anchor.edit)});KindEditor.plugin("autoheight",function(K){var self=this;if(!self.autoHeightMode){return}var minHeight;function hideScroll(){var edit=self.edit;var body=edit.doc.body;edit.iframe[0].scroll="no";body.style.overflowY="hidden"}function resetHeight(){if(self.fullscreenMode){return}var edit=self.edit;var body=edit.doc.body;edit.iframe.height(minHeight);self.resize(null,Math.max((K.IE?body.scrollHeight:body.offsetHeight)+76,minHeight))}function init(){minHeight=K.removeUnit(self.height);self.edit.afterChange(resetHeight);if(!self.fullscreenMode){hideScroll()}resetHeight()}if(self.isCreated){init()}else{self.afterCreate(init)}});KindEditor.plugin("baidumap",function(K){var self=this,name="baidumap",lang=self.lang(name+".");var mapWidth=K.undef(self.mapWidth,558);var mapHeight=K.undef(self.mapHeight,360);self.clickToolbar(name,function(){var html=['<div class="ke-dialog-content-inner" style="padding-top: 0">','<div class="ke-dialog-row ke-clearfix">','<div class="ke-header">'+lang.address,'<input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',"<span>",'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="'+lang.search+'" style="line-height:22px;padding:0 10px;" />',"</span>",'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" style="display:inline-block;" /> <label for="keInsertDynamicMap">'+lang.insertDynamicMap+"</label>","</div>","</div>",'<div class="ke-map" style="width:'+mapWidth+"px;height:"+mapHeight+'px;"></div>',"</div>"].join("");var dialog=self.createDialog({name:name,width:mapWidth+42,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var map=win.map;var centerObj=map.getCenter();var center=centerObj.lng+","+centerObj.lat;var zoom=map.getZoom();var url=[checkbox[0].checked?self.pluginsPath+"baidumap/index.html":"https://api.map.baidu.com/staticimage","?center="+encodeURIComponent(center),"&zoom="+encodeURIComponent(zoom),"&width="+mapWidth,"&height="+mapHeight,"&markers="+encodeURIComponent(center),"&markerStyles="+encodeURIComponent("l,A")].join("");if(checkbox[0].checked){self.insertHtml('<iframe src="'+url+'" frameborder="0" style="width:'+(mapWidth+2)+"px;height:"+(mapHeight+2)+'px;"></iframe>')}else{self.exec("insertimage",url)}self.hideDialog().focus()}},beforeRemove:function(){searchBtn.remove();if(doc){doc.write("")}iframe.remove()}});var div=dialog.div,addressBox=K('[name="address"]',div),searchBtn=K('[name="searchBtn"]',div),checkbox=K('[name="insertDynamicMap"]',dialog.div),win,doc;var iframe=K('<iframe class="ke-textarea" frameborder="0" src="'+self.pluginsPath+'baidumap/map.html" style="width:'+mapWidth+"px;height:"+mapHeight+'px;"></iframe>');function ready(){win=iframe[0].contentWindow;doc=K.iframeDoc(iframe)}iframe.bind("load",function(){iframe.unbind("load");if(K.IE){ready()}else{setTimeout(ready,0)}});K(".ke-map",div).replaceWith(iframe);searchBtn.click(function(){win.search(addressBox.val())})})});KindEditor.plugin("map",function(K){var self=this,name="map",lang=self.lang(name+".");self.clickToolbar(name,function(){var html=['<div style="padding:10px 20px;">','<div class="ke-dialog-row">',lang.address+' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ','<span class="ke-button-common ke-button-outer">','<input type="button" name="searchBtn" class="ke-button-common ke-button" value="'+lang.search+'" />',"</span>","</div>",'<div class="ke-map" style="width:558px;height:360px;"></div>',"</div>"].join("");var dialog=self.createDialog({name:name,width:600,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var geocoder=win.geocoder,map=win.map,center=map.getCenter().lat()+","+map.getCenter().lng(),zoom=map.getZoom(),maptype=map.getMapTypeId(),url="https://maps.googleapis.com/maps/api/staticmap";url+="?center="+encodeURIComponent(center);url+="&zoom="+encodeURIComponent(zoom);url+="&size=558x360";url+="&maptype="+encodeURIComponent(maptype);url+="&markers="+encodeURIComponent(center);url+="&language="+self.langType;url+="&sensor=false";self.exec("insertimage",url).hideDialog().focus()}},beforeRemove:function(){searchBtn.remove();if(doc){doc.write("")}iframe.remove()}});var div=dialog.div,addressBox=K('[name="address"]',div),searchBtn=K('[name="searchBtn"]',div),win,doc;var iframeHtml=["<!doctype html><html><head>",'<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',"<style>","\thtml { height: 100% }","\tbody { height: 100%; margin: 0; padding: 0; background-color: #FFF }","\t#map_canvas { height: 100% }","</style>",'<script src="https://maps.googleapis.com/maps/api/js?sensor=false&language='+self.langType+'"><\/script>',"<script>","var map, geocoder;","function initialize() {","\tvar latlng = new google.maps.LatLng(31.230393, 121.473704);","\tvar options = {","\t\tzoom: 11,","\t\tcenter: latlng,","\t\tdisableDefaultUI: true,","\t\tpanControl: true,","\t\tzoomControl: true,","\t\tmapTypeControl: true,","\t\tscaleControl: true,","\t\tstreetViewControl: false,","\t\toverviewMapControl: true,","\t\tmapTypeId: google.maps.MapTypeId.ROADMAP","\t};",'\tmap = new google.maps.Map(document.getElementById("map_canvas"), options);',"\tgeocoder = new google.maps.Geocoder();","\tgeocoder.geocode({latLng: latlng}, function(results, status) {","\t\tif (status == google.maps.GeocoderStatus.OK) {","\t\t\tif (results[3]) {",'\t\t\t\tparent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',"\t\t\t}","\t\t}","\t});","}","function search(address) {","\tif (!map) return;","\tgeocoder.geocode({address : address}, function(results, status) {","\t\tif (status == google.maps.GeocoderStatus.OK) {","\t\t\tmap.setZoom(11);","\t\t\tmap.setCenter(results[0].geometry.location);","\t\t\tvar marker = new google.maps.Marker({","\t\t\t\tmap: map,","\t\t\t\tposition: results[0].geometry.location","\t\t\t});","\t\t} else {",'\t\t\talert("Invalid address: " + address);',"\t\t}","\t});","}","<\/script>","</head>",'<body onload="initialize();">','<div id="map_canvas" style="width:100%; height:100%"></div>',"</body></html>"].join("\n");var iframe=K('<iframe class="ke-textarea" frameborder="0" src="'+self.pluginsPath+'map/map.html" style="width:558px;height:360px;"></iframe>');function ready(){win=iframe[0].contentWindow;doc=K.iframeDoc(iframe)}iframe.bind("load",function(){iframe.unbind("load");if(K.IE){ready()}else{setTimeout(ready,0)}});K(".ke-map",div).replaceWith(iframe);searchBtn.click(function(){win.search(addressBox.val())})})});KindEditor.plugin("clearhtml",function(K){var self=this,name="clearhtml";self.clickToolbar(name,function(){self.focus();var html=self.html();html=html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/gi,"");html=html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/gi,"");html=K.formatHtml(html,{a:["href","target"],embed:["src","width","height","type","loop","autostart","quality",".width",".height","align","allowscriptaccess","controls"],img:["src","width","height","border","alt","title",".width",".height"],table:["border"],"td,th":["rowspan","colspan"],"div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6":[]});self.html(html);self.cmd.selection(true);self.addBookmark()})});KindEditor.plugin("code",function(K){var self=this,name="code";self.clickToolbar(name,function(){var lang=self.lang(name+"."),html=['<div style="margin: 0px 20px;">','<div class="ke-dialog-row">','<select class="ke-select" style="margin-bottom: 5px;">','<option value="javascript">JavaScript</option>','<option value="html">HTML</option>','<option value="css">CSS</option>','<option value="php">PHP</option>','<option value="perl">Perl</option>','<option value="python">Python</option>','<option value="ruby">Ruby</option>','<option value="java">Java</option>','<option value="go">Go</option>','<option value="asp">ASP/VB</option>','<option value="csharp">C#</option>','<option value="cpp">C/C++</option>','<option value="cs">C#</option>','<option value="bash">Shell</option>','<option value="sql">SQL</option>','<option value="markup">Other</option>',"</select>","</div>",'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',"</div>"].join(""),dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var type=K(".ke-select",dialog.div).val(),code=textarea.val(),cls=type===""?"":"language-"+type,html='<pre class="'+cls+'"><code>'+K.escape(code)+"</code></pre> <br/>";if(K.trim(code)===""){K.options.errorMsgHandler(lang.pleaseInput,"error");textarea[0].focus();return}self.insertHtml(html).hideDialog().focus()}}}),textarea=K("textarea",dialog.div);textarea[0].focus()})});KindEditor.plugin("emoticons",function(K){var self=this,name="emoticons",path=self.emoticonsPath||self.pluginsPath+"emoticons/images/",allowPreview=self.allowPreviewEmoticons===undefined?true:self.allowPreviewEmoticons,currentPageNum=1;self.clickToolbar(name,function(){var rows=5,cols=9,total=135,startNum=0,cells=rows*cols,pages=Math.ceil(total/cells),colsHalf=Math.floor(cols/2),wrapperDiv=K('<div class="ke-plugin-emoticons"></div>'),elements=[],menu=self.createMenu({name:name,beforeRemove:function(){removeEvent()}});menu.div.append(wrapperDiv);var previewDiv,previewImg;if(allowPreview){previewDiv=K('<div class="ke-preview"></div>').css("right",0);previewImg=K('<img class="ke-preview-img" src="'+path+startNum+'.gif" />');wrapperDiv.append(previewDiv);previewDiv.append(previewImg)}function bindCellEvent(cell,j,num){if(previewDiv){cell.mouseover(function(){if(j>colsHalf){previewDiv.css("left",0);previewDiv.css("right","")}else{previewDiv.css("left","");previewDiv.css("right",0)}previewImg.attr("src",path+num+".gif");K(this).addClass("ke-on")})}else{cell.mouseover(function(){K(this).addClass("ke-on")})}cell.mouseout(function(){K(this).removeClass("ke-on")});cell.click(function(e){self.insertHtml('<img src="'+path+num+'.gif" border="0" alt="" />').hideMenu().focus();e.stop()})}function createEmoticonsTable(pageNum,parentDiv){var table=document.createElement("table");parentDiv.append(table);if(previewDiv){K(table).mouseover(function(){previewDiv.show("block")});K(table).mouseout(function(){previewDiv.hide()});elements.push(K(table))}table.className="ke-table";table.cellPadding=0;table.cellSpacing=0;table.border=0;var num=(pageNum-1)*cells+startNum;for(var i=0;i<rows;i++){var row=table.insertRow(i);for(var j=0;j<cols;j++){var cell=K(row.insertCell(j));cell.addClass("ke-cell");bindCellEvent(cell,j,num);var span=K('<span class="ke-img"></span>').css("background-position","-"+24*num+"px 0px").css("background-image","url("+path+"static.gif)");cell.append(span);elements.push(cell);num++}}return table}var table=createEmoticonsTable(currentPageNum,wrapperDiv);function removeEvent(){K.each(elements,function(){this.unbind()})}var pageDiv;function bindPageEvent(el,pageNum){el.click(function(e){removeEvent();table.parentNode.removeChild(table);pageDiv.remove();table=createEmoticonsTable(pageNum,wrapperDiv);createPageTable(pageNum);currentPageNum=pageNum;e.stop()})}function createPageTable(currentPageNum){pageDiv=K('<div class="ke-page"></div>');wrapperDiv.append(pageDiv);for(var pageNum=1;pageNum<=pages;pageNum++){if(currentPageNum!==pageNum){var a=K('<a href="javascript:;">['+pageNum+"]</a>");bindPageEvent(a,pageNum);pageDiv.append(a);elements.push(a)}else{pageDiv.append(K("@["+pageNum+"]"))}pageDiv.append(K("@&nbsp;"))}}createPageTable(currentPageNum)})});KindEditor.plugin("flash",function(K){var self=this,name="flash",lang=self.lang(name+"."),allowFlashUpload=K.undef(self.allowFlashUpload,true),allowFileManager=K.undef(self.allowFileManager,false),formatUploadUrl=K.undef(self.formatUploadUrl,true),extraParams=K.undef(self.extraFileUploadParams,{}),filePostName=K.undef(self.filePostName,"imgFile"),uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php");self.plugin.flash={edit:function(){var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keUrl" class="row-left">'+lang.url+":</label>",'<div class="row-right">','<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+lang.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+lang.viewServer+'" />',"</span>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keWidth" class="row-left">'+lang.width+":</label>",'<div class="row-right">','<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keHeight" class="row-left">'+lang.height+":</label>",'<div class="row-right">','<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',"</div>","</div>","</div>"].join("");var dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var url=K.trim(urlBox.val()),width=widthBox.val(),height=heightBox.val();if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}var html=K.mediaImg(self.themesPath+"common/blank.gif",{src:url,type:K.mediaType(".swf"),width:width,height:height,quality:"high"});self.insertHtml(html).hideDialog().focus()}}}),div=dialog.div,urlBox=K('[name="url"]',div),viewServerBtn=K('[name="viewServer"]',div),widthBox=K('[name="width"]',div),heightBox=K('[name="height"]',div);urlBox.val("http://");if(allowFlashUpload){var callback=function(data){dialog.hideLoading();if(data.code==="000"){var url=data.data.url;if(formatUploadUrl){url=K.formatUrl(url,"absolute")}urlBox.val(url);if(self.afterUpload){self.afterUpload.call(self,url,data,name)}}else{K.options.errorMsgHandler(data.message,"error")}};var uploadbutton=K.uploadbutton({button:K(".ke-upload-button",div)[0],fieldName:filePostName,extraParams:extraParams,url:K.addParam(uploadJson,"fileType=flash"),beforeUpload:function(){if(typeof self.beforeUpload=="function"){self.beforeUpload.call(this,callback);return false}else{return true}},afterUpload:function(data){callback(data)},afterError:function(html){dialog.hideLoading();self.errorDialog(html)}});uploadbutton.fileBox.change(function(e){dialog.showLoading(self.lang("uploadLoading"));uploadbutton.submit()})}else{K(".ke-upload-button",div).hide()}if(allowFileManager){viewServerBtn.click(function(e){self.loadPlugin("filemanager",function(){self.plugin.filemanagerDialog({dirName:"flash",clickFn:function(url){K('[name="url"]',div).val(url);if(self.afterSelectFile){self.afterSelectFile.call(self,url)}}})})})}else{K('[name="url"]').css("width","250px");viewServerBtn.hide()}var img=self.plugin.getSelectedFlash();if(img){var attrs=K.mediaAttrs(img.attr("data-ke-tag"));urlBox.val(attrs.src);widthBox.val(K.removeUnit(img.css("width"))||attrs.width||0);heightBox.val(K.removeUnit(img.css("height"))||attrs.height||0)}urlBox[0].focus();urlBox[0].select()},delete:function(){self.plugin.getSelectedFlash().remove();self.addBookmark()}};self.clickToolbar(name,self.plugin.flash.edit)});KindEditor.plugin("image",function(K){var self=this,name="image",allowImageUpload=K.undef(self.allowImageUpload,true),allowImageRemote=K.undef(self.allowImageRemote,true),formatUploadUrl=K.undef(self.formatUploadUrl,true),allowFileManager=K.undef(self.allowFileManager,false),uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php"),imageTabIndex=K.undef(self.imageTabIndex,0),imgPath=self.pluginsPath+"image/images/",extraParams=K.undef(self.extraFileUploadParams,{}),filePostName=K.undef(self.filePostName,"imgFile"),fillDescAfterUploadImage=K.undef(self.fillDescAfterUploadImage,false),lang=self.lang(name+".");self.plugin.imageDialog=function(options){var imageUrl=options.imageUrl,imageWidth=K.undef(options.imageWidth,""),imageHeight=K.undef(options.imageHeight,""),imageTitle=K.undef(options.imageTitle,""),imageAlign=K.undef(options.imageAlign,""),showRemote=K.undef(options.showRemote,true),showLocal=K.undef(options.showLocal,true),tabIndex=K.undef(options.tabIndex,0),clickFn=options.clickFn;var target="kindeditor_upload_iframe_"+(new Date).getTime();var hiddenElements=[];for(var k in extraParams){hiddenElements.push('<input type="hidden" name="'+k+'" value="'+extraParams[k]+'" />')}var html=['<div class="ke-dialog-content-inner">','<div class="tabs"></div>','<div class="tab1" style="display:none;">','<div class="ke-dialog-row ke-clearfix">','<label for="remoteUrl" class="row-left">'+lang.remoteUrl+":</label>",'<div class="row-right">','<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:250px;" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+lang.viewServer+'" />',"</span>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix ">','<label for="remoteWidth" class="row-left">'+lang.size+":</label>",'<div class="row-right">'+lang.width+' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',lang.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ','<img class="ke-refresh-btn" src="'+imgPath+'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="'+lang.resetSize+'" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label class="row-left">'+lang.align+":</label>",'<div class="row-right">','<span><input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> '+'<img name="defaultImg" src="'+imgPath+'align_top.gif" width="23" height="25" alt="" /></span>',' <span><input type="radio" name="align" class="ke-inline-block" value="left" /> '+'<img name="leftImg" src="'+imgPath+'align_left.gif" width="23" height="25" alt="" /></span>',' <span><input type="radio" name="align" class="ke-inline-block" value="right" /> '+'<img name="rightImg" src="'+imgPath+'align_right.gif" width="23" height="25" alt="" /></span>',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="remoteTitle" class="row-left">'+lang.imgTitle+":</label>",'<div class="row-right">','<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:250px;" />',"</div>","</div>","</div>",'<div class="tab2" style="display:none;">','<iframe name="'+target+'" style="display:none;"></iframe>','<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="'+target+'" action="'+K.addParam(uploadJson,"fileType=image")+'">','<div class="ke-dialog-row ke-clearfix">',hiddenElements.join(""),'<label class="row-left">'+lang.localUrl+":</label>",'<div class="row-right">','<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:250px;" readonly="true" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+lang.upload+'" />',"</div>","</div>","</form>","</div>","</div>"].join("");var dialogWidth=showLocal||allowFileManager?450:400,dialogHeight=showLocal&&showRemote?310:260;var dialog=self.createDialog({name:name,width:dialogWidth,height:dialogHeight,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){if(dialog.isLoading){return}if(showLocal&&showRemote&&tabs&&tabs.selectedIndex===1||!showRemote){if(uploadbutton.fileBox.val()==""){K.options.errorMsgHandler(self.lang("pleaseSelectFile"),"error");return}dialog.showLoading(self.lang("uploadLoading"));uploadbutton.submit();localUrlBox.val("");return}var url=K.trim(urlBox.val()),width=widthBox.val(),height=heightBox.val(),title=titleBox.val(),align="";alignBox.each(function(){if(this.checked){align=this.value;return false}});if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}clickFn.call(self,url,title,width,height,0,align)}},beforeRemove:function(){viewServerBtn.unbind();widthBox.unbind();heightBox.unbind();refreshBtn.unbind()}}),div=dialog.div;var urlBox=K('[name="url"]',div),localUrlBox=K('[name="localUrl"]',div),viewServerBtn=K('[name="viewServer"]',div),widthBox=K('.tab1 [name="width"]',div),heightBox=K('.tab1 [name="height"]',div),refreshBtn=K(".ke-refresh-btn",div),titleBox=K('.tab1 [name="title"]',div),alignBox=K('.tab1 [name="align"]',div);var tabs;if(showRemote&&showLocal){tabs=K.tabs({src:K(".tabs",div),afterSelect:function(i){}});tabs.add({title:lang.remoteImage,panel:K(".tab1",div)});tabs.add({title:lang.localImage,panel:K(".tab2",div)});tabs.select(tabIndex)}else if(showRemote){K(".tab1",div).show()}else if(showLocal){K(".tab2",div).show()}var callback=function(data){if(data.code=="000"){dialog.hideLoading();var url=data.data.url;if(formatUploadUrl){url=K.formatUrl(url,"absolute")}if(!fillDescAfterUploadImage){clickFn.call(self,url,data.title,data.width,data.height,data.border,data.align)}else{K(".ke-dialog-row #remoteUrl",div).val(url);K(".ke-tabs-li",div)[0].click();K(".ke-refresh-btn",div).click()}}else{K.options.errorMsgHandler(data.message,"error")}};var uploadbutton=K.uploadbutton({button:K(".ke-upload-button",div)[0],fieldName:filePostName,form:K(".ke-form",div),target:target,width:60,beforeUpload:function(){if(typeof self.beforeUpload=="function"){self.beforeUpload.call(this,callback);return false}else{return true}},afterUpload:function(data){callback(data)},afterError:function(html){dialog.hideLoading();self.errorDialog(html)}});uploadbutton.fileBox.change(function(e){localUrlBox.val(uploadbutton.fileBox.val())});if(allowFileManager){viewServerBtn.click(function(e){self.loadPlugin("filemanager",function(){self.plugin.filemanagerDialog({dirName:"image",clickFn:function(url){K('[name="url"]',div).val(url);if(self.afterSelectFile){self.afterSelectFile.call(self,url)}}})})})}else{viewServerBtn.hide()}var originalWidth=0,originalHeight=0;function setSize(width,height){widthBox.val(width);heightBox.val(height);originalWidth=width;originalHeight=height}refreshBtn.click(function(e){var tempImg=K('<img src="'+urlBox.val()+'" />',document).css({position:"absolute",visibility:"hidden",top:0,left:"-1000px"});tempImg.bind("load",function(){setSize(tempImg.width(),tempImg.height());tempImg.remove()});K(document.body).append(tempImg)});widthBox.change(function(e){if(originalWidth>0){heightBox.val(Math.round(originalHeight/originalWidth*parseInt(this.value,10)))}});heightBox.change(function(e){if(originalHeight>0){widthBox.val(Math.round(originalWidth/originalHeight*parseInt(this.value,10)))}});urlBox.val(options.imageUrl);setSize(options.imageWidth,options.imageHeight);titleBox.val(options.imageTitle);alignBox.each(function(){if(this.value===options.imageAlign){this.checked=true;return false}});if(showRemote&&tabIndex===0){urlBox[0].focus();urlBox[0].select()}return dialog};self.plugin.image={edit:function(){var img=self.plugin.getSelectedImage();self.plugin.imageDialog({imageUrl:img?img.attr("data-ke-src"):"http://",imageWidth:img?img.width():"",imageHeight:img?img.height():"",imageTitle:img?img.attr("title"):"",imageAlign:img?img.attr("align"):"",showRemote:allowImageRemote,showLocal:allowImageUpload,tabIndex:img?0:imageTabIndex,clickFn:function(url,title,width,height,border,align){if(img){img.attr("src",url);img.attr("data-ke-src",url);img.attr("width",width);img.attr("height",height);img.attr("title",title);img.attr("align",align);img.attr("alt",title)}else{self.exec("insertimage",url,title,width,height,border,align)}setTimeout(function(){self.hideDialog().focus()},0)}})},delete:function(){var target=self.plugin.getSelectedImage();if(target.parent().name=="a"){target=target.parent()}target.remove();self.addBookmark()}};self.clickToolbar(name,self.plugin.image.edit)});KindEditor.plugin("insertfile",function(K){var self=this,name="insertfile",allowFileUpload=K.undef(self.allowFileUpload,true),allowFileManager=K.undef(self.allowFileManager,false),formatUploadUrl=K.undef(self.formatUploadUrl,true),uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php"),extraParams=K.undef(self.extraFileUploadParams,{}),filePostName=K.undef(self.filePostName,"imgFile"),lang=self.lang(name+".");self.plugin.fileDialog=function(options){var fileUrl=K.undef(options.fileUrl,"http://"),fileTitle=K.undef(options.fileTitle,""),clickFn=options.clickFn;var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keUrl" class="row-left">'+lang.url+":</label>",'<div class="row-right">','<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+lang.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+lang.viewServer+'" />',"</span>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keTitle" class="row-left">'+lang.title+":</label>",'<div class="row-right">','<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',"</div>","</div>","</form>","</div>"].join("");var dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var url=K.trim(urlBox.val()),title=titleBox.val();if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}if(K.trim(title)===""){title=url}clickFn.call(self,url,title)}}}),div=dialog.div;var urlBox=K('[name="url"]',div),viewServerBtn=K('[name="viewServer"]',div),titleBox=K('[name="title"]',div);if(allowFileUpload){var callback=function(data){dialog.hideLoading();if(data.code==="000"){var url=data.data.url;if(formatUploadUrl){url=K.formatUrl(url,"absolute")}urlBox.val(url);if(self.afterUpload){self.afterUpload.call(self,url,data,name)}}else{K.options.errorMsgHandler(data.message,"error")}};var uploadbutton=K.uploadbutton({button:K(".ke-upload-button",div)[0],fieldName:filePostName,url:K.addParam(uploadJson,"fileType=file"),extraParams:extraParams,beforeUpload:function(){if(typeof self.beforeUpload=="function"){self.beforeUpload.call(this,callback);return false}else{return true}},afterUpload:function(data){callback(data)},afterError:function(html){dialog.hideLoading();self.errorDialog(html)}});uploadbutton.fileBox.change(function(e){dialog.showLoading(self.lang("uploadLoading"));uploadbutton.submit()})}else{K(".ke-upload-button",div).hide()}if(allowFileManager){viewServerBtn.click(function(e){self.loadPlugin("filemanager",function(){self.plugin.filemanagerDialog({viewType:"LIST",dirName:"file",clickFn:function(url){K('[name="url"]',div).val(url);if(self.afterSelectFile){self.afterSelectFile.call(self,url)}}})})})}else{K("#keUrl").css("width","250px");viewServerBtn.hide()}urlBox.val(fileUrl);titleBox.val(fileTitle);urlBox[0].focus();urlBox[0].select()};self.clickToolbar(name,function(){self.plugin.fileDialog({clickFn:function(url,title){var html='<a class="ke-insertfile" href="'+url+'" data-ke-src="'+url+'" target="_blank">'+title+"</a>";self.insertHtml(html).hideDialog().focus()}})})});KindEditor.plugin("lineheight",function(K){var self=this,name="lineheight",lang=self.lang(name+".");self.clickToolbar(name,function(){var curVal="",commonNode=self.cmd.commonNode({"*":".line-height"});if(commonNode){curVal=commonNode.css("line-height")}var menu=self.createMenu({name:name,width:150});K.each(lang.lineHeight,function(i,row){K.each(row,function(key,val){menu.addItem({title:val,checked:curVal===key,click:function(){self.cmd.toggle('<span style="line-height:'+key+';"></span>',{span:".line-height="+key});self.updateState();self.addBookmark();self.hideMenu()}})})})})});KindEditor.plugin("link",function(K){var self=this,name="link";self.plugin.link={edit:function(){var lang=self.lang(name+"."),html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keUrl" class="row-left">'+lang.url+":</label>",'<div class="row-right">','<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix"">','<label for="keType" class="row-left">'+lang.linkType+":</label>",'<div class="row-right">','<select id="keType" class="ke-select" name="type"></select>',"</div>","</div>","</div>"].join(""),dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var url=K.trim(urlBox.val());if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}self.exec("createlink",url,typeBox.val()).hideDialog().focus()}}}),div=dialog.div,urlBox=K('input[name="url"]',div),typeBox=K('select[name="type"]',div);urlBox.val("http://");typeBox[0].options[0]=new Option(lang.newWindow,"_blank");typeBox[0].options[1]=new Option(lang.selfWindow,"");self.cmd.selection();var a=self.plugin.getSelectedLink();if(a){self.cmd.range.selectNode(a[0]);self.cmd.select();urlBox.val(a.attr("data-ke-src"));typeBox.val(a.attr("target"))}urlBox[0].focus();urlBox[0].select()},delete:function(){self.exec("unlink",null)}};self.clickToolbar(name,self.plugin.link.edit)});KindEditor.plugin("media",function(K){var self=this,name="media",lang=self.lang(name+"."),allowMediaUpload=K.undef(self.allowMediaUpload,false),allowFileManager=K.undef(self.allowFileManager,false),formatUploadUrl=K.undef(self.formatUploadUrl,true),extraParams=K.undef(self.extraFileUploadParams,{}),filePostName=K.undef(self.filePostName,"imgFile"),uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php");self.plugin.media={edit:function(){var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keUrl" class="row-left">'+lang.url+":</label>",'<div class="row-right">','<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:180px;" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+lang.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+lang.viewServer+'" />',"</span>",'<div style="margin-top:5px;color:#aaa;">支持优酷、爱奇艺、腾讯视频等视频网站【<span style="color:green">通用代码</span>】',"</div>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keWidth" class="row-left">'+lang.width+":</label>",'<div class="row-right">','<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keHeight" class="row-left">'+lang.height+":</label>",'<div class="row-right">','<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keAutostart" class="row-left">'+lang.autostart+":</label>",'<div class="row-right">','<input type="checkbox" id="keAutostart" name="autostart" class="ke-input-checkbox" value="" /> ',"</div>","</div>","</div>"].join("");var dialog=self.createDialog({name:name,width:450,height:260,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var url=K.trim(urlBox.val()),width=widthBox.val(),height=heightBox.val();var match=url.match(/^<iframe\s(.*?)src=('|")(.*?)('|")/);if(!match){if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}}if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}if(!match){var html=K.mediaImg(self.themesPath+"common/blank.gif",{src:url,type:K.mediaType(url),width:width,height:height,autostart:autostartBox[0].checked?"true":"false",loop:"true"})}else{var html='<iframe src="'+match[3]+'" frameborder="0" style="width:'+width+"px;height:"+height+'px;"></iframe>'}self.insertHtml(html).hideDialog().focus()}}}),div=dialog.div,urlBox=K('[name="url"]',div),viewServerBtn=K('[name="viewServer"]',div),widthBox=K('[name="width"]',div),heightBox=K('[name="height"]',div),autostartBox=K('[name="autostart"]',div);urlBox.val("http://");if(allowMediaUpload){var callback=function(data){dialog.hideLoading();if(data.code=="000"){var url=data.data.url;if(formatUploadUrl){url=K.formatUrl(url,"absolute")}urlBox.val(url);if(self.afterUpload){self.afterUpload.call(self,url,data,name)}}else{K.options.errorMsgHandler(data.message,"error","error")}};var uploadbutton=K.uploadbutton({button:K(".ke-upload-button",div)[0],fieldName:filePostName,extraParams:extraParams,url:K.addParam(uploadJson,"fileType=media"),beforeUpload:function(){if(typeof self.beforeUpload=="function"){self.beforeUpload.call(this,callback);return false}else{return true}},afterUpload:function(data){callback(data)},afterError:function(html){dialog.hideLoading();self.errorDialog(html)}});uploadbutton.fileBox.change(function(e){dialog.showLoading(self.lang("uploadLoading"));uploadbutton.submit()})}else{K(".ke-upload-button",div).hide()}if(allowMediaUpload&&allowFileManager){viewServerBtn.click(function(e){self.loadPlugin("filemanager",function(){self.plugin.filemanagerDialog({dirName:"media",clickFn:function(url){K('[name="url"]',div).val(url);if(self.afterSelectFile){self.afterSelectFile.call(self,url)}}})})})}else{K("#keUrl").css("width","250px");viewServerBtn.hide()}var img=self.plugin.getSelectedMedia();if(img){var attrs=K.mediaAttrs(img.attr("data-ke-tag"));urlBox.val(attrs.src);widthBox.val(K.removeUnit(img.css("width"))||attrs.width||0);heightBox.val(K.removeUnit(img.css("height"))||attrs.height||0);autostartBox[0].checked=attrs.autostart==="true"}urlBox[0].focus();urlBox[0].select()},delete:function(){self.plugin.getSelectedMedia().remove();self.addBookmark()}};self.clickToolbar(name,self.plugin.media.edit)});KindEditor.plugin("multiimage",function(K){var self=this,name="multiimage",uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php"),fileManagerJson=K.undef(self.fileManagerJson,self.basePath+"php/file_manager_json.php"),imageSizeLimit=K.undef(self.imageSizeLimit,2048),imageFileTypes=K.undef(self.imageFileTypes,"jpg|png|gif|jpeg"),imageUploadLimit=K.undef(self.imageUploadLimit,20),filePostName=K.undef(self.filePostName,"imgFile"),lang=self.lang(name+".");if(typeof jQuery=="undefined"){K.options.errorMsgHandler(lang.depJQueryError,"error");return}else{K.loadScript(K.options.pluginsPath+name+"/BUpload.js");K.loadStyle(K.options.pluginsPath+name+"/css/upload.css")}K.locker=function(){var docWidth=Math.max(document.documentElement.clientWidth,document.body.clientWidth);var docHeight=Math.max(document.documentElement.clientHeight,document.body.clientHeight,$(document).height())+document.documentElement.scrollTop;return K.widget({x:0,y:0,cls:"ke-dialog-lock",width:docWidth,height:docHeight})};self.plugin.multiImageDialog=function(options){var clickFn=options.clickFn;var locker=K.locker();locker.show();var dialog=new BUpload({src:filePostName,upload_url:uploadJson,list_url:fileManagerJson,max_filesize:imageSizeLimit,max_filenum:imageUploadLimit,ext_allow:imageFileTypes,lang:lang,top:self.dialogOffset,fileType:"image",errorHandler:K.options.errorMsgHandler,callback:function(data){clickFn.call(this,data)},close:function(){locker.remove()}});return dialog};self.clickToolbar(name,function(){self.plugin.multiImageDialog({clickFn:function(urlList){if(urlList.length===0){return}K.each(urlList,function(i,data){if(self.afterUpload){self.afterUpload.call(self,data,data,"multiimage")}self.exec("insertimage",data)});setTimeout(function(){self.hideDialog().focus()},0)}})})});KindEditor.plugin("graft",function(K){var self=this,name="graft",uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php"),allowUploadGraft=K.undef(self.allowUploadGraft,true),lang=self.lang(name+".");if(typeof jQuery=="undefined"){K.options.errorMsgHandler(lang.depJQueryError,"error");return}else{K.loadStyle(K.options.pluginsPath+"graft/css/scrawl.css");K.loadScript(K.options.pluginsPath+"graft/scrawl.js")}self.plugin.graftDialog=function(options){var clickFn=options.clickFn;var html=['<div class="scrawl-main" id="scrawl-main">','<div class="hot">','<div class="drawBoard border_style">','<canvas id="canvas-borad" class="brushBorad">你的浏览器不支持 canvas 绘图</canvas>','<div class="picBoard" id="picBoard" style=""></div>',"</div>",'<div class="operateBar">','<button id="J_prevStep" class="prevStep" title="上一步">','<em class="icon"></em>',"</button>",'<button id="J_nextStep" class="nextStep" title="下一步">','<em class="icon"></em>',"</button>",'<button id="J_clearBoard" class="clearBoard" title="清空">','<em class="icon"></em>',"</button>","</div>","</div>",'<div class="drawToolbar border_style">','<div class="colorBar">','<span data-color="#0099CC" style="background:#0099CC;" class="active"></span>','<span data-color="#003366" style="background:#003366;"></span>','<span data-color="#993333" style="background:#993333;"></span>','<span data-color="#FF9900" style="background:#FF9900;"></span>','<span data-color="#0000CC" style="background:#0000CC;"></span>','<span data-color="#CC3333" style="background:#CC3333;"></span>','<span data-color="#F4D03F" style="background:#641E16;"></span>','<span data-color="#4A235A" style="background:#4A235A;"></span>','<span data-color="#009966" style="background:#009966;"></span>','<span data-color="#ffff00" style="background:#ffff00;"></span>','<span data-color="#7D6608" style="background:#7D6608;"></span>','<span data-color="#FF33CC" style="background:#FF33CC;"></span>','<span data-color="#990066" style="background:#990066;"></span>','<span data-color="#ffffff" style="background:#ffffff;"></span>','<span data-color="#9bbb59" style="background:#9bbb59;"></span>','<span data-color="#CCFFFF" style="background:#CCFFFF;"></span>','<span data-color="#FFCCCC" style="background:#FFCCCC;"></span>','<span data-color="#CC99CC" style="background:#CC99CC;"></span>',"</div>",'<div class="sectionBar">','<em class="brushIcon"></em>','<a href="javascript:void(0)" class="brush-size size1">1</a>','<a href="javascript:void(0)" class="brush-size size2">3</a>','<a href="javascript:void(0)" class="brush-size size3">5</a>','<a href="javascript:void(0)" class="brush-size size4">7</a>',"</div>",'<div class="sectionBar">','<em class="eraserIcon"></em>','<a href="javascript:void(0)" class="eraser-size size1">5</a>','<a href="javascript:void(0)" class="eraser-size size2">10</a>','<a href="javascript:void(0)" class="eraser-size size3">15</a>','<a href="javascript:void(0)" class="eraser-size size4">20</a>',"</div>",'<div class="sectionBar">','<em class="blurIcon"></em>','<a href="javascript:void(0)" class="blur-size size1">2</a>','<a href="javascript:void(0)" class="blur-size size2">4</a>','<a href="javascript:void(0)" class="blur-size size3">6</a>','<a href="javascript:void(0)" class="blur-size size4">8</a>',"</div>",'<div class="sectionBar">','<span id="clearSetting" class="clearSetting">','<em class="icon"></em>','<em class="text">初始化设置</em>',"</span>","</div>",'<div class="sectionBar">','<div id="J_addImg" class="addImgH">','<em class="icon"></em>','<em class="text">添加背景</em>','<input type="file" class="upload" id="J_canvas_bg" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>',"</div>","</div>",'<div class="sectionBar">','<span id="J_removeImg" class="removeImg">','<em class="icon"></em>','<em class="text">删除背景</em>',"</span>","</div>","</div>"].join("");var dataURLtoFile=function(dataurl,filename){var arr=dataurl.split(","),mime=arr[0].match(/:(.*?);/)[1],bstr=atob(arr[1]),n=bstr.length,u8arr=new Uint8Array(n);while(n--){u8arr[n]=bstr.charCodeAt(n)}return new File([u8arr],filename,{type:mime})};var dialog=self.createDialog({name:name,width:750,height:440,title:self.lang(name),body:html,yesBtn:{name:lang.btnText,click:function(e){if(dialog.isLoading){return}if(canvas.isEmpty()){K.options.errorMsgHandler(lang.empty,"error");return}canvas.save(function(data){if(allowUploadGraft){var callback=function(res){dialog.hideLoading();if(res.code=="000"){clickFn.call(self,res.data.url);self.hideDialog().focus()}else{K.options.errorMsgHandler(lang.uploadFaild,"error")}};dialog.showLoading(self.lang("uploadLoading"));if(typeof self.beforeUpload=="function"){var file=dataURLtoFile(data,"graft.png");self.beforeUpload.call(this,callback,file)}else{$.post(uploadJson,{img_base64_data:data,fileType:"image",base64:1},function(res){callback(res)},"json")}}else{clickFn.call(self,data);self.hideDialog().focus()}})}}});var canvas=new Canvas({canvasId:"canvas-borad",width:600,height:320})};self.clickToolbar(name,function(){self.plugin.graftDialog({clickFn:function(url){self.exec("insertimage",url)}})})});KindEditor.plugin("filemanager",function(K){var self=this;var fileManagerJson=K.undef(self.fileManagerJson,self.basePath+"php/file_manager_json.php");var lang=self.lang("filemanager.");if(typeof jQuery=="undefined"){K.options.errorMsgHandler(lang.depJQueryError,"error");return}else{K.loadScript(K.options.pluginsPath+"filemanager/FManager.js");K.loadStyle(K.options.pluginsPath+"multiimage/css/upload.css")}self.plugin.filemanagerDialog=function(options){var clickFn=options.clickFn;new FManager({list_url:fileManagerJson,lang:lang,fileType:options.dirName,top:self.dialogOffset,multiple:options.multiple?true:false,callback:function(data){clickFn.call(this,options.multiple?data:data[0])}})}});KindEditor.plugin("pagebreak",function(K){var self=this;var name="pagebreak";var pagebreakHtml=K.undef(self.pagebreakHtml,'<hr style="page-break-after: always;" class="ke-pagebreak" />');self.clickToolbar(name,function(){var cmd=self.cmd,range=cmd.range;self.focus();var tail=self.newlineTag=="br"||K.WEBKIT?"":'<span id="__kindeditor_tail_tag__"></span>';self.insertHtml(pagebreakHtml+tail);if(tail!==""){var p=K("#__kindeditor_tail_tag__",self.edit.doc);range.selectNodeContents(p[0]);p.removeAttr("id");cmd.select()}})});KindEditor.plugin("plainpaste",function(K){var self=this,name="plainpaste";self.clickToolbar(name,function(){var lang=self.lang(name+"."),html='<div style="padding:10px 20px;">'+'<div style="margin-bottom:10px;">'+lang.comment+"</div>"+'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>'+"</div>",dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var html=textarea.val();html=K.escape(html);html=html.replace(/ {2}/g," &nbsp;");if(self.newlineTag=="p"){html=html.replace(/^/,"<p>").replace(/$/,"</p>").replace(/\n/g,"</p><p>")}else{html=html.replace(/\n/g,"<br />$&")}self.insertHtml(html).hideDialog().focus()}}}),textarea=K("textarea",dialog.div);textarea[0].focus()})});KindEditor.plugin("preview",function(K){var self=this,name="preview",undefined;self.clickToolbar(name,function(){var lang=self.lang(name+"."),width=document.documentElement.clientWidth*.9,height=document.documentElement.clientHeight-160,html='<div style="padding:10px 20px;">'+'<iframe class="ke-textarea" frameborder="0" style="width:'+(width-42)+"px;height:"+height+'px;"></iframe>'+"</div>",dialog=self.createDialog({name:name,width:width,title:self.lang(name),body:html}),iframe=K("iframe",dialog.div),doc=K.iframeDoc(iframe);doc.open();var cssPath=self.options.cssPath;var jsPath=self.options.jsPath;var arr=['<html lang="en">','<head><meta charset="utf-8" /><title></title>',"<style>","html {margin:0;padding:0;}","body {margin:0;padding:5px;}",'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',"body, p, div {word-wrap: break-word;}","p {margin:5px 0;}","table {border-collapse:collapse;}","img {border:0;}","noscript {display:none;}","table.ke-zeroborder td {border:1px dotted #AAA;}","img.ke-flash {","\tborder:1px solid #AAA;","\tbackground-image:url("+self.options.themesPath+"common/flash.svg);","\t*background-image:url("+self.options.themesPath+"common/flash.png);","\tbackground-size:64px 64px;","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-rm {","\tborder:1px solid #AAA;","\tbackground-image:url("+self.options.themesPath+"common/rm.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-media {","\tborder:1px solid #AAA;","\tbackground-image:url("+self.options.themesPath+"common/play.svg);","\t*background-image:url("+self.options.themesPath+"common/play.png);","\tbackground-position:center center;","\tbackground-size:64px 64px;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-anchor {","\tborder:1px dashed #666;","\twidth:16px;","\theight:16px;","}",".ke-script, .ke-noscript, .ke-display-none {","\tdisplay:none;","\tfont-size:0;","\twidth:0;","\theight:0;","}",".ke-pagebreak {","\tborder:1px dotted #AAA;","\tfont-size:0;","\theight:2px;","}"];if(self.options.showHelpGrid){arr.push("p,ul,ol,li,div{border: 1px dashed #c1c1c1;}");arr.push("li{margin:5px 0px}");arr.push("div,ul,ol{margin-bottom:10px}")}arr.push("</style>");if(!K.isArray(cssPath)){cssPath=[cssPath]}if(K.inArray(self.options.pluginsPath+"code/prism.css",cssPath)<0){cssPath.push(self.options.pluginsPath+"code/prism.css")}K.each(cssPath,function(i,path){if(path){arr.push('<link href="'+path+'" rel="stylesheet" />')}});if(self.options.cssData){arr.push("<style>"+self.options.cssData+"</style>")}arr.push("</head><body "+(self.options.bodyClass?'class="'+self.options.bodyClass+'"':"")+">");arr.push(self.fullHtml());if(!K.isArray(jsPath)){jsPath=[jsPath]}if(K.inArray(self.options.pluginsPath+"code/prism.js",jsPath)<0){jsPath.push(self.options.pluginsPath+"code/prism.js")}K.each(jsPath,function(i,path){if(path){arr.push('<script type="text/javascript" src="'+path+'"><\/script>')}});arr.push("</body></html>");doc.write(arr.join("\n"));doc.close();K(doc.body).css("background-color","#FFF");iframe[0].contentWindow.focus()})});KindEditor.plugin("quickformat",function(K){var self=this,name="quickformat",blockMap=K.toMap("blockquote,center,div,h1,h2,h3,h4,h5,h6,p");function getFirstChild(knode){var child=knode.first();while(child&&child.first()){child=child.first()}return child}self.clickToolbar(name,function(){self.focus();var doc=self.edit.doc,range=self.cmd.range,child=K(doc.body).first(),next,nodeList=[],subList=[],bookmark=range.createBookmark(true);while(child){next=child.next();var firstChild=getFirstChild(child);if(!firstChild||firstChild.name!="img"){if(blockMap[child.name]){child.html(child.html().replace(/^(\s|&nbsp;| )+/gi,""));child.css("text-indent","2em")}else{subList.push(child)}if(!next||(blockMap[next.name]||blockMap[child.name]&&!blockMap[next.name])){if(subList.length>0){nodeList.push(subList)}subList=[]}}child=next}K.each(nodeList,function(i,subList){var wrapper=K('<p style="text-indent:2em;"></p>',doc);subList[0].before(wrapper);K.each(subList,function(i,knode){wrapper.append(knode)})});range.moveToBookmark(bookmark);self.addBookmark()})});KindEditor.plugin("table",function(K){var self=this,name="table",lang=self.lang(name+"."),zeroborder="ke-zeroborder";var borderColor=K.undef(self.options.tableBorderColor,"#cccccc");function _setColor(box,color){color=color.toUpperCase();box.css("background-color",color);box.css("color",color==="#000000"?"#FFFFFF":"#000000");box.html(color)}var pickerList=[];function _initColorPicker(dialogDiv,colorBox){colorBox.bind("click,mousedown",function(e){e.stopPropagation()});function removePicker(){K.each(pickerList,function(){this.remove()});pickerList=[];K(document).unbind("click,mousedown",removePicker);dialogDiv.unbind("click,mousedown",removePicker)}colorBox.click(function(e){removePicker();var box=K(this),pos=box.pos();var picker=K.colorpicker({x:pos.x,y:pos.y+box.height(),z:811214,selectedColor:K(this).html(),colors:self.colorTable,noColor:self.lang("noColor"),shadowMode:self.shadowMode,click:function(color){_setColor(box,color);removePicker()}});pickerList.push(picker);K(document).bind("click,mousedown",removePicker);dialogDiv.bind("click,mousedown",removePicker)})}function _getCellIndex(table,row,cell){var rowSpanCount=0;for(var i=0,len=row.cells.length;i<len;i++){if(row.cells[i]==cell){break}rowSpanCount+=row.cells[i].rowSpan-1}return cell.cellIndex-rowSpanCount}self.plugin.table={prop:function(isInsert){var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keRows" class="row-left">'+lang.cells+":</label>",'<div class="row-right">',lang.rows+' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',lang.cols+' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keWidth" class="row-left">'+lang.size+":</label>",'<div class="row-right">',lang.width+' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ','<select name="widthType" class="ke-select">','<option value="%">'+lang.percent+"</option>",'<option value="px">'+lang.px+"</option>","</select> &nbsp; ",lang.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ','<select name="heightType" class="ke-select">','<option value="%">'+lang.percent+"</option>",'<option value="px">'+lang.px+"</option>","</select>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="kePadding" class="row-left">'+lang.space+":</label>",'<div class="row-right">',lang.padding+' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',lang.spacing+' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keAlign" class="row-left">'+lang.align+":</label>",'<div class="row-right">','<select id="keAlign" class="ke-select" name="align">','<option value="">'+lang.alignDefault+"</option>",'<option value="left">'+lang.alignLeft+"</option>",'<option value="center">'+lang.alignCenter+"</option>",'<option value="right">'+lang.alignRight+"</option>","</select>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keBorder" class="row-left">'+lang.border+":</label>",'<div class="row-right">',lang.borderWidth+' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',lang.borderColor+' <span class="ke-inline-block ke-input-color"></span>',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keBgColor" class="row-left">'+lang.backgroundColor+":</label>",'<div class="row-right">','<span class="ke-inline-block ke-input-color"></span>',"</div>","</div>","</div>"].join("");var bookmark=self.cmd.range.createBookmark();var dialog=self.createDialog({name:name,width:500,title:self.lang(name),body:html,beforeRemove:function(){colorBox.unbind()},yesBtn:{name:self.lang("yes"),click:function(e){var rows=rowsBox.val(),cols=colsBox.val(),width=widthBox.val(),height=heightBox.val(),widthType=widthTypeBox.val(),heightType=heightTypeBox.val(),padding=paddingBox.val(),spacing=spacingBox.val(),align=alignBox.val(),border=borderBox.val(),borderColor=K(colorBox[0]).html()||"",bgColor=K(colorBox[1]).html()||"";if(rows==0||!/^\d+$/.test(rows)){K.options.errorMsgHandler(self.lang("invalidRows"),"error");rowsBox[0].focus();return}if(cols==0||!/^\d+$/.test(cols)){K.options.errorMsgHandler(self.lang("invalidRows"),"error");colsBox[0].focus();return}if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}if(!/^\d*$/.test(padding)){K.options.errorMsgHandler(self.lang("invalidPadding"),"error");paddingBox[0].focus();return}if(!/^\d*$/.test(spacing)){K.options.errorMsgHandler(self.lang("invalidSpacing"),"error");spacingBox[0].focus();return}if(!/^\d*$/.test(border)){K.options.errorMsgHandler(self.lang("invalidBorder"),"error");borderBox[0].focus();return}if(table){if(width!==""){table.width(width+widthType)}else{table.css("width","")}if(table[0].width!==undefined){table.removeAttr("width")}if(height!==""){table.height(height+heightType)}else{table.css("height","")}if(table[0].height!==undefined){table.removeAttr("height")}table.css("background-color",bgColor);if(table[0].bgColor!==undefined){table.removeAttr("bgColor")}if(padding!==""){table[0].cellPadding=padding}else{table.removeAttr("cellPadding")}if(spacing!==""){table[0].cellSpacing=spacing}else{table.removeAttr("cellSpacing")}if(align!==""){table[0].align=align}else{table.removeAttr("align")}if(border!==""){table.attr("border",border)}else{table.removeAttr("border")}if(border===""||border==="0"){table.addClass(zeroborder)}else{table.removeClass(zeroborder)}if(borderColor!==""){table.attr("borderColor",borderColor)}else{table.removeAttr("borderColor")}self.hideDialog().focus();self.cmd.range.moveToBookmark(bookmark);self.cmd.select();self.addBookmark();return}var style="";if(width!==""){style+="width:"+width+widthType+";"}if(height!==""){style+="height:"+height+heightType+";"}if(bgColor!==""){style+="background-color:"+bgColor+";"}var html='<table class="table"';if(style!==""){html+=' style="'+style+'"'}if(padding!==""){html+=' cellpadding="'+padding+'"'}if(spacing!==""){html+=' cellspacing="'+spacing+'"'}if(align!==""){html+=' align="'+align+'"'}if(border!==""){html+=' border="'+border+'"'}if(border===""||border==="0"){html+=' class="table '+zeroborder+'"'}if(borderColor!==""){html+=' bordercolor="'+borderColor+'"'}html+=">";for(var i=0;i<rows;i++){html+="<tr>";for(var j=0;j<cols;j++){html+="<td>"+(K.IE?"&nbsp;":"<br />")+"</td>"}html+="</tr>"}html+="</table>";if(!K.IE){html+="<br />"}function getAncestorTag(range){var ancestor=K(range.commonAncestor());while(ancestor){if(ancestor.type==1&&!ancestor.isStyle()){break}ancestor=ancestor.parent()}return ancestor}var tag=getAncestorTag(self.cmd.range);if(tag.name=="p"){tag.before(K(html));tag.remove();self.cmd.selection();self.insertHtml("<br />");self.select().hideDialog().focus()}else{self.insertHtml(html);self.select().hideDialog().focus();self.addBookmark()}}}}),div=dialog.div,rowsBox=K('[name="rows"]',div).val(3),colsBox=K('[name="cols"]',div).val(2),widthBox=K('[name="width"]',div).val(100),heightBox=K('[name="height"]',div),widthTypeBox=K('[name="widthType"]',div),heightTypeBox=K('[name="heightType"]',div),paddingBox=K('[name="padding"]',div).val(0),spacingBox=K('[name="spacing"]',div).val(0),alignBox=K('[name="align"]',div),borderBox=K('[name="border"]',div).val(1),colorBox=K(".ke-input-color",div);_initColorPicker(div,colorBox.eq(0));_initColorPicker(div,colorBox.eq(1));_setColor(colorBox.eq(1),"");rowsBox[0].focus();rowsBox[0].select();var table;if(isInsert){return}table=self.plugin.getSelectedTable();if(table){rowsBox.val(table[0].rows.length);colsBox.val(table[0].rows.length>0?table[0].rows[0].cells.length:0);rowsBox.attr("disabled",true);colsBox.attr("disabled",true);var match,tableWidth=table[0].style.width||table[0].width,tableHeight=table[0].style.height||table[0].height;if(tableWidth!==undefined&&(match=/^(\d+)((?:px|%)*)$/.exec(tableWidth))){widthBox.val(match[1]);widthTypeBox.val(match[2])}else{widthBox.val("")}if(tableHeight!==undefined&&(match=/^(\d+)((?:px|%)*)$/.exec(tableHeight))){heightBox.val(match[1]);heightTypeBox.val(match[2])}paddingBox.val(table[0].cellPadding||"");spacingBox.val(table[0].cellSpacing||"");alignBox.val(table[0].align||"");borderBox.val(table[0].border===undefined?"":table[0].border);_setColor(colorBox.eq(0),K.toHex(table.attr("borderColor")||""));_setColor(colorBox.eq(1),K.toHex(table[0].style.backgroundColor||table[0].bgColor||""));widthBox[0].focus();widthBox[0].select()}},cellprop:function(){var html=['<div style="padding:20px;">','<div class="ke-dialog-row ke-clearfix">','<label for="keWidth" style="width:90px;">'+lang.size+"</label>",lang.width+' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ','<select name="widthType">','<option value="%">'+lang.percent+"</option>",'<option value="px">'+lang.px+"</option>","</select> &nbsp; ",lang.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ','<select name="heightType">','<option value="%">'+lang.percent+"</option>",'<option value="px">'+lang.px+"</option>","</select>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keAlign" style="width:90px;">'+lang.align+"</label>",lang.textAlign+' <select id="keAlign" name="textAlign">','<option value="">'+lang.alignDefault+"</option>",'<option value="left">'+lang.alignLeft+"</option>",'<option value="center">'+lang.alignCenter+"</option>",'<option value="right">'+lang.alignRight+"</option>","</select> ",lang.verticalAlign+' <select name="verticalAlign">','<option value="">'+lang.alignDefault+"</option>",'<option value="top">'+lang.alignTop+"</option>",'<option value="middle">'+lang.alignMiddle+"</option>",'<option value="bottom">'+lang.alignBottom+"</option>",'<option value="baseline">'+lang.alignBaseline+"</option>","</select>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keBorder" style="width:90px;">'+lang.border+"</label>",lang.borderWidth+' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',lang.borderColor+' <span class="ke-inline-block ke-input-color"></span>',"</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keBgColor" style="width:90px;">'+lang.backgroundColor+"</label>",'<span class="ke-inline-block ke-input-color"></span>',"</div>","</div>"].join("");var bookmark=self.cmd.range.createBookmark();var dialog=self.createDialog({name:name,width:500,title:self.lang("tablecell"),body:html,beforeRemove:function(){colorBox.unbind()},yesBtn:{name:self.lang("yes"),click:function(e){var width=widthBox.val(),height=heightBox.val(),widthType=widthTypeBox.val(),heightType=heightTypeBox.val(),padding=paddingBox.val(),spacing=spacingBox.val(),textAlign=textAlignBox.val(),verticalAlign=verticalAlignBox.val(),border=borderBox.val(),borderColor=K(colorBox[0]).html()||"",bgColor=K(colorBox[1]).html()||"";if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}if(!/^\d*$/.test(border)){K.options.errorMsgHandler(self.lang("invalidBorder"),"error");borderBox[0].focus();return}cell.css({width:width!==""?width+widthType:"",height:height!==""?height+heightType:"","background-color":bgColor,"text-align":textAlign,"vertical-align":verticalAlign,"border-width":border,"border-style":border!==""?"solid":"","border-color":borderColor});self.hideDialog().focus();self.cmd.range.moveToBookmark(bookmark);self.cmd.select();self.addBookmark()}}}),div=dialog.div,widthBox=K('[name="width"]',div).val(100),heightBox=K('[name="height"]',div),widthTypeBox=K('[name="widthType"]',div),heightTypeBox=K('[name="heightType"]',div),paddingBox=K('[name="padding"]',div).val(0),spacingBox=K('[name="spacing"]',div).val(0),textAlignBox=K('[name="textAlign"]',div),verticalAlignBox=K('[name="verticalAlign"]',div),borderBox=K('[name="border"]',div).val(1),colorBox=K(".ke-input-color",div);_initColorPicker(div,colorBox.eq(0));_initColorPicker(div,colorBox.eq(1));_setColor(colorBox.eq(1),"");widthBox[0].focus();widthBox[0].select();var cell=self.plugin.getSelectedCell();var match,cellWidth=cell[0].style.width||cell[0].width||"",cellHeight=cell[0].style.height||cell[0].height||"";if(match=/^(\d+)((?:px|%)*)$/.exec(cellWidth)){widthBox.val(match[1]);widthTypeBox.val(match[2])}else{widthBox.val("")}if(match=/^(\d+)((?:px|%)*)$/.exec(cellHeight)){heightBox.val(match[1]);heightTypeBox.val(match[2])}textAlignBox.val(cell[0].style.textAlign||"");verticalAlignBox.val(cell[0].style.verticalAlign||"");var border=cell[0].style.borderWidth||"";if(border){border=parseInt(border)}borderBox.val(border);_setColor(colorBox.eq(0),K.toHex(cell[0].style.borderColor||""));_setColor(colorBox.eq(1),K.toHex(cell[0].style.backgroundColor||""));widthBox[0].focus();widthBox[0].select()},insert:function(){this.prop(true)},delete:function(){var table=self.plugin.getSelectedTable();self.cmd.range.setStartBefore(table[0]).collapse(true);self.cmd.select();table.remove();self.addBookmark()},colinsert:function(offset){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],index=cell.cellIndex+offset;index+=table.rows[0].cells.length-row.cells.length;for(var i=0,len=table.rows.length;i<len;i++){var newRow=table.rows[i],newCell=newRow.insertCell(index);newCell.innerHTML=K.IE?"":"<br />";index=_getCellIndex(table,newRow,newCell)}self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},colinsertleft:function(){this.colinsert(0)},colinsertright:function(){this.colinsert(1)},rowinsert:function(offset){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0];var rowIndex=row.rowIndex;if(offset===1){rowIndex=row.rowIndex+(cell.rowSpan-1)+offset}var newRow=table.insertRow(rowIndex);for(var i=0,len=row.cells.length;i<len;i++){if(row.cells[i].rowSpan>1){len-=row.cells[i].rowSpan-1}var newCell=newRow.insertCell(i);if(offset===1&&row.cells[i].colSpan>1){newCell.colSpan=row.cells[i].colSpan}newCell.innerHTML=K.IE?"":"<br />"}for(var j=rowIndex;j>=0;j--){var cells=table.rows[j].cells;if(cells.length>i){for(var k=cell.cellIndex;k>=0;k--){if(cells[k].rowSpan>1){cells[k].rowSpan+=1}}break}}self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},rowinsertabove:function(){this.rowinsert(0)},rowinsertbelow:function(){this.rowinsert(1)},rowmerge:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],rowIndex=row.rowIndex,nextRowIndex=rowIndex+cell.rowSpan,nextRow=table.rows[nextRowIndex];if(table.rows.length<=nextRowIndex){return}var cellIndex=cell.cellIndex;if(nextRow.cells.length<=cellIndex){return}var nextCell=nextRow.cells[cellIndex];if(cell.colSpan!==nextCell.colSpan){return}cell.rowSpan+=nextCell.rowSpan;nextRow.deleteCell(cellIndex);self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},colmerge:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],rowIndex=row.rowIndex,cellIndex=cell.cellIndex,nextCellIndex=cellIndex+1;if(row.cells.length<=nextCellIndex){return}var nextCell=row.cells[nextCellIndex];if(cell.rowSpan!==nextCell.rowSpan){return}cell.colSpan+=nextCell.colSpan;row.deleteCell(nextCellIndex);self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},rowsplit:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],rowIndex=row.rowIndex;if(cell.rowSpan===1){return}var cellIndex=_getCellIndex(table,row,cell);for(var i=1,len=cell.rowSpan;i<len;i++){var newRow=table.rows[rowIndex+i],newCell=newRow.insertCell(cellIndex);if(cell.colSpan>1){newCell.colSpan=cell.colSpan}newCell.innerHTML=K.IE?"":"<br />";cellIndex=_getCellIndex(table,newRow,newCell)}K(cell).removeAttr("rowSpan");self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},colsplit:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],cellIndex=cell.cellIndex;if(cell.colSpan===1){return}for(var i=1,len=cell.colSpan;i<len;i++){var newCell=row.insertCell(cellIndex+i);if(cell.rowSpan>1){newCell.rowSpan=cell.rowSpan}newCell.innerHTML=K.IE?"":"<br />"}K(cell).removeAttr("colSpan");self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},coldelete:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],index=cell.cellIndex;for(var i=0,len=table.rows.length;i<len;i++){var newRow=table.rows[i],newCell=newRow.cells[index];if(newCell.colSpan>1){newCell.colSpan-=1;if(newCell.colSpan===1){K(newCell).removeAttr("colSpan")}}else{newRow.deleteCell(index)}if(newCell.rowSpan>1){i+=newCell.rowSpan-1}}if(row.cells.length===0){self.cmd.range.setStartBefore(table).collapse(true);self.cmd.select();K(table).remove()}else{self.cmd.selection(true)}self.addBookmark()},rowdelete:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],rowIndex=row.rowIndex;for(var i=cell.rowSpan-1;i>=0;i--){table.deleteRow(rowIndex+i)}if(table.rows.length===0){self.cmd.range.setStartBefore(table).collapse(true);self.cmd.select();K(table).remove()}else{self.cmd.selection(true)}self.addBookmark()}};self.clickToolbar(name,self.plugin.table.prop)});KindEditor.plugin("template",function(K){var self=this,name="template",lang=self.lang(name+"."),htmlPath=self.pluginsPath+name+"/html/";function getFilePath(fileName){return htmlPath+fileName+"?ver="+encodeURIComponent(K.DEBUG?K.TIME:K.VERSION)}self.clickToolbar(name,function(){var lang=self.lang(name+"."),arr=['<div class="ke-dialog-content-inner" style="padding-top:0">','<div class="ke-dialog-row ke-clearfix">','<div class="ke-header" style="height: 32px;">',lang.selectTemplate+' <select class="ke-select">'];K.each(lang.fileList,function(key,val){arr.push('<option value="'+key+'">'+val+"</option>")});html=[arr.join(""),"</select>",'<input type="checkbox" id="keReplaceFlag" class="checkbox" name="replaceFlag" value="1" /> <label for="keReplaceFlag">'+lang.replaceContent+"</label>","</div>","</div>",'<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',"</div>"].join("");var dialog=self.createDialog({name:name,width:500,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var doc=K.iframeDoc(iframe);self[checkbox[0].checked?"html":"insertHtml"](doc.body.innerHTML).hideDialog().focus()}}});var selectBox=K("select",dialog.div),checkbox=K('[name="replaceFlag"]',dialog.div),iframe=K("iframe",dialog.div);checkbox[0].checked=true;iframe.attr("src",getFilePath(selectBox.val()));selectBox.change(function(){iframe.attr("src",getFilePath(this.value))})})});KindEditor.plugin("wordpaste",function(K){var self=this,name="wordpaste";self.clickToolbar(name,function(){var jsonp=function(url,callback){var callbackName="jsonp_callback_"+Math.round(1e5*Math.random());window[callbackName]=function(data){delete window[callbackName];document.body.removeChild(script);callback(data)};var script=document.createElement("script");script.src=url+(url.indexOf("?")>=0?"&":"?")+"callback="+callbackName;document.body.appendChild(script)};var lang=self.lang(name+"."),html='<div style="padding:10px 20px;">'+'<div style="margin-bottom:10px;">'+lang.comment+"</div>"+'<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>'+"</div>",dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var str=doc.body.innerHTML;str=K.clearMsWord(str,self.filterMode?self.htmlTags:K.options.htmlTags);if(typeof self.wordImageServer!=="undefined"&&self.wordImageServer){var i=0;var arr=[];var replacedStr=str.replace(/file:\/\/+(localhost)?(\S+\.(png|jpg|jpeg|gif|bmp))/gi,function(value){arr[i]=value;var replaced="##"+i+"##";i++;return replaced});for(var j=0;j<arr.length;j++){jsonp("http://"+self.wordImageServer+"/word?index="+j+"&file="+encodeURIComponent(arr[j]),function(data){K.uploadwordimage.call(self,data.index,data.info)})}str=replacedStr}self.insertHtml(str).hideDialog().focus()}}}),div=dialog.div,iframe=K("iframe",div),doc=K.iframeDoc(iframe);if(!K.IE){doc.designMode="on"}doc.open();doc.write("<!doctype html><html><head><title>WordPaste</title></head>");doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');if(!K.IE){doc.write("<br />")}doc.write("</body></html>");doc.close();if(K.IE){doc.body.contentEditable="true"}iframe[0].contentWindow.focus()})});KindEditor.plugin("fixtoolbar",function(K){var self=this;if(!self.fixToolBar){return}function init(){var toolbar=K(".ke-toolbar");var originY=toolbar.pos().y;K(window).bind("scroll",function(){if(toolbar.css("position")=="fixed"){if(document.body.scrollTop-originY<0){toolbar.css("position","static");toolbar.css("top","auto")}}else{if(toolbar.pos().y-document.body.scrollTop<0){toolbar.css("position","fixed");toolbar.css("top",0)}}})}if(self.isCreated){init()}else{self.afterCreate(init)}});
diff --git a/addons/nkeditor/assets/plugins/anchor/anchor.js b/addons/nkeditor/assets/plugins/anchor/anchor.js
new file mode 100644
index 0000000..ddf6b7a
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/anchor/anchor.js
@@ -0,0 +1,46 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('anchor', function(K) {
+	var self = this, name = 'anchor', lang = self.lang(name + '.');
+	self.plugin.anchor = {
+		edit : function() {
+			var html = ['<div class="ke-dialog-content-inner">',
+					'<div class="ke-dialog-row ke-clearfix">',
+					'<label for="keName">' + lang.name + ':</label>',
+					'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',
+					'</div>',
+					'</div>'].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 300,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus();
+					}
+				}
+			});
+			var div = dialog.div,
+				nameBox = K('input[name="name"]', div);
+			var img = self.plugin.getSelectedAnchor();
+			if (img) {
+				nameBox.val(unescape(img.attr('data-ke-name')));
+			}
+			nameBox[0].focus();
+			nameBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedAnchor().remove();
+		}
+	};
+	self.clickToolbar(name, self.plugin.anchor.edit);
+});
diff --git a/addons/nkeditor/assets/plugins/autoheight/autoheight.js b/addons/nkeditor/assets/plugins/autoheight/autoheight.js
new file mode 100644
index 0000000..6123cfa
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/autoheight/autoheight.js
@@ -0,0 +1,59 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('autoheight', function(K) {
+	var self = this;
+
+	if (!self.autoHeightMode) {
+		return;
+	}
+
+	var minHeight;
+
+	function hideScroll() {
+		var edit = self.edit;
+		var body = edit.doc.body;
+		edit.iframe[0].scroll = 'no';
+		body.style.overflowY = 'hidden';
+	}
+
+	function resetHeight() {
+		if(self.fullscreenMode){
+			return;
+		}
+		var edit = self.edit;
+		var body = edit.doc.body;
+		edit.iframe.height(minHeight);
+		self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 76, minHeight));
+	}
+
+	function init() {
+		minHeight = K.removeUnit(self.height);
+
+		self.edit.afterChange(resetHeight);
+		if(!self.fullscreenMode){
+			hideScroll();
+		}
+		resetHeight();
+	}
+
+	if (self.isCreated) {
+		init();
+	} else {
+		self.afterCreate(init);
+	}
+});
+
+/*
+* 如何实现真正的自动高度?
+* 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。
+* 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。
+* 由此就实现了真正的自动高度
+* 测试:chrome、firefox、IE9、IE8
+* */
diff --git a/addons/nkeditor/assets/plugins/baidumap/baidumap.js b/addons/nkeditor/assets/plugins/baidumap/baidumap.js
new file mode 100644
index 0000000..31ce564
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/baidumap/baidumap.js
@@ -0,0 +1,91 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5
+
+KindEditor.plugin('baidumap', function(K) {
+	var self = this, name = 'baidumap', lang = self.lang(name + '.');
+	var mapWidth = K.undef(self.mapWidth, 558);
+	var mapHeight = K.undef(self.mapHeight, 360);
+	self.clickToolbar(name, function() {
+		var html = ['<div class="ke-dialog-content-inner" style="padding-top: 0">',
+			'<div class="ke-dialog-row ke-clearfix">',
+			// right start
+			'<div class="ke-header">' + lang.address,
+			'<input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span>',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" style="line-height:22px;padding:0 10px;" />',
+			'</span>',
+			'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" style="display:inline-block;" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>',
+			'</div>',
+			'</div>',
+
+			//map iframe
+			'<div class="ke-map" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : mapWidth + 42,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var map = win.map;
+					var centerObj = map.getCenter();
+					var center = centerObj.lng + ',' + centerObj.lat;
+					var zoom = map.getZoom();
+					var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'https://api.map.baidu.com/staticimage',
+						'?center=' + encodeURIComponent(center),
+						'&zoom=' + encodeURIComponent(zoom),
+						'&width=' + mapWidth,
+						'&height=' + mapHeight,
+						'&markers=' + encodeURIComponent(center),
+						'&markerStyles=' + encodeURIComponent('l,A')].join('');
+					if (checkbox[0].checked) {
+						self.insertHtml('<iframe src="' + url + '" frameborder="0" style="width:' + (mapWidth + 2) + 'px;height:' + (mapHeight + 2) + 'px;"></iframe>');
+					} else {
+						self.exec('insertimage', url);
+					}
+					self.hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			checkbox = K('[name="insertDynamicMap"]', dialog.div),
+			win, doc;
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/baidumap/index.html b/addons/nkeditor/assets/plugins/baidumap/index.html
new file mode 100644
index 0000000..727d52d
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/baidumap/index.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8"/>
+    <meta name="keywords" content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/>
+    <meta name="description" content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/>
+    <title>百度地图API自定义地图</title>
+    <!--引用百度地图API-->
+    <style type="text/css">
+        html, body {
+            margin: 0;
+            padding: 0;
+        }
+
+        .iw_poi_title {
+            color: #CC5522;
+            font-size: 14px;
+            font-weight: bold;
+            overflow: hidden;
+            padding-right: 13px;
+            white-space: nowrap
+        }
+
+        .iw_poi_content {
+            font: 12px arial, sans-serif;
+            overflow: visible;
+            padding-top: 4px;
+            white-space: -moz-pre-wrap;
+            word-wrap: break-word
+        }
+    </style>
+    <script type="text/javascript" src="//api.map.baidu.com/api?key=&v=1.1&services=true"></script>
+</head>
+
+<body onload="initMap();">
+<!--百度地图容器-->
+<div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div>
+</body>
+<script type="text/javascript">
+    function getParam(name) {
+        return location.href.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? decodeURIComponent(RegExp.$1) : '';
+    }
+
+    var centerParam = getParam('center');
+    var zoomParam = getParam('zoom');
+    var widthParam = getParam('width');
+    var heightParam = getParam('height');
+    var markersParam = getParam('markers');
+    var markerStylesParam = getParam('markerStyles');
+
+    //创建和初始化地图函数:
+    function initMap() {
+        // [FF]切换模式后报错
+        if (!window.BMap) {
+            return;
+        }
+        var dituContent = document.getElementById('dituContent');
+        dituContent.style.width = widthParam + 'px';
+        dituContent.style.height = heightParam + 'px';
+
+        createMap();//创建地图
+        setMapEvent();//设置地图事件
+        addMapControl();//向地图添加控件
+
+        // 创建标注
+        var markersArr = markersParam.split(',');
+        var point = new BMap.Point(markersArr[0], markersArr[1]);
+        var marker = new BMap.Marker(point);
+        map.addOverlay(marker); // 将标注添加到地图中
+    }
+
+    //创建地图函数:
+    function createMap() {
+        var map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图
+        var centerArr = centerParam.split(',');
+        var point = new BMap.Point(centerArr[0], centerArr[1]);//定义一个中心点坐标
+        map.centerAndZoom(point, zoomParam);//设定地图的中心点和坐标并将地图显示在地图容器中
+        window.map = map;//将map变量存储在全局
+    }
+
+    //地图事件设置函数:
+    function setMapEvent() {
+        map.enableDragging();//启用地图拖拽事件,默认启用(可不写)
+        map.enableScrollWheelZoom();//启用地图滚轮放大缩小
+        map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
+        map.enableKeyboard();//启用键盘上下左右键移动地图
+    }
+
+    //地图控件添加函数:
+    function addMapControl() {
+        //向地图中添加缩放控件
+        var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE});
+        map.addControl(ctrl_nav);
+        //向地图中添加缩略图控件
+        var ctrl_ove = new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1});
+        map.addControl(ctrl_ove);
+        //向地图中添加比例尺控件
+        var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});
+        map.addControl(ctrl_sca);
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/baidumap/map.html b/addons/nkeditor/assets/plugins/baidumap/map.html
new file mode 100644
index 0000000..6810c15
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/baidumap/map.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="utf-8"/>
+    <title>Baidu Maps</title>
+    <style>
+        html {
+            height: 100%
+        }
+
+        body {
+            height: 100%;
+            margin: 0;
+            padding: 0;
+            background-color: #FFF
+        }
+    </style>
+    <script charset="utf-8" src="//api.map.baidu.com/api?v=1.3"></script>
+    <script>
+        var map, geocoder;
+
+        function initialize() {
+            map = new BMap.Map('map_canvas');
+            var point = new BMap.Point(114.025974, 22.546054);
+            map.centerAndZoom(point, 11);
+            map.addControl(new BMap.NavigationControl());
+            map.enableScrollWheelZoom();
+
+            var gc = new BMap.Geocoder();
+            gc.getLocation(point, function (rs) {
+                var addComp = rs.addressComponents;
+                var address = [addComp.city].join('');
+                parent.document.getElementById("kindeditor_plugin_map_address").value = address;
+            });
+        }
+
+        function search(address) {
+            if (!map) return;
+            var local = new BMap.LocalSearch(map, {
+                renderOptions: {
+                    map: map,
+                    autoViewport: true,
+                    selectFirstResult: false
+                }
+            });
+            local.search(address);
+        }
+    </script>
+</head>
+<body onload="initialize();">
+<div id="map_canvas" style="width:100%; height:100%"></div>
+</body>
+</html>
diff --git a/addons/nkeditor/assets/plugins/clearhtml/clearhtml.js b/addons/nkeditor/assets/plugins/clearhtml/clearhtml.js
new file mode 100644
index 0000000..1bf0e5d
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/clearhtml/clearhtml.js
@@ -0,0 +1,29 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('clearhtml', function(K) {
+	var self = this, name = 'clearhtml';
+	self.clickToolbar(name, function() {
+		self.focus();
+		var html = self.html();
+		html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, '');
+		html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, '');
+		html = K.formatHtml(html, {
+			a : ['href', 'target'],
+			embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
+			img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'],
+			table : ['border'],
+			'td,th' : ['rowspan', 'colspan'],
+			'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : []
+		});
+		self.html(html);
+		self.cmd.selection(true);
+		self.addBookmark();
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/code/code.js b/addons/nkeditor/assets/plugins/code/code.js
new file mode 100644
index 0000000..67bd09d
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/code/code.js
@@ -0,0 +1,64 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// google code prettify: http://google-code-prettify.googlecode.com/
+// http://google-code-prettify.googlecode.com/
+
+KindEditor.plugin('code', function(K) {
+	var self = this, name = 'code';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = ['<div style="margin: 0px 20px;">',
+				'<div class="ke-dialog-row">',
+				'<select class="ke-select" style="margin-bottom: 5px;">',
+				'<option value="javascript">JavaScript</option>',
+				'<option value="html">HTML</option>',
+				'<option value="css">CSS</option>',
+				'<option value="php">PHP</option>',
+				'<option value="perl">Perl</option>',
+				'<option value="python">Python</option>',
+				'<option value="ruby">Ruby</option>',
+				'<option value="java">Java</option>',
+				'<option value="go">Go</option>',
+				'<option value="asp">ASP/VB</option>',
+				'<option value="csharp">C#</option>',
+				'<option value="cpp">C/C++</option>',
+				'<option value="cs">C#</option>',
+				'<option value="bash">Shell</option>',
+				'<option value="sql">SQL</option>',
+				'<option value="markup">Other</option>',
+				'</select>',
+				'</div>',
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
+				'</div>'].join(''),
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var type = K('.ke-select', dialog.div).val(),
+							code = textarea.val(),
+							cls = type === '' ? '' :  'language-' + type,
+							html = '<pre class="' + cls + '"><code>' + K.escape(code) + '</code></pre> <br/>';
+						if (K.trim(code) === '') {
+							K.options.errorMsgHandler(lang.pleaseInput, "error");
+							textarea[0].focus();
+							return;
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/code/pretty.js b/addons/nkeditor/assets/plugins/code/pretty.js
new file mode 100644
index 0000000..ec84da9
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/code/pretty.js
@@ -0,0 +1,18 @@
+/**
+ * @author yangjian
+ * @since 18-9-11 下午9:02.
+ */
+
+// function _bindEvent(el, type, fn) {
+// 	if (el.addEventListener){
+// 		el.addEventListener(type, fn);
+// 	} else if (el.attachEvent){
+// 		el.attachEvent('on' + type, fn);
+// 	}
+// }
+// _bindEvent(document.body, "DOMNodeInserted", function(e) {
+// 	var className = e.target.className;
+// 	if (className && className.indexOf("language-") != -1) {
+// 		Prism.highlightElement(e.target);
+// 	}
+// })
diff --git a/addons/nkeditor/assets/plugins/code/prism.css b/addons/nkeditor/assets/plugins/code/prism.css
new file mode 100644
index 0000000..f88adbc
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/code/prism.css
@@ -0,0 +1,292 @@
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+csharp+bash+cpp+aspnet+ruby+markup-templating+go+markdown+php+python+sass+yaml&plugins=line-highlight+line-numbers+toolbar+highlight-keywords+show-language+copy-to-clipboard */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+
+code[class*="language-"],
+pre[class*="language-"] {
+	color: black;
+	background: none;
+	text-shadow: 0 1px white;
+	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+	text-align: left;
+	white-space: pre;
+	word-spacing: normal;
+	word-break: normal;
+	word-wrap: normal;
+	line-height: 1.5;
+
+	-moz-tab-size: 4;
+	-o-tab-size: 4;
+	tab-size: 4;
+
+	-webkit-hyphens: none;
+	-moz-hyphens: none;
+	-ms-hyphens: none;
+	hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
+code[class*="language-"]::selection, code[class*="language-"] ::selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+@media print {
+	code[class*="language-"],
+	pre[class*="language-"] {
+		text-shadow: none;
+	}
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+	padding: 1em;
+	margin: .5em 0;
+	overflow: auto;
+}
+
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+	background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+	padding: .1em;
+	border-radius: .3em;
+	white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+	color: slategray;
+}
+
+.token.punctuation {
+	color: #999;
+}
+
+.namespace {
+	opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+	color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+	color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+	color: #9a6e3a;
+	background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+	color: #07a;
+}
+
+.token.function,
+.token.class-name {
+	color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+	color: #e90;
+}
+
+.token.important,
+.token.bold {
+	font-weight: bold;
+}
+.token.italic {
+	font-style: italic;
+}
+
+.token.entity {
+	cursor: help;
+}
+
+pre[data-line] {
+	position: relative;
+	padding: 1em 0 1em 3em;
+}
+
+.line-highlight {
+	position: absolute;
+	left: 0;
+	right: 0;
+	padding: inherit 0;
+	margin-top: 1em; /* Same as .prism’s padding-top */
+
+	background: hsla(24, 20%, 50%,.08);
+	background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
+
+	pointer-events: none;
+
+	line-height: inherit;
+	white-space: pre;
+}
+
+	.line-highlight:before,
+	.line-highlight[data-end]:after {
+		content: attr(data-start);
+		position: absolute;
+		top: .4em;
+		left: .6em;
+		min-width: 1em;
+		padding: 0 .5em;
+		background-color: hsla(24, 20%, 50%,.4);
+		color: hsl(24, 20%, 95%);
+		font: bold 65%/1.5 sans-serif;
+		text-align: center;
+		vertical-align: .3em;
+		border-radius: 999px;
+		text-shadow: none;
+		box-shadow: 0 1px white;
+	}
+
+	.line-highlight[data-end]:after {
+		content: attr(data-end);
+		top: auto;
+		bottom: .4em;
+	}
+
+.line-numbers .line-highlight:before,
+.line-numbers .line-highlight:after {
+	content: none;
+}
+
+pre[class*="language-"].line-numbers {
+	position: relative;
+	padding-left: 3.8em;
+	counter-reset: linenumber;
+}
+
+pre[class*="language-"].line-numbers > code {
+	position: relative;
+	white-space: inherit;
+}
+
+.line-numbers .line-numbers-rows {
+	position: absolute;
+	pointer-events: none;
+	top: 0;
+	font-size: 100%;
+	left: -3.8em;
+	width: 3em; /* works for line-numbers below 1000 lines */
+	letter-spacing: -1px;
+	border-right: 1px solid #999;
+
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+
+}
+
+	.line-numbers-rows > span {
+		pointer-events: none;
+		display: block;
+		counter-increment: linenumber;
+	}
+
+		.line-numbers-rows > span:before {
+			content: counter(linenumber);
+			color: #999;
+			display: block;
+			padding-right: 0.8em;
+			text-align: right;
+		}
+
+div.code-toolbar {
+	position: relative;
+}
+
+div.code-toolbar > .toolbar {
+	position: absolute;
+	top: .3em;
+	right: .2em;
+	transition: opacity 0.3s ease-in-out;
+	opacity: 0;
+}
+
+div.code-toolbar:hover > .toolbar {
+	opacity: 1;
+}
+
+div.code-toolbar > .toolbar .toolbar-item {
+	display: inline-block;
+}
+
+div.code-toolbar > .toolbar a {
+	cursor: pointer;
+}
+
+div.code-toolbar > .toolbar button {
+	background: none;
+	border: 0;
+	color: inherit;
+	font: inherit;
+	line-height: normal;
+	overflow: visible;
+	padding: 0;
+	-webkit-user-select: none; /* for button */
+	-moz-user-select: none;
+	-ms-user-select: none;
+}
+
+div.code-toolbar > .toolbar a,
+div.code-toolbar > .toolbar button,
+div.code-toolbar > .toolbar span {
+	color: #bbb;
+	font-size: .8em;
+	padding: 0 .5em;
+	background: #f5f2f0;
+	background: rgba(224, 224, 224, 0.2);
+	box-shadow: 0 2px 0 0 rgba(0,0,0,0.2);
+	border-radius: .5em;
+}
+
+div.code-toolbar > .toolbar a:hover,
+div.code-toolbar > .toolbar a:focus,
+div.code-toolbar > .toolbar button:hover,
+div.code-toolbar > .toolbar button:focus,
+div.code-toolbar > .toolbar span:hover,
+div.code-toolbar > .toolbar span:focus {
+	color: inherit;
+	text-decoration: none;
+}
+
diff --git a/addons/nkeditor/assets/plugins/code/prism.js b/addons/nkeditor/assets/plugins/code/prism.js
new file mode 100644
index 0000000..0f748e7
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/code/prism.js
@@ -0,0 +1,26 @@
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+csharp+bash+cpp+aspnet+ruby+markup-templating+go+markdown+php+python+sass+yaml&plugins=line-highlight+line-numbers+toolbar+highlight-keywords+show-language+copy-to-clipboard */
+var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof r?new r(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function(e,t){var r=n.util.type(e);switch(t=t||{},r){case"Object":if(t[n.util.objId(e)])return t[n.util.objId(e)];var a={};t[n.util.objId(e)]=a;for(var l in e)e.hasOwnProperty(l)&&(a[l]=n.util.clone(e[l],t));return a;case"Array":if(t[n.util.objId(e)])return t[n.util.objId(e)];var a=[];return t[n.util.objId(e)]=a,e.forEach(function(e,r){a[r]=n.util.clone(e,t)}),a}return e}},languages:{extend:function(e,t){var r=n.util.clone(n.languages[e]);for(var a in t)r[a]=t[a];return r},insertBefore:function(e,t,r,a){a=a||n.languages;var l=a[e];if(2==arguments.length){r=arguments[1];for(var i in r)r.hasOwnProperty(i)&&(l[i]=r[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in r)r.hasOwnProperty(i)&&(o[i]=r[i]);o[s]=l[s]}var u=a[e];return a[e]=o,n.languages.DFS(n.languages,function(t,n){n===u&&t!=e&&(this[t]=o)}),o},DFS:function(e,t,r,a){a=a||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],r||l),"Object"!==n.util.type(e[l])||a[n.util.objId(e[l])]?"Array"!==n.util.type(e[l])||a[n.util.objId(e[l])]||(a[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,a)):(a[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,a)))}},plugins:{},highlightAll:function(e,t){n.highlightAllUnder(document,e,t)},highlightAllUnder:function(e,t,r){var a={callback:r,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",a);for(var l,i=a.elements||e.querySelectorAll(a.selector),o=0;l=i[o++];)n.highlightElement(l,t===!0,a.callback)},highlightElement:function(t,r,a){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,""])[1].toLowerCase(),i=n.languages[l]),t.className=t.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,t.parentNode&&(o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+l));var s=t.textContent,u={element:t,language:l,grammar:i,code:s};if(n.hooks.run("before-sanity-check",u),!u.code||!u.grammar)return u.code&&(n.hooks.run("before-highlight",u),u.element.textContent=u.code,n.hooks.run("after-highlight",u)),n.hooks.run("complete",u),void 0;if(n.hooks.run("before-highlight",u),r&&_self.Worker){var g=new Worker(n.filename);g.onmessage=function(e){u.highlightedCode=e.data,n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,a&&a.call(u.element),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},g.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=n.highlight(u.code,u.grammar,u.language),n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,a&&a.call(t),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},highlight:function(e,t,a){var l={code:e,grammar:t,language:a};return n.hooks.run("before-tokenize",l),l.tokens=n.tokenize(l.code,l.grammar),n.hooks.run("after-tokenize",l),r.stringify(n.util.encode(l.tokens),l.language)},matchGrammar:function(e,t,r,a,l,i,o){var s=n.Token;for(var u in r)if(r.hasOwnProperty(u)&&r[u]){if(u==o)return;var g=r[u];g="Array"===n.util.type(g)?g:[g];for(var c=0;c<g.length;++c){var h=g[c],f=h.inside,d=!!h.lookbehind,m=!!h.greedy,p=0,y=h.alias;if(m&&!h.pattern.global){var v=h.pattern.toString().match(/[imuy]*$/)[0];h.pattern=RegExp(h.pattern.source,v+"g")}h=h.pattern||h;for(var b=a,k=l;b<t.length;k+=t[b].length,++b){var w=t[b];if(t.length>e.length)return;if(!(w instanceof s)){if(m&&b!=t.length-1){h.lastIndex=k;var _=h.exec(e);if(!_)break;for(var j=_.index+(d?_[1].length:0),P=_.index+_[0].length,A=b,x=k,O=t.length;O>A&&(P>x||!t[A].type&&!t[A-1].greedy);++A)x+=t[A].length,j>=x&&(++b,k=x);if(t[b]instanceof s)continue;I=A-b,w=e.slice(k,x),_.index-=k}else{h.lastIndex=0;var _=h.exec(w),I=1}if(_){d&&(p=_[1]?_[1].length:0);var j=_.index+p,_=_[0].slice(p),P=j+_.length,N=w.slice(0,j),S=w.slice(P),C=[b,I];N&&(++b,k+=N.length,C.push(N));var E=new s(u,f?n.tokenize(_,f):_,y,_,m);if(C.push(E),S&&C.push(S),Array.prototype.splice.apply(t,C),1!=I&&n.matchGrammar(e,t,r,b,k,!0,u),i)break}else if(i)break}}}}},tokenize:function(e,t){var r=[e],a=t.rest;if(a){for(var l in a)t[l]=a[l];delete t.rest}return n.matchGrammar(e,r,t,0,0,!1),r},hooks:{all:{},add:function(e,t){var r=n.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=n.hooks.all[e];if(r&&r.length)for(var a,l=0;a=r[l++];)a(t)}}},r=n.Token=function(e,t,n,r,a){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length,this.greedy=!!a};if(r.stringify=function(e,t,a){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return r.stringify(n,t,e)}).join("");var l={type:e.type,content:r.stringify(e.content,t,a),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:a};if(e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,"&quot;")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+"</"+l.tag+">"},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),r=t.language,a=t.code,l=t.immediateClose;_self.postMessage(n.highlight(a,n.languages[r],r)),l&&_self.close()},!1),_self.Prism):_self.Prism;var a=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return a&&(n.filename=a.src,n.manual||a.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
+Prism.languages.markup={comment:/<!--[\s\S]*?-->/,prolog:/<\?[\s\S]+?\?>/,doctype:/<!DOCTYPE[\s\S]+?>/i,cdata:/<!\[CDATA\[[\s\S]*?]]>/i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;
+Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));
+Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/};
+Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},/\b(?:as|async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/],number:/\b(?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,"function":/[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\(|\.(?:apply|bind|call)\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^\/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<script[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript;
+Prism.languages.c=Prism.languages.extend("clike",{keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*\/%&|^!=<>]=?/,number:/(?:\b0x[\da-f]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["class-name"],delete Prism.languages.c["boolean"];
+Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.csharp;
+!function(e){var t={variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\([^)]+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},/\$(?:[\w#?*!@]+|\{[^}]+\})/i]};e.languages.bash={shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"},comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\s*)["']?(\w+?)["']?\s*\r?\n(?:[\s\S])*?\r?\n\2/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:t}],variable:t.variable,"function":{pattern:/(^|[\s;|&])(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|npm|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|[\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&])(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|[\s;|&])/,lookbehind:!0},"boolean":{pattern:/(^|[\s;|&])(?:true|false)(?=$|[\s;|&])/,lookbehind:!0},operator:/&&?|\|\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];]/};var a=t.variable[1].inside;a.string=e.languages.bash.string,a["function"]=e.languages.bash["function"],a.keyword=e.languages.bash.keyword,a["boolean"]=e.languages.bash["boolean"],a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation,e.languages.shell=e.languages.bash}(Prism);
+Prism.languages.cpp=Prism.languages.extend("c",{keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(?:true|false)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*\/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),Prism.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)\w+/i,lookbehind:!0}}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}});
+Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive tag":{pattern:/<%\s*@.*%>/i,inside:{"page-directive tag":/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,rest:Prism.languages.markup.tag.inside}},"directive tag":{pattern:/<%.*%>/i,inside:{"directive tag":/<%\s*?[$=%#:]{0,2}|%>/i,rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("inside","punctuation",{"directive tag":Prism.languages.aspnet["directive tag"]},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp comment":/<%--[\s\S]*?--%>/}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp script":{pattern:/(<script(?=.*runat=['"]?server['"]?)[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.csharp||{}}});
+!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin(?:\r?\n|\r)(?:.*(?:\r?\n|\r))*?=end/m,greedy:!0}],keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}]}(Prism);
+Prism.languages["markup-templating"]={},Object.defineProperties(Prism.languages["markup-templating"],{buildPlaceholders:{value:function(e,t,n,a){e.language===t&&(e.tokenStack=[],e.code=e.code.replace(n,function(n){if("function"==typeof a&&!a(n))return n;for(var r=e.tokenStack.length;-1!==e.code.indexOf("___"+t.toUpperCase()+r+"___");)++r;return e.tokenStack[r]=n,"___"+t.toUpperCase()+r+"___"}),e.grammar=Prism.languages.markup)}},tokenizePlaceholders:{value:function(e,t){if(e.language===t&&e.tokenStack){e.grammar=Prism.languages[t];var n=0,a=Object.keys(e.tokenStack),r=function(o){if(!(n>=a.length))for(var i=0;i<o.length;i++){var g=o[i];if("string"==typeof g||g.content&&"string"==typeof g.content){var c=a[n],s=e.tokenStack[c],l="string"==typeof g?g:g.content,p=l.indexOf("___"+t.toUpperCase()+c+"___");if(p>-1){++n;var f,u=l.substring(0,p),_=new Prism.Token(t,Prism.tokenize(s,e.grammar,t),"language-"+t,s),k=l.substring(p+("___"+t.toUpperCase()+c+"___").length);if(u||k?(f=[u,_,k].filter(function(e){return!!e}),r(f)):f=_,"string"==typeof g?Array.prototype.splice.apply(o,[i,1].concat(f)):g.content=f,n>=a.length)break}}else g.content&&"string"!=typeof g.content&&r(g.content)}};r(e.tokens)}}}});
+Prism.languages.go=Prism.languages.extend("clike",{keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,"boolean":/\b(?:_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete Prism.languages.go["class-name"];
+Prism.languages.markdown=Prism.languages.extend("markup",{}),Prism.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},code:[{pattern:/^(?: {4}|\t).+/m,alias:"keyword"},{pattern:/``.+?``|`[^`\n]+`/,alias:"keyword"}],title:[{pattern:/\w+.*(?:\r?\n|\r)(?:==+|--+)/,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:/(^|[^\\])(\*\*|__)(?:(?:\r?\n|\r)(?!\r?\n|\r)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^\*\*|^__|\*\*$|__$/}},italic:{pattern:/(^|[^\\])([*_])(?:(?:\r?\n|\r)(?!\r?\n|\r)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^[*_]|[*_]$/}},url:{pattern:/!?\[[^\]]+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)| ?\[[^\]\n]*\])/,inside:{variable:{pattern:/(!?\[)[^\]]+(?=\]$)/,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),Prism.languages.markdown.bold.inside.url=Prism.languages.markdown.url,Prism.languages.markdown.italic.inside.url=Prism.languages.markdown.url,Prism.languages.markdown.bold.inside.italic=Prism.languages.markdown.italic,Prism.languages.markdown.italic.inside.bold=Prism.languages.markdown.bold;
+!function(e){e.languages.php=e.languages.extend("clike",{keyword:/\b(?:and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),e.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),e.languages.insertBefore("php","keyword",{delimiter:{pattern:/\?>|<\?(?:php|=)?/i,alias:"important"},variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),e.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var n={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:{rest:e.languages.php}};e.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:n}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:n}}}),delete e.languages.php.string,e.hooks.add("before-tokenize",function(n){if(/(?:<\?php|<\?)/gi.test(n.code)){var t=/(?:<\?php|<\?)[\s\S]*?(?:\?>|$)/gi;e.languages["markup-templating"].buildPlaceholders(n,"php",t)}}),e.hooks.add("after-tokenize",function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"php")})}(Prism);
+Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"triple-quoted-string":{pattern:/("""|''')[\s\S]+?\1/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/};
+!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t]+.+)*/m,lookbehind:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var a=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s+)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,inside:{punctuation:/:/,variable:a,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s]+.*)/m,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:a,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,delete e.languages.sass.selector,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/([ \t]*)\S(?:,?[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,?[^,\r\n]+)*)*/,lookbehind:!0}})}(Prism);
+Prism.languages.yaml={scalar:{pattern:/([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:/(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,alias:"number"},"boolean":{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},"null":{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,greedy:!0},number:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./};
+!function(){function e(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function t(e,t){return t=" "+t+" ",(" "+e.className+" ").replace(/[\n\t]/g," ").indexOf(t)>-1}function n(e,n,i){n="string"==typeof n?n:e.getAttribute("data-line");for(var o,l=n.replace(/\s+/g,"").split(","),a=+e.getAttribute("data-line-offset")||0,s=r()?parseInt:parseFloat,d=s(getComputedStyle(e).lineHeight),u=t(e,"line-numbers"),c=0;o=l[c++];){var p=o.split("-"),m=+p[0],f=+p[1]||m,h=e.querySelector('.line-highlight[data-range="'+o+'"]')||document.createElement("div");if(h.setAttribute("aria-hidden","true"),h.setAttribute("data-range",o),h.className=(i||"")+" line-highlight",u&&Prism.plugins.lineNumbers){var g=Prism.plugins.lineNumbers.getLine(e,m),y=Prism.plugins.lineNumbers.getLine(e,f);g&&(h.style.top=g.offsetTop+"px"),y&&(h.style.height=y.offsetTop-g.offsetTop+y.offsetHeight+"px")}else h.setAttribute("data-start",m),f>m&&h.setAttribute("data-end",f),h.style.top=(m-a-1)*d+"px",h.textContent=new Array(f-m+2).join(" \n");u?e.appendChild(h):(e.querySelector("code")||e).appendChild(h)}}function i(){var t=location.hash.slice(1);e(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var i=(t.match(/\.([\d,-]+)$/)||[,""])[1];if(i&&!document.getElementById(t)){var r=t.slice(0,t.lastIndexOf(".")),o=document.getElementById(r);o&&(o.hasAttribute("data-line")||o.setAttribute("data-line",""),n(o,i,"temporary "),document.querySelector(".temporary.line-highlight").scrollIntoView())}}if("undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector){var r=function(){var e;return function(){if("undefined"==typeof e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding=0,t.style.border=0,t.innerHTML="&nbsp;<br />&nbsp;",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}}(),o=0;Prism.hooks.add("before-sanity-check",function(t){var n=t.element.parentNode,i=n&&n.getAttribute("data-line");if(n&&i&&/pre/i.test(n.nodeName)){var r=0;e(".line-highlight",n).forEach(function(e){r+=e.textContent.length,e.parentNode.removeChild(e)}),r&&/^( \n)+$/.test(t.code.slice(-r))&&(t.code=t.code.slice(0,-r))}}),Prism.hooks.add("complete",function l(e){var r=e.element.parentNode,a=r&&r.getAttribute("data-line");if(r&&a&&/pre/i.test(r.nodeName)){clearTimeout(o);var s=Prism.plugins.lineNumbers,d=e.plugins&&e.plugins.lineNumbers;t(r,"line-numbers")&&s&&!d?Prism.hooks.add("line-numbers",l):(n(r,a),o=setTimeout(i,1))}}),window.addEventListener("hashchange",i),window.addEventListener("resize",function(){var e=document.querySelectorAll("pre[data-line]");Array.prototype.forEach.call(e,function(e){n(e)})})}}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e="line-numbers",t=/\n(?!$)/g,n=function(e){var n=r(e),s=n["white-space"];if("pre-wrap"===s||"pre-line"===s){var l=e.querySelector("code"),i=e.querySelector(".line-numbers-rows"),a=e.querySelector(".line-numbers-sizer"),o=l.textContent.split(t);a||(a=document.createElement("span"),a.className="line-numbers-sizer",l.appendChild(a)),a.style.display="block",o.forEach(function(e,t){a.textContent=e||"\n";var n=a.getBoundingClientRect().height;i.children[t].style.height=n+"px"}),a.textContent="",a.style.display="none"}},r=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null};window.addEventListener("resize",function(){Array.prototype.forEach.call(document.querySelectorAll("pre."+e),n)}),Prism.hooks.add("complete",function(e){if(e.code){var r=e.element.parentNode,s=/\s*\bline-numbers\b\s*/;if(r&&/pre/i.test(r.nodeName)&&(s.test(r.className)||s.test(e.element.className))&&!e.element.querySelector(".line-numbers-rows")){s.test(e.element.className)&&(e.element.className=e.element.className.replace(s," ")),s.test(r.className)||(r.className+=" line-numbers");var l,i=e.code.match(t),a=i?i.length+1:1,o=new Array(a+1);o=o.join("<span></span>"),l=document.createElement("span"),l.setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=o,r.hasAttribute("data-start")&&(r.style.counterReset="linenumber "+(parseInt(r.getAttribute("data-start"),10)-1)),e.element.appendChild(l),n(r),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}),Prism.plugins.lineNumbers={getLine:function(t,n){if("PRE"===t.tagName&&t.classList.contains(e)){var r=t.querySelector(".line-numbers-rows"),s=parseInt(t.getAttribute("data-start"),10)||1,l=s+(r.children.length-1);s>n&&(n=s),n>l&&(n=l);var i=n-s;return r.children[i]}}}}}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var t=[],e={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var o;o="function"==typeof a?a:function(t){var e;return"function"==typeof a.onClick?(e=document.createElement("button"),e.type="button",e.addEventListener("click",function(){a.onClick.call(this,t)})):"string"==typeof a.url?(e=document.createElement("a"),e.href=a.url):e=document.createElement("span"),e.textContent=a.text,e},t.push(e[n]=o)},o=Prism.plugins.toolbar.hook=function(a){var o=a.element.parentNode;if(o&&/pre/i.test(o.nodeName)&&!o.parentNode.classList.contains("code-toolbar")){var r=document.createElement("div");r.classList.add("code-toolbar"),o.parentNode.insertBefore(r,o),r.appendChild(o);var i=document.createElement("div");i.classList.add("toolbar"),document.body.hasAttribute("data-toolbar-order")&&(t=document.body.getAttribute("data-toolbar-order").split(",").map(function(t){return e[t]||n})),t.forEach(function(t){var e=t(a);if(e){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(e),i.appendChild(n)}}),r.appendChild(i)}};a("label",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-label")){var n,a,o=e.getAttribute("data-label");try{a=document.querySelector("template#"+o)}catch(r){}return a?n=a.content:(e.hasAttribute("data-url")?(n=document.createElement("a"),n.href=e.getAttribute("data-url")):n=document.createElement("span"),n.textContent=o),n}}),Prism.hooks.add("complete",o)}}();
+!function(){"undefined"!=typeof self&&!self.Prism||"undefined"!=typeof global&&!global.Prism||Prism.hooks.add("wrap",function(e){"keyword"===e.type&&e.classes.push("keyword-"+e.content)})}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Show Languages plugin loaded before Toolbar plugin."),void 0;var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",arff:"ARFF",asciidoc:"AsciiDoc",asm6502:"6502 Assembly",aspnet:"ASP.NET (C#)",autohotkey:"AutoHotkey",autoit:"AutoIt",shell:"Shell",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript",csp:"Content-Security-Policy","css-extras":"CSS Extras",django:"Django/Jinja2",erb:"ERB",fsharp:"F#",gedcom:"GEDCOM",glsl:"GLSL",graphql:"GraphQL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam",inform7:"Inform 7",json:"JSON",jsonp:"JSONP",latex:"LaTeX",livescript:"LiveScript",lolcode:"LOLCODE","markup-templating":"Markup templating",matlab:"MATLAB",mel:"MEL",n4js:"N4JS",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",parigp:"PARI/GP",objectpascal:"Object Pascal",php:"PHP","php-extras":"PHP Extras",plsql:"PL/SQL",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",q:"Q (kdb+ database)",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",soy:"Soy (Closure Template)",tap:"TAP",tt2:"Template Toolkit 2",typescript:"TypeScript",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",wasm:"WebAssembly",wiki:"Wiki markup",xeoracube:"XeoraCube",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var s=t.getAttribute("data-language")||e[a.language]||a.language&&a.language.substring(0,1).toUpperCase()+a.language.substring(1);if(s){var i=document.createElement("span");return i.textContent=s,i}}})}}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."),void 0;var o=window.ClipboardJS||void 0;o||"function"!=typeof require||(o=require("clipboard"));var e=[];if(!o){var t=document.createElement("script"),n=document.querySelector("head");t.onload=function(){if(o=window.ClipboardJS)for(;e.length;)e.pop()()},t.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",n.appendChild(t)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(t){function n(){var e=new o(i,{text:function(){return t.code}});e.on("success",function(){i.textContent="Copied!",r()}),e.on("error",function(){i.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){i.textContent="Copy"},5e3)}var i=document.createElement("a");return i.textContent="Copy",o?n():e.push(n),i})}}();
diff --git a/addons/nkeditor/assets/plugins/emoticons/emoticons.js b/addons/nkeditor/assets/plugins/emoticons/emoticons.js
new file mode 100644
index 0000000..a990066
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/emoticons/emoticons.js
@@ -0,0 +1,129 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('emoticons', function(K) {
+	var self = this, name = 'emoticons',
+		path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'),
+		allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons,
+		currentPageNum = 1;
+	self.clickToolbar(name, function() {
+		var rows = 5, cols = 9, total = 135, startNum = 0,
+			cells = rows * cols, pages = Math.ceil(total / cells),
+			colsHalf = Math.floor(cols / 2),
+			wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'),
+			elements = [],
+			menu = self.createMenu({
+				name : name,
+				beforeRemove : function() {
+					removeEvent();
+				}
+			});
+		menu.div.append(wrapperDiv);
+		var previewDiv, previewImg;
+		if (allowPreview) {
+			previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
+			previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />');
+			wrapperDiv.append(previewDiv);
+			previewDiv.append(previewImg);
+		}
+		function bindCellEvent(cell, j, num) {
+			if (previewDiv) {
+				cell.mouseover(function() {
+					if (j > colsHalf) {
+						previewDiv.css('left', 0);
+						previewDiv.css('right', '');
+					} else {
+						previewDiv.css('left', '');
+						previewDiv.css('right', 0);
+					}
+					previewImg.attr('src', path + num + '.gif');
+					K(this).addClass('ke-on');
+				});
+			} else {
+				cell.mouseover(function() {
+					K(this).addClass('ke-on');
+				});
+			}
+			cell.mouseout(function() {
+				K(this).removeClass('ke-on');
+			});
+			cell.click(function(e) {
+				self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus();
+				e.stop();
+			});
+		}
+		function createEmoticonsTable(pageNum, parentDiv) {
+			var table = document.createElement('table');
+			parentDiv.append(table);
+			if (previewDiv) {
+				K(table).mouseover(function() {
+					previewDiv.show('block');
+				});
+				K(table).mouseout(function() {
+					previewDiv.hide();
+				});
+				elements.push(K(table));
+			}
+			table.className = 'ke-table';
+			table.cellPadding = 0;
+			table.cellSpacing = 0;
+			table.border = 0;
+			var num = (pageNum - 1) * cells + startNum;
+			for (var i = 0; i < rows; i++) {
+				var row = table.insertRow(i);
+				for (var j = 0; j < cols; j++) {
+					var cell = K(row.insertCell(j));
+					cell.addClass('ke-cell');
+					bindCellEvent(cell, j, num);
+					var span = K('<span class="ke-img"></span>')
+						.css('background-position', '-' + (24 * num) + 'px 0px')
+						.css('background-image', 'url(' + path + 'static.gif)');
+					cell.append(span);
+					elements.push(cell);
+					num++;
+				}
+			}
+			return table;
+		}
+		var table = createEmoticonsTable(currentPageNum, wrapperDiv);
+		function removeEvent() {
+			K.each(elements, function() {
+				this.unbind();
+			});
+		}
+		var pageDiv;
+		function bindPageEvent(el, pageNum) {
+			el.click(function(e) {
+				removeEvent();
+				table.parentNode.removeChild(table);
+				pageDiv.remove();
+				table = createEmoticonsTable(pageNum, wrapperDiv);
+				createPageTable(pageNum);
+				currentPageNum = pageNum;
+				e.stop();
+			});
+		}
+		function createPageTable(currentPageNum) {
+			pageDiv = K('<div class="ke-page"></div>');
+			wrapperDiv.append(pageDiv);
+			for (var pageNum = 1; pageNum <= pages; pageNum++) {
+				if (currentPageNum !== pageNum) {
+					var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
+					bindPageEvent(a, pageNum);
+					pageDiv.append(a);
+					elements.push(a);
+				} else {
+					pageDiv.append(K('@[' + pageNum + ']'));
+				}
+				pageDiv.append(K('@&nbsp;'));
+			}
+		}
+		createPageTable(currentPageNum);
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/0.gif b/addons/nkeditor/assets/plugins/emoticons/images/0.gif
new file mode 100644
index 0000000..5be27cb
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/0.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/1.gif b/addons/nkeditor/assets/plugins/emoticons/images/1.gif
new file mode 100644
index 0000000..a2644a9
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/1.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/10.gif b/addons/nkeditor/assets/plugins/emoticons/images/10.gif
new file mode 100644
index 0000000..905c15b
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/10.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/100.gif b/addons/nkeditor/assets/plugins/emoticons/images/100.gif
new file mode 100644
index 0000000..92ad35d
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/100.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/101.gif b/addons/nkeditor/assets/plugins/emoticons/images/101.gif
new file mode 100644
index 0000000..1f27663
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/101.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/102.gif b/addons/nkeditor/assets/plugins/emoticons/images/102.gif
new file mode 100644
index 0000000..748ded1
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/102.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/103.gif b/addons/nkeditor/assets/plugins/emoticons/images/103.gif
new file mode 100644
index 0000000..be9eaa0
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/103.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/104.gif b/addons/nkeditor/assets/plugins/emoticons/images/104.gif
new file mode 100644
index 0000000..d7c2066
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/104.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/105.gif b/addons/nkeditor/assets/plugins/emoticons/images/105.gif
new file mode 100644
index 0000000..2f353ca
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/105.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/106.gif b/addons/nkeditor/assets/plugins/emoticons/images/106.gif
new file mode 100644
index 0000000..5193534
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/106.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/107.gif b/addons/nkeditor/assets/plugins/emoticons/images/107.gif
new file mode 100644
index 0000000..70d38d3
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/107.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/108.gif b/addons/nkeditor/assets/plugins/emoticons/images/108.gif
new file mode 100644
index 0000000..749d500
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/108.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/109.gif b/addons/nkeditor/assets/plugins/emoticons/images/109.gif
new file mode 100644
index 0000000..6f57d56
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/109.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/11.gif b/addons/nkeditor/assets/plugins/emoticons/images/11.gif
new file mode 100644
index 0000000..b512dd5
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/11.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/110.gif b/addons/nkeditor/assets/plugins/emoticons/images/110.gif
new file mode 100644
index 0000000..e253abc
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/110.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/111.gif b/addons/nkeditor/assets/plugins/emoticons/images/111.gif
new file mode 100644
index 0000000..0c56723
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/111.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/112.gif b/addons/nkeditor/assets/plugins/emoticons/images/112.gif
new file mode 100644
index 0000000..c8ddce8
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/112.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/113.gif b/addons/nkeditor/assets/plugins/emoticons/images/113.gif
new file mode 100644
index 0000000..2727104
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/113.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/114.gif b/addons/nkeditor/assets/plugins/emoticons/images/114.gif
new file mode 100644
index 0000000..53918e2
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/114.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/115.gif b/addons/nkeditor/assets/plugins/emoticons/images/115.gif
new file mode 100644
index 0000000..4db3369
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/115.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/116.gif b/addons/nkeditor/assets/plugins/emoticons/images/116.gif
new file mode 100644
index 0000000..57326bd
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/116.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/117.gif b/addons/nkeditor/assets/plugins/emoticons/images/117.gif
new file mode 100644
index 0000000..14611b6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/117.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/118.gif b/addons/nkeditor/assets/plugins/emoticons/images/118.gif
new file mode 100644
index 0000000..8c25500
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/118.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/119.gif b/addons/nkeditor/assets/plugins/emoticons/images/119.gif
new file mode 100644
index 0000000..65bb468
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/119.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/12.gif b/addons/nkeditor/assets/plugins/emoticons/images/12.gif
new file mode 100644
index 0000000..547529c
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/12.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/120.gif b/addons/nkeditor/assets/plugins/emoticons/images/120.gif
new file mode 100644
index 0000000..5ce77c0
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/120.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/121.gif b/addons/nkeditor/assets/plugins/emoticons/images/121.gif
new file mode 100644
index 0000000..a021aba
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/121.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/122.gif b/addons/nkeditor/assets/plugins/emoticons/images/122.gif
new file mode 100644
index 0000000..9a79e11
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/122.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/123.gif b/addons/nkeditor/assets/plugins/emoticons/images/123.gif
new file mode 100644
index 0000000..b9480be
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/123.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/124.gif b/addons/nkeditor/assets/plugins/emoticons/images/124.gif
new file mode 100644
index 0000000..7fed477
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/124.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/125.gif b/addons/nkeditor/assets/plugins/emoticons/images/125.gif
new file mode 100644
index 0000000..e2c3c11
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/125.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/126.gif b/addons/nkeditor/assets/plugins/emoticons/images/126.gif
new file mode 100644
index 0000000..24105c9
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/126.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/127.gif b/addons/nkeditor/assets/plugins/emoticons/images/127.gif
new file mode 100644
index 0000000..0cead36
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/127.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/128.gif b/addons/nkeditor/assets/plugins/emoticons/images/128.gif
new file mode 100644
index 0000000..3185861
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/128.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/129.gif b/addons/nkeditor/assets/plugins/emoticons/images/129.gif
new file mode 100644
index 0000000..ffd7c6b
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/129.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/13.gif b/addons/nkeditor/assets/plugins/emoticons/images/13.gif
new file mode 100644
index 0000000..3475300
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/13.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/130.gif b/addons/nkeditor/assets/plugins/emoticons/images/130.gif
new file mode 100644
index 0000000..d828e3d
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/130.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/131.gif b/addons/nkeditor/assets/plugins/emoticons/images/131.gif
new file mode 100644
index 0000000..dcb096f
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/131.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/132.gif b/addons/nkeditor/assets/plugins/emoticons/images/132.gif
new file mode 100644
index 0000000..1b272a6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/132.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/133.gif b/addons/nkeditor/assets/plugins/emoticons/images/133.gif
new file mode 100644
index 0000000..0d0e864
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/133.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/134.gif b/addons/nkeditor/assets/plugins/emoticons/images/134.gif
new file mode 100644
index 0000000..cf48356
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/134.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/14.gif b/addons/nkeditor/assets/plugins/emoticons/images/14.gif
new file mode 100644
index 0000000..6a788f8
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/14.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/15.gif b/addons/nkeditor/assets/plugins/emoticons/images/15.gif
new file mode 100644
index 0000000..debab8e
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/15.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/16.gif b/addons/nkeditor/assets/plugins/emoticons/images/16.gif
new file mode 100644
index 0000000..ed5d29f
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/16.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/17.gif b/addons/nkeditor/assets/plugins/emoticons/images/17.gif
new file mode 100644
index 0000000..85886fe
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/17.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/18.gif b/addons/nkeditor/assets/plugins/emoticons/images/18.gif
new file mode 100644
index 0000000..b6af218
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/18.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/19.gif b/addons/nkeditor/assets/plugins/emoticons/images/19.gif
new file mode 100644
index 0000000..e045ff2
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/19.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/2.gif b/addons/nkeditor/assets/plugins/emoticons/images/2.gif
new file mode 100644
index 0000000..40cfda4
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/2.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/20.gif b/addons/nkeditor/assets/plugins/emoticons/images/20.gif
new file mode 100644
index 0000000..efd650f
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/20.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/21.gif b/addons/nkeditor/assets/plugins/emoticons/images/21.gif
new file mode 100644
index 0000000..cb8cf6d
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/21.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/22.gif b/addons/nkeditor/assets/plugins/emoticons/images/22.gif
new file mode 100644
index 0000000..96b04df
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/22.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/23.gif b/addons/nkeditor/assets/plugins/emoticons/images/23.gif
new file mode 100644
index 0000000..96516b8
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/23.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/24.gif b/addons/nkeditor/assets/plugins/emoticons/images/24.gif
new file mode 100644
index 0000000..5f925c7
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/24.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/25.gif b/addons/nkeditor/assets/plugins/emoticons/images/25.gif
new file mode 100644
index 0000000..97f8b1a
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/25.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/26.gif b/addons/nkeditor/assets/plugins/emoticons/images/26.gif
new file mode 100644
index 0000000..a7cded7
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/26.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/27.gif b/addons/nkeditor/assets/plugins/emoticons/images/27.gif
new file mode 100644
index 0000000..bb46890
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/27.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/28.gif b/addons/nkeditor/assets/plugins/emoticons/images/28.gif
new file mode 100644
index 0000000..f59dd58
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/28.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/29.gif b/addons/nkeditor/assets/plugins/emoticons/images/29.gif
new file mode 100644
index 0000000..3c5227e
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/29.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/3.gif b/addons/nkeditor/assets/plugins/emoticons/images/3.gif
new file mode 100644
index 0000000..6d6f762
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/3.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/30.gif b/addons/nkeditor/assets/plugins/emoticons/images/30.gif
new file mode 100644
index 0000000..e24a180
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/30.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/31.gif b/addons/nkeditor/assets/plugins/emoticons/images/31.gif
new file mode 100644
index 0000000..073e743
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/31.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/32.gif b/addons/nkeditor/assets/plugins/emoticons/images/32.gif
new file mode 100644
index 0000000..772eff2
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/32.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/33.gif b/addons/nkeditor/assets/plugins/emoticons/images/33.gif
new file mode 100644
index 0000000..217c1c5
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/33.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/34.gif b/addons/nkeditor/assets/plugins/emoticons/images/34.gif
new file mode 100644
index 0000000..e9d4213
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/34.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/35.gif b/addons/nkeditor/assets/plugins/emoticons/images/35.gif
new file mode 100644
index 0000000..d6da2c3
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/35.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/36.gif b/addons/nkeditor/assets/plugins/emoticons/images/36.gif
new file mode 100644
index 0000000..c1e6ac9
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/36.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/37.gif b/addons/nkeditor/assets/plugins/emoticons/images/37.gif
new file mode 100644
index 0000000..92efec6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/37.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/38.gif b/addons/nkeditor/assets/plugins/emoticons/images/38.gif
new file mode 100644
index 0000000..489f0f9
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/38.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/39.gif b/addons/nkeditor/assets/plugins/emoticons/images/39.gif
new file mode 100644
index 0000000..734f6d8
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/39.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/4.gif b/addons/nkeditor/assets/plugins/emoticons/images/4.gif
new file mode 100644
index 0000000..6ccdaa2
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/4.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/40.gif b/addons/nkeditor/assets/plugins/emoticons/images/40.gif
new file mode 100644
index 0000000..24a8eb6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/40.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/41.gif b/addons/nkeditor/assets/plugins/emoticons/images/41.gif
new file mode 100644
index 0000000..99139e1
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/41.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/42.gif b/addons/nkeditor/assets/plugins/emoticons/images/42.gif
new file mode 100644
index 0000000..f60897e
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/42.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/43.gif b/addons/nkeditor/assets/plugins/emoticons/images/43.gif
new file mode 100644
index 0000000..4350491
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/43.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/44.gif b/addons/nkeditor/assets/plugins/emoticons/images/44.gif
new file mode 100644
index 0000000..650d3dd
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/44.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/45.gif b/addons/nkeditor/assets/plugins/emoticons/images/45.gif
new file mode 100644
index 0000000..5c8e071
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/45.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/46.gif b/addons/nkeditor/assets/plugins/emoticons/images/46.gif
new file mode 100644
index 0000000..f3cb074
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/46.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/47.gif b/addons/nkeditor/assets/plugins/emoticons/images/47.gif
new file mode 100644
index 0000000..5b3057a
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/47.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/48.gif b/addons/nkeditor/assets/plugins/emoticons/images/48.gif
new file mode 100644
index 0000000..27a30c1
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/48.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/49.gif b/addons/nkeditor/assets/plugins/emoticons/images/49.gif
new file mode 100644
index 0000000..dcfa48a
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/49.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/5.gif b/addons/nkeditor/assets/plugins/emoticons/images/5.gif
new file mode 100644
index 0000000..ab0b81b
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/5.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/50.gif b/addons/nkeditor/assets/plugins/emoticons/images/50.gif
new file mode 100644
index 0000000..029cf0f
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/50.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/51.gif b/addons/nkeditor/assets/plugins/emoticons/images/51.gif
new file mode 100644
index 0000000..69f183f
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/51.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/52.gif b/addons/nkeditor/assets/plugins/emoticons/images/52.gif
new file mode 100644
index 0000000..d41e8aa
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/52.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/53.gif b/addons/nkeditor/assets/plugins/emoticons/images/53.gif
new file mode 100644
index 0000000..56352dd
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/53.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/54.gif b/addons/nkeditor/assets/plugins/emoticons/images/54.gif
new file mode 100644
index 0000000..b28d848
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/54.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/55.gif b/addons/nkeditor/assets/plugins/emoticons/images/55.gif
new file mode 100644
index 0000000..e18da84
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/55.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/56.gif b/addons/nkeditor/assets/plugins/emoticons/images/56.gif
new file mode 100644
index 0000000..edf96f0
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/56.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/57.gif b/addons/nkeditor/assets/plugins/emoticons/images/57.gif
new file mode 100644
index 0000000..3f0e2b9
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/57.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/58.gif b/addons/nkeditor/assets/plugins/emoticons/images/58.gif
new file mode 100644
index 0000000..47b1aaa
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/58.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/59.gif b/addons/nkeditor/assets/plugins/emoticons/images/59.gif
new file mode 100644
index 0000000..918288b
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/59.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/6.gif b/addons/nkeditor/assets/plugins/emoticons/images/6.gif
new file mode 100644
index 0000000..ceab122
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/6.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/60.gif b/addons/nkeditor/assets/plugins/emoticons/images/60.gif
new file mode 100644
index 0000000..66d2113
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/60.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/61.gif b/addons/nkeditor/assets/plugins/emoticons/images/61.gif
new file mode 100644
index 0000000..034933e
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/61.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/62.gif b/addons/nkeditor/assets/plugins/emoticons/images/62.gif
new file mode 100644
index 0000000..8d5c4fd
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/62.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/63.gif b/addons/nkeditor/assets/plugins/emoticons/images/63.gif
new file mode 100644
index 0000000..d58fcf6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/63.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/64.gif b/addons/nkeditor/assets/plugins/emoticons/images/64.gif
new file mode 100644
index 0000000..c4e00bd
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/64.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/65.gif b/addons/nkeditor/assets/plugins/emoticons/images/65.gif
new file mode 100644
index 0000000..da23bfa
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/65.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/66.gif b/addons/nkeditor/assets/plugins/emoticons/images/66.gif
new file mode 100644
index 0000000..310ec65
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/66.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/67.gif b/addons/nkeditor/assets/plugins/emoticons/images/67.gif
new file mode 100644
index 0000000..51761ba
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/67.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/68.gif b/addons/nkeditor/assets/plugins/emoticons/images/68.gif
new file mode 100644
index 0000000..345cb43
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/68.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/69.gif b/addons/nkeditor/assets/plugins/emoticons/images/69.gif
new file mode 100644
index 0000000..e0f28a0
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/69.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/7.gif b/addons/nkeditor/assets/plugins/emoticons/images/7.gif
new file mode 100644
index 0000000..2f45399
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/7.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/70.gif b/addons/nkeditor/assets/plugins/emoticons/images/70.gif
new file mode 100644
index 0000000..24284cf
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/70.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/71.gif b/addons/nkeditor/assets/plugins/emoticons/images/71.gif
new file mode 100644
index 0000000..a0ccf2e
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/71.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/72.gif b/addons/nkeditor/assets/plugins/emoticons/images/72.gif
new file mode 100644
index 0000000..7e113ee
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/72.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/73.gif b/addons/nkeditor/assets/plugins/emoticons/images/73.gif
new file mode 100644
index 0000000..c0293c3
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/73.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/74.gif b/addons/nkeditor/assets/plugins/emoticons/images/74.gif
new file mode 100644
index 0000000..1c52bde
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/74.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/75.gif b/addons/nkeditor/assets/plugins/emoticons/images/75.gif
new file mode 100644
index 0000000..9cb9aa7
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/75.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/76.gif b/addons/nkeditor/assets/plugins/emoticons/images/76.gif
new file mode 100644
index 0000000..27019f8
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/76.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/77.gif b/addons/nkeditor/assets/plugins/emoticons/images/77.gif
new file mode 100644
index 0000000..8f882f5
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/77.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/78.gif b/addons/nkeditor/assets/plugins/emoticons/images/78.gif
new file mode 100644
index 0000000..d0d0856
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/78.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/79.gif b/addons/nkeditor/assets/plugins/emoticons/images/79.gif
new file mode 100644
index 0000000..61652a7
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/79.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/8.gif b/addons/nkeditor/assets/plugins/emoticons/images/8.gif
new file mode 100644
index 0000000..f6c8834
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/8.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/80.gif b/addons/nkeditor/assets/plugins/emoticons/images/80.gif
new file mode 100644
index 0000000..9a77936
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/80.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/81.gif b/addons/nkeditor/assets/plugins/emoticons/images/81.gif
new file mode 100644
index 0000000..2329101
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/81.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/82.gif b/addons/nkeditor/assets/plugins/emoticons/images/82.gif
new file mode 100644
index 0000000..644748a
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/82.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/83.gif b/addons/nkeditor/assets/plugins/emoticons/images/83.gif
new file mode 100644
index 0000000..fbf275b
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/83.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/84.gif b/addons/nkeditor/assets/plugins/emoticons/images/84.gif
new file mode 100644
index 0000000..076f0c6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/84.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/85.gif b/addons/nkeditor/assets/plugins/emoticons/images/85.gif
new file mode 100644
index 0000000..d254af4
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/85.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/86.gif b/addons/nkeditor/assets/plugins/emoticons/images/86.gif
new file mode 100644
index 0000000..8f09d33
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/86.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/87.gif b/addons/nkeditor/assets/plugins/emoticons/images/87.gif
new file mode 100644
index 0000000..df70756
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/87.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/88.gif b/addons/nkeditor/assets/plugins/emoticons/images/88.gif
new file mode 100644
index 0000000..4d8b15e
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/88.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/89.gif b/addons/nkeditor/assets/plugins/emoticons/images/89.gif
new file mode 100644
index 0000000..05726dc
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/89.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/9.gif b/addons/nkeditor/assets/plugins/emoticons/images/9.gif
new file mode 100644
index 0000000..c2d8450
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/9.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/90.gif b/addons/nkeditor/assets/plugins/emoticons/images/90.gif
new file mode 100644
index 0000000..adaf20e
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/90.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/91.gif b/addons/nkeditor/assets/plugins/emoticons/images/91.gif
new file mode 100644
index 0000000..608d0ad
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/91.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/92.gif b/addons/nkeditor/assets/plugins/emoticons/images/92.gif
new file mode 100644
index 0000000..b909e16
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/92.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/93.gif b/addons/nkeditor/assets/plugins/emoticons/images/93.gif
new file mode 100644
index 0000000..7f71a8c
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/93.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/94.gif b/addons/nkeditor/assets/plugins/emoticons/images/94.gif
new file mode 100644
index 0000000..4f26d7d
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/94.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/95.gif b/addons/nkeditor/assets/plugins/emoticons/images/95.gif
new file mode 100644
index 0000000..5ef6d38
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/95.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/96.gif b/addons/nkeditor/assets/plugins/emoticons/images/96.gif
new file mode 100644
index 0000000..2b709e1
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/96.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/97.gif b/addons/nkeditor/assets/plugins/emoticons/images/97.gif
new file mode 100644
index 0000000..cf29be8
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/97.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/98.gif b/addons/nkeditor/assets/plugins/emoticons/images/98.gif
new file mode 100644
index 0000000..c70e7d3
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/98.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/99.gif b/addons/nkeditor/assets/plugins/emoticons/images/99.gif
new file mode 100644
index 0000000..05c1863
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/99.gif differ
diff --git a/addons/nkeditor/assets/plugins/emoticons/images/static.gif b/addons/nkeditor/assets/plugins/emoticons/images/static.gif
new file mode 100644
index 0000000..b8c444b
Binary files /dev/null and b/addons/nkeditor/assets/plugins/emoticons/images/static.gif differ
diff --git a/addons/nkeditor/assets/plugins/filemanager/FManager.js b/addons/nkeditor/assets/plugins/filemanager/FManager.js
new file mode 100644
index 0000000..ad8a8f8
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/filemanager/FManager.js
@@ -0,0 +1,307 @@
+/**
+ * HTML5上传插件
+ * @author yangjian<yangjian102621@gmail.com>
+ * @version 1.0.1
+ * @site https://git.oschina.net/blackfox/ajaxUpload
+ */
+(function ($) {
+
+    //判断浏览器是否支持html5
+    // if ( !window.applicationCache )
+    // 	throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");
+
+    //image crop
+    $.fn.imageCrop = function (__width, __height) {
+        $(this).on("load", function () {
+
+            var width, height, left, top;
+            var orgRate = this.width / this.height;
+            var cropRate = __width / __height;
+            if (orgRate >= cropRate) {
+                height = __height;
+                width = __width * orgRate;
+                top = 0;
+                left = (width - __width) / 2;
+            } else {
+                width = __width;
+                height = __height / orgRate;
+                left = 0;
+                //top = (height - __height)/2;
+                top = 0;
+            }
+            $(this).css({
+                "position": "absolute",
+                top: -top + "px",
+                left: -left + "px",
+                width: width + "px",
+                height: height + "px"
+            });
+        });
+    }
+
+    //make element draggable
+    $.fn.draggable = function (options) {
+        var defaults = {
+            handler: null
+        }
+        options = $.extend(defaults, options);
+        var __self = this;
+        $(options.handler).mousedown(function (e) {
+            var offsetLeft = e.pageX - $(__self).position().left;
+            var offsetTop = e.pageY - $(__self).position().top;
+            $(document).mousemove(function (e) {
+                //清除拖动鼠标的时候选择文本
+                window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
+                $(__self).css({
+                    'top': e.pageY - offsetTop + 'px',
+                    'left': e.pageX - offsetLeft + 'px'
+                });
+            });
+
+        }).mouseup(function () {
+            $(document).unbind('mousemove');
+        });
+
+    }
+
+    if (Array.prototype.remove == undefined) {
+        Array.prototype.remove = function (item) {
+            for (var i = 0; i < this.length; i++) {
+                if (this[i] == item) {
+                    this.splice(i, 1);
+                    break;
+                }
+            }
+        }
+    }
+    if (Array.prototype.uinque == undefined) {
+        Array.prototype.uinque = function () {
+            var result = [], hash = {};
+            for (var i = 0, item; (item = this[i]) != null; i++) {
+                if (!hash[item]) {
+                    result.push(item);
+                    hash[item] = true;
+                }
+            }
+            return result;
+        }
+    }
+
+    window.FManager = function (options) {
+        options = $.extend({
+            lang: {},
+            list_url: null,
+            data_type: "json",
+            fileType: "image", //文件类型,默认是图片,可选flash,media,file
+            top: 20,
+            multiple: false,
+            callback: function (data) {
+                console.log(data);
+            }
+        }, options);
+
+        var o = {};
+        o.dialog = null;
+        o.selectedList = new Array(); //the file queue upload successfully
+        o.page = 1; //服务器图片列表页码
+        o.marker = null, //七牛云上传的分页标识
+            o.noRecord = false;
+
+        //close the dialog
+        o.close = function () {
+            o.dialog.remove();
+            try {
+                JDialog.lock.hide();
+            } catch (e) {
+            }
+            if (typeof options.close == 'function') {
+                options.close();
+            }
+        }
+
+        //create dialog
+        function createDialog() {
+
+            var builder = new StringBuilder();
+            builder.append('<div class="uedbody ke-animated"><div class="ued_title">');
+            builder.append('<div class="uedbar"><span>' + options.lang.title + '</span></div><div class="close_btn icon" title="' + options.lang.closeText + '"></div>');
+            builder.append('</div><div class="wrapper"><div class="wra_body wra_body_server">');
+            builder.append('<div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>');
+            builder.append('<div class="loading-icon"></div></div></div><div class="wra-btn-group">');
+            builder.append('<div class="tip-text">' + options.lang.loadMoreData + '</div>')
+            builder.append('<span class="btn btn-primary btn-confirm">' + options.lang.confirmBtnText + '</span>')
+            builder.append('<span class="btn btn-default btn-cancel">' + options.lang.cancelBtnText + '</span></div></div>');
+
+            o.dialog = $(builder.toString());
+            $("body").append(o.dialog);
+            if (options.top == 0) {
+                options.top = ($(window).height() - o.dialog.height()) / 2;
+            }
+            o.dialog.css({
+                left: ($(window).width() - o.dialog.width()) / 2 + "px",
+                top: options.top + "px"
+            });
+            //给对话框添加拖拽事件
+            o.dialog.draggable({handler: o.dialog.find(".ued_title")});
+            loadFilesFromServer();
+
+        }
+
+        //绑定元素事件
+        function bindEvent() {
+
+            //关闭对话框
+            G(".close_btn").on("click", function () {
+                o.close();
+            });
+
+            //点击确认|取消按钮事件
+            G(".btn-confirm").on("click", function () {
+                options.callback(o.selectedList);
+                o.close();
+            });
+            G(".btn-cancel").on("click", function () {
+                o.close();
+            });
+
+            //当滚动条滚到底部时自动去加载图片
+            G(".imagelist").on("scroll", function () {
+
+                if (this.scrollTop + this.clientHeight >= this.scrollHeight) {
+                    loadFilesFromServer();
+                }
+            });
+
+        }
+
+        //query
+        function G(query) {
+            return o.dialog.find(query);
+        }
+
+        //从服务器上获取图片地址
+        function loadFilesFromServer() {
+            if (!options.list_url) {
+                G(".online .no-data").html('<span class="error">' + options.lang.noListUrl + '</span>').show();
+                return false;
+            }
+            if (o.noRecord) return false;
+
+            G(".loading-icon").show(); //显示加载图标
+            $.get(options.list_url, {
+                page: o.page,
+                marker: o.marker,
+                fileType: options.fileType
+            }, function (res) {
+
+                G(".loading-icon").hide(); //隐藏加载图标
+                if (res.code == "000") {
+                    if (!res.data[0]) {
+                        G(".online .no-data").html(options.lang.noDataText).show();
+                        return;
+                    }
+                    o.page++;
+                    o.marker = res.extra; //存储marker
+                    appendFiles(res.data);
+                } else {
+                    G(".online .no-data").text(options.lang.noDataText).show();
+                    o.noRecord = true;
+                }
+
+            }, "json");
+        }
+
+        //追加元素到图片列表
+        function appendFiles(data) {
+
+            $.each(data, function (idx, item) {
+
+                var builder = new StringBuilder();
+                builder.append('<li>');
+                var extension = getFileExt(item.thumbURL);
+                if (extension == '') extension = "default";
+                extension = extension.toLowerCase();
+                //如果不是图片,则根据文件的后缀名去加载对应的缩略图
+                var imgSize = item.width + 'x' + item.height; //图片尺寸
+                if ("jpg|jpeg|gif|png|bmp".indexOf(extension) == -1) {
+                    imgSize = formatFileSize(item.filesize); //如果是文件则显示文件大小
+                    builder.append('<span class="icon-placeholder icon-default icon-' + extension + '" data-src="' + item.oriURL + '"></span>');
+                } else {
+                    builder.append('<img src="' + item.thumbURL + '" data-src="' + item.oriURL + '" border="0">');
+                }
+
+                builder.append('<span class="ic"><em class="img-size">' + imgSize + '</em></span></li>');
+                var $image = $(builder.toString());
+
+                //绑定选择图片事件
+                $image.find(".ic").on("click", function () {
+                    var src = $(this).prev().attr("data-src");
+                    var oldSrc = $('.selected:eq(0)').prev().attr("data-src");
+                    if (options.multiple) {
+                        //多选
+                        if ($(this).hasClass("selected")) {
+                            $(this).removeClass("selected");
+                            o.selectedList.remove(src);
+                        } else {
+                            $(this).addClass("selected");
+                            o.selectedList.push(src);
+                        }
+                    } else {
+                        //这里暂时改成单选
+                        $('.selected:eq(0)').removeClass("selected"); //移除之前的选中的图片
+                        o.selectedList.remove(oldSrc);
+                        $(this).addClass("selected");
+                        o.selectedList.push(src);
+                    }
+                    //console.log(o.selectedList);
+                });
+                //裁剪显示图片
+                $image.find("img").imageCrop(113, 113);
+                G(".imagelist .list").append($image);
+            });
+
+        }
+
+        //获取文件后缀名
+        function getFileExt(filename) {
+            if (!filename) return false;
+            var position = filename.lastIndexOf('.')
+            if (position != -1) {
+                return filename.substr(position + 1).toLowerCase();
+            }
+            return false;
+        }
+
+        //format file size(格式化文件大小)
+        function formatFileSize(size) {
+
+            if (size / 1048576 > 1) {
+                return (size / 1048576).toFixed(2) + "MB";
+            } else {
+                return (size / 1024).toFixed(2) + "KB";
+            }
+
+        }
+
+        //initialize dialog
+        createDialog();
+        bindEvent();
+        return o;
+    }; //end of JUpload
+
+    //string builder
+    var StringBuilder = function () {
+
+        var buffer = new Array();
+        StringBuilder.prototype.append = function (str) {
+            buffer.push(str);
+        }
+
+        StringBuilder.prototype.toString = function () {
+            return buffer.join("");
+        }
+
+    }
+
+
+})(jQuery);
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/filemanager/FManager.min.js b/addons/nkeditor/assets/plugins/filemanager/FManager.min.js
new file mode 100644
index 0000000..508bf23
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/filemanager/FManager.min.js
@@ -0,0 +1,2 @@
+/* NKeditor 5.0.3 (2018-10-25), Copyright (C) r9it.com,*/
+!function(a){if(!window.applicationCache)throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");a.fn.imageCrop=function(b,c){a(this).on("load",function(){var d,e,f,g,h=this.width/this.height,i=b/c;h>=i?(e=c,d=b*h,g=0,f=(d-b)/2):(d=b,e=c/h,f=0,g=0),a(this).css({position:"absolute",top:-g+"px",left:-f+"px",width:d+"px",height:e+"px"})})},a.fn.draggable=function(b){var c={handler:null};b=a.extend(c,b);var d=this;a(b.handler).mousedown(function(b){var c=b.pageX-a(d).position().left,e=b.pageY-a(d).position().top;a(document).mousemove(function(b){window.getSelection?window.getSelection().removeAllRanges():document.selection.empty(),a(d).css({top:b.pageY-e+"px",left:b.pageX-c+"px"})})}).mouseup(function(){a(document).unbind("mousemove")})},void 0==Array.prototype.remove&&(Array.prototype.remove=function(a){for(var b=0;b<this.length;b++)if(this[b]==a){this.splice(b,1);break}}),void 0==Array.prototype.uinque&&(Array.prototype.uinque=function(){for(var a,b=[],c={},d=0;null!=(a=this[d]);d++)c[a]||(b.push(a),c[a]=!0);return b}),window.FManager=function(c){function d(){var d=new b;d.append('<div class="uedbody ke-animated"><div class="ued_title">'),d.append('<div class="uedbar"><span>'+c.lang.title+'</span></div><div class="close_btn icon" title="'+c.lang.closeText+'"></div>'),d.append('</div><div class="wrapper"><div class="wra_body wra_body_server">'),d.append('<div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>'),d.append('<div class="loading-icon"></div></div></div><div class="wra-btn-group">'),d.append('<div class="tip-text">'+c.lang.loadMoreData+"</div>"),d.append('<span class="btn btn-primary btn-confirm">'+c.lang.confirmBtnText+"</span>"),d.append('<span class="btn btn-default btn-cancel">'+c.lang.cancelBtnText+"</span></div></div>"),k.dialog=a(d.toString()),a("body").append(k.dialog),0==c.top&&(c.top=(a(window).height()-k.dialog.height())/2),k.dialog.css({left:(a(window).width()-k.dialog.width())/2+"px",top:c.top+"px"}),k.dialog.draggable({handler:k.dialog.find(".ued_title")}),g()}function e(){f(".close_btn").on("click",function(){k.close()}),f(".btn-confirm").on("click",function(){c.callback(k.selectedList),k.close()}),f(".btn-cancel").on("click",function(){k.close()}),f(".imagelist").on("scroll",function(){this.scrollTop+this.clientHeight>=this.scrollHeight&&g()})}function f(a){return k.dialog.find(a)}function g(){return c.list_url?k.noRecord?!1:(f(".loading-icon").show(),void a.get(c.list_url,{page:k.page,marker:k.marker,fileType:c.fileType},function(a){if(f(".loading-icon").hide(),"000"==a.code){if(!a.data[0])return void f(".online .no-data").html(c.lang.noDataText).show();k.page++,k.marker=a.extra,h(a.data)}else f(".online .no-data").text(c.lang.noDataText).show(),k.noRecord=!0},"json")):(f(".online .no-data").html('<span class="error">'+c.lang.noListUrl+"</span>").show(),!1)}function h(c){a.each(c,function(c,d){var e=new b;e.append("<li>");var g=i(d.thumbURL);""==g&&(g="default"),g=g.toLowerCase();var h=d.width+"x"+d.height;-1=="jpg|jpeg|gif|png|bmp".indexOf(g)?(h=j(d.filesize),e.append('<span class="icon-placeholder icon-default icon-'+g+'" data-src="'+d.oriURL+'"></span>')):e.append('<img src="'+d.thumbURL+'" data-src="'+d.oriURL+'" border="0">'),e.append('<span class="ic"><em class="img-size">'+h+"</em></span></li>");var l=a(e.toString());l.find(".ic").on("click",function(){var b=a(this).prev().attr("data-src"),c=a(".selected:eq(0)").prev().attr("data-src");a(".selected:eq(0)").removeClass("selected"),k.selectedList.remove(c),a(this).addClass("selected"),k.selectedList.push(b)}),l.find("img").imageCrop(113,113),f(".imagelist .list").append(l)})}function i(a){if(!a)return!1;var b=a.lastIndexOf(".");return-1!=b?a.substr(b+1).toLowerCase():!1}function j(a){return a/1048576>1?(a/1048576).toFixed(2)+"MB":(a/1024).toFixed(2)+"KB"}c=a.extend({lang:{},list_url:null,data_type:"json",fileType:"image",top:20,callback:function(a){console.log(a)}},c);var k={};return k.dialog=null,k.selectedList=new Array,k.page=1,k.marker=null,k.noRecord=!1,k.close=function(){k.dialog.remove();try{JDialog.lock.hide()}catch(a){}"function"==typeof c.close&&c.close()},d(),e(),k};var b=function(){var a=new Array;b.prototype.append=function(b){a.push(b)},b.prototype.toString=function(){return a.join("")}}}(jQuery);
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/filemanager/css/filemanager.min.css b/addons/nkeditor/assets/plugins/filemanager/css/filemanager.min.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/filemanager/css/filemanager.min.css
diff --git a/addons/nkeditor/assets/plugins/filemanager/filemanager.js b/addons/nkeditor/assets/plugins/filemanager/filemanager.js
new file mode 100644
index 0000000..9f740f8
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/filemanager/filemanager.js
@@ -0,0 +1,35 @@
+/**
+ * 文件服务器管理
+ * @author yangjian <yangjian102621@gmail.com>
+ * @since v4.1.12(2017-09-12)
+ * @site http://git.oschina.net/blackfox/kindeditor
+ */
+KindEditor.plugin('filemanager', function(K) {
+	var self = this;
+	var fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php');
+	var lang = self.lang('filemanager.');
+	if(typeof jQuery == 'undefined') {
+		K.options.errorMsgHandler(lang.depJQueryError, "error");
+		return;
+	} else {
+		K.loadScript(K.options.pluginsPath+"filemanager/FManager.js");
+		K.loadStyle(K.options.pluginsPath+"multiimage/css/upload.css");
+	}
+
+	self.plugin.filemanagerDialog = function(options) {
+
+		var clickFn = options.clickFn;
+		new FManager({
+			list_url : fileManagerJson,	//图片列表数据获取url
+			lang : lang, //语言包
+			fileType : options.dirName,
+			top : self.dialogOffset,
+			callback : function(data) {
+				//console.log(data);
+				clickFn.call(this, data[0]);
+			}
+		});
+		//return dialog;
+	}
+
+});
diff --git a/addons/nkeditor/assets/plugins/fixtoolbar/fixtoolbar.js b/addons/nkeditor/assets/plugins/fixtoolbar/fixtoolbar.js
new file mode 100644
index 0000000..7a16fca
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/fixtoolbar/fixtoolbar.js
@@ -0,0 +1,35 @@
+/**
+ * Created by chenyihong on 14/12/4.
+ */
+
+KindEditor.plugin('fixtoolbar', function (K) {
+    var self = this;
+    if (!self.fixToolBar) {
+        return;
+    }
+
+    function init() {
+        var toolbar = K('.ke-toolbar');
+        var originY = toolbar.pos().y;
+        K(window).bind('scroll', function () {
+            if (toolbar.css('position') == 'fixed') {
+                if(document.body.scrollTop - originY < 0){
+                    toolbar.css('position', 'static');
+                    toolbar.css('top', 'auto');
+                }
+            } else {
+                if (toolbar.pos().y - document.body.scrollTop < 0) {
+                    toolbar.css('position', 'fixed');
+                    toolbar.css('top', 0);
+                }
+            }
+        });
+    }
+
+    if (self.isCreated) {
+        init();
+    } else {
+        self.afterCreate(init);
+    }
+
+});
diff --git a/addons/nkeditor/assets/plugins/flash/flash.js b/addons/nkeditor/assets/plugins/flash/flash.js
new file mode 100644
index 0000000..f26eaf3
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/flash/flash.js
@@ -0,0 +1,165 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('flash', function(K) {
+	var self = this, name = 'flash', lang = self.lang(name + '.'),
+		allowFlashUpload = K.undef(self.allowFlashUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+	self.plugin.flash = {
+		edit : function() {
+			var html = [
+				'<div class="ke-dialog-content-inner">',
+				//url
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+				'<div class="row-right">',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+				'<span class="ke-button-common ke-button-outer">',
+				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+				'</span>',
+				'</div>',
+				'</div>',
+				//width
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keWidth" class="row-left">' + lang.width + ':</label>',
+				'<div class="row-right">',
+				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',
+				'</div>',
+				'</div>',
+				//height
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keHeight" class="row-left">' + lang.height + ':</label>',
+				'<div class="row-right">',
+				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',
+				'</div>',
+				'</div>',
+				'</div>'
+			].join('');
+
+			var dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var url = K.trim(urlBox.val()),
+							width = widthBox.val(),
+							height = heightBox.val();
+						if (url == 'http://' || K.invalidUrl(url)) {
+							K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+							urlBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+							heightBox[0].focus();
+							return;
+						}
+						var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+								src : url,
+								type : K.mediaType('.swf'),
+								width : width,
+								height : height,
+								quality : 'high'
+							});
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('[name="width"]', div),
+			heightBox = K('[name="height"]', div);
+			urlBox.val('http://');
+
+			if (allowFlashUpload) {
+				var uploadbutton = K.uploadbutton({
+					button : K('.ke-upload-button', div)[0],
+					fieldName : filePostName,
+					extraParams : extraParams,
+					url : K.addParam(uploadJson, 'fileType=flash'),
+					afterUpload : function(data) {
+						dialog.hideLoading();
+						if (data.code === "000") {
+							var url = data.data.url;
+							if (formatUploadUrl) {
+								url = K.formatUrl(url, 'absolute');
+							}
+							urlBox.val(url);
+							if (self.afterUpload) {
+								self.afterUpload.call(self, url, data, name);
+							}
+							K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+						} else {
+							K.options.errorMsgHandler(data.message, "error");
+						}
+					},
+					afterError : function(html) {
+						dialog.hideLoading();
+						self.errorDialog(html);
+					}
+				});
+				uploadbutton.fileBox.change(function(e) {
+					dialog.showLoading(self.lang('uploadLoading'));
+					uploadbutton.submit();
+				});
+			} else {
+				K('.ke-upload-button', div).hide();
+			}
+
+			if (allowFileManager) {
+				viewServerBtn.click(function(e) {
+					self.loadPlugin('filemanager', function() {
+						self.plugin.filemanagerDialog({
+							dirName : 'flash',
+							clickFn : function(url) {
+								K('[name="url"]', div).val(url);
+								if (self.afterSelectFile) {
+									self.afterSelectFile.call(self, url);
+								}
+							}
+						});
+					});
+				});
+			} else {
+				K('[name="url"]').css("width", "250px");
+				viewServerBtn.hide();
+			}
+
+			var img = self.plugin.getSelectedFlash();
+			if (img) {
+				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+				urlBox.val(attrs.src);
+				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedFlash().remove();
+			// [IE] 删除图片后立即点击图片按钮出错
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.flash.edit);
+});
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/addimg.png b/addons/nkeditor/assets/plugins/graft/css/images/addimg.png
new file mode 100644
index 0000000..03a8713
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/addimg.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/blur.png b/addons/nkeditor/assets/plugins/graft/css/images/blur.png
new file mode 100644
index 0000000..6307d27
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/blur.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/brush.png b/addons/nkeditor/assets/plugins/graft/css/images/brush.png
new file mode 100644
index 0000000..efa6fdb
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/brush.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/delimg.png b/addons/nkeditor/assets/plugins/graft/css/images/delimg.png
new file mode 100644
index 0000000..5a892e4
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/delimg.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/delimgH.png b/addons/nkeditor/assets/plugins/graft/css/images/delimgH.png
new file mode 100644
index 0000000..2f0c5c9
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/delimgH.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/empty.png b/addons/nkeditor/assets/plugins/graft/css/images/empty.png
new file mode 100644
index 0000000..0375196
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/empty.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/emptyH.png b/addons/nkeditor/assets/plugins/graft/css/images/emptyH.png
new file mode 100644
index 0000000..838ca72
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/emptyH.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/eraser.png b/addons/nkeditor/assets/plugins/graft/css/images/eraser.png
new file mode 100644
index 0000000..63e87ce
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/eraser.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/init.png b/addons/nkeditor/assets/plugins/graft/css/images/init.png
new file mode 100644
index 0000000..c2eb7be
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/init.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/redo.png b/addons/nkeditor/assets/plugins/graft/css/images/redo.png
new file mode 100644
index 0000000..12cd9bb
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/redo.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/redoH.png b/addons/nkeditor/assets/plugins/graft/css/images/redoH.png
new file mode 100644
index 0000000..d9f33d3
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/redoH.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/save.png b/addons/nkeditor/assets/plugins/graft/css/images/save.png
new file mode 100644
index 0000000..2ab611e
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/save.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/scale.png b/addons/nkeditor/assets/plugins/graft/css/images/scale.png
new file mode 100644
index 0000000..935a3f3
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/scale.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/scaleH.png b/addons/nkeditor/assets/plugins/graft/css/images/scaleH.png
new file mode 100644
index 0000000..72e64a9
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/scaleH.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/size.png b/addons/nkeditor/assets/plugins/graft/css/images/size.png
new file mode 100644
index 0000000..8366845
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/size.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/undo.png b/addons/nkeditor/assets/plugins/graft/css/images/undo.png
new file mode 100644
index 0000000..084c7cc
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/undo.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/images/undoH.png b/addons/nkeditor/assets/plugins/graft/css/images/undoH.png
new file mode 100644
index 0000000..fde7eb3
Binary files /dev/null and b/addons/nkeditor/assets/plugins/graft/css/images/undoH.png differ
diff --git a/addons/nkeditor/assets/plugins/graft/css/scrawl.css b/addons/nkeditor/assets/plugins/graft/css/scrawl.css
new file mode 100644
index 0000000..f53a5d7
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/graft/css/scrawl.css
@@ -0,0 +1,204 @@
+/*common
+*/
+body {
+  margin: 0; }
+  body a {
+    text-decoration: none; }
+  body em {
+    font-style: normal; }
+  body .border_style {
+    border: 1px solid #ccc;
+    border-radius: 5px;
+    box-shadow: 2px 2px 5px #d3d6da; }
+  body em {
+    font-style: normal; }
+  body .ke-dialog-body {
+    padding-top: 8px; }
+  body .scrawl-main {
+    padding: 0px 8px;
+    zoom: 1;
+    overflow: hidden;
+    max-width: 1000px; }
+    body .scrawl-main .hot {
+      float: left; }
+      body .scrawl-main .hot .drawBoard {
+        position: relative;
+        cursor: crosshair; }
+        body .scrawl-main .hot .drawBoard .brushBorad {
+          position: absolute;
+          left: 0;
+          top: 0;
+          z-index: 998; }
+        body .scrawl-main .hot .drawBoard .picBoard {
+          border: none;
+          text-align: center;
+          cursor: default; }
+      body .scrawl-main .hot .operateBar {
+        margin-top: 10px;
+        font-size: 12px;
+        text-align: center; }
+        body .scrawl-main .hot .operateBar span {
+          margin-left: 10px; }
+        body .scrawl-main .hot .operateBar button {
+          background: #e1e1e1;
+          border: 1px solid #cccccc;
+          margin: 0px 5px;
+          cursor: default; }
+        body .scrawl-main .hot .operateBar .prevStep .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/undo.png"); }
+        body .scrawl-main .hot .operateBar .prevStep.active {
+          cursor: pointer;
+          background: #FFFFFF;
+          border-color: #56CCCC; }
+          body .scrawl-main .hot .operateBar .prevStep.active .icon {
+            background-image: url("images/undoH.png"); }
+        body .scrawl-main .hot .operateBar .nextStep .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/redo.png"); }
+        body .scrawl-main .hot .operateBar .nextStep.active {
+          cursor: pointer;
+          background: #FFFFFF;
+          border-color: #56CCCC; }
+          body .scrawl-main .hot .operateBar .nextStep.active .icon {
+            background-image: url("images/redoH.png"); }
+        body .scrawl-main .hot .operateBar .clearBoard {
+          cursor: default; }
+          body .scrawl-main .hot .operateBar .clearBoard .icon {
+            display: inline-block;
+            width: 16px;
+            height: 16px;
+            background-image: url("images/empty.png"); }
+        body .scrawl-main .hot .operateBar .clearBoard.active {
+          cursor: pointer;
+          background: #FFFFFF;
+          border-color: #56CCCC; }
+          body .scrawl-main .hot .operateBar .clearBoard.active .icon {
+            background-image: url("images/emptyH.png"); }
+        body .scrawl-main .hot .operateBar .scaleBoard .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/scale.png");
+          cursor: default; }
+        body .scrawl-main .hot .operateBar .scaleBoard .iconH {
+          background-image: url("images/scaleH.png"); }
+        body .scrawl-main .hot .operateBar .scaleBoard .text {
+          color: #ccc;
+          cursor: default; }
+    body .scrawl-main .drawToolbar {
+      float: right;
+      width: 110px;
+      height: 320px;
+      overflow: hidden; }
+      body .scrawl-main .drawToolbar .brushIcon {
+        display: inline-block;
+        width: 16px;
+        height: 16px;
+        background-image: url("images/brush.png"); }
+      body .scrawl-main .drawToolbar .eraserIcon {
+        display: inline-block;
+        width: 16px;
+        height: 16px;
+        background-image: url("images/eraser.png"); }
+      body .scrawl-main .drawToolbar .blurIcon {
+        display: inline-block;
+        width: 16px;
+        height: 16px;
+        background: url(images/blur.png) -2px -2px;
+        background-size: 22px 20px; }
+      body .scrawl-main .drawToolbar .colorBar {
+        margin-top: 10px;
+        font-size: 12px;
+        text-align: center;
+        zoom: 1;
+        overflow: hidden; }
+        body .scrawl-main .drawToolbar .colorBar span {
+          float: left;
+          margin: 2px 3px;
+          width: 10px;
+          height: 10px;
+          border: 1px solid #c1c1c1;
+          border-radius: 3px;
+          cursor: pointer; }
+        body .scrawl-main .drawToolbar .colorBar .active {
+          border-color: #FF0000;
+          box-shadow: 2px 2px 5px #d3d6da; }
+      body .scrawl-main .drawToolbar .sectionBar {
+        margin-top: 15px;
+        font-size: 12px;
+        text-align: center; }
+        body .scrawl-main .drawToolbar .sectionBar a {
+          display: inline-block;
+          width: 10px;
+          height: 12px;
+          color: #888;
+          text-indent: -999px;
+          opacity: 0.3; }
+        body .scrawl-main .drawToolbar .sectionBar .size1 {
+          background: url("images/size.png") 1px center no-repeat; }
+        body .scrawl-main .drawToolbar .sectionBar .size2 {
+          background: url("images/size.png") -10px center no-repeat; }
+        body .scrawl-main .drawToolbar .sectionBar .size3 {
+          background: url("images/size.png") -22px center no-repeat; }
+        body .scrawl-main .drawToolbar .sectionBar .size4 {
+          background: url("images/size.png") -35px center no-repeat; }
+        body .scrawl-main .drawToolbar .sectionBar .icon {
+          position: relative;
+          top: 3px; }
+        body .scrawl-main .drawToolbar .sectionBar .clearSetting .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/init.png");
+          background-size: 16px 16px; }
+        body .scrawl-main .drawToolbar .sectionBar .addImgH {
+          position: relative; }
+          body .scrawl-main .drawToolbar .sectionBar .addImgH .icon {
+            display: inline-block;
+            width: 16px;
+            height: 16px;
+            background-image: url("images/addimg.png");
+            cursor: default; }
+          body .scrawl-main .drawToolbar .sectionBar .addImgH .upload {
+            position: absolute;
+            left: 18px;
+            top: -1px;
+            width: 75px;
+            height: 21px;
+            opacity: 0;
+            cursor: pointer;
+            opacity: 0; }
+        body .scrawl-main .drawToolbar .sectionBar .removeImg .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/delimg.png");
+          cursor: default; }
+        body .scrawl-main .drawToolbar .sectionBar .removeImg .text {
+          color: #ccc;
+          cursor: default; }
+        body .scrawl-main .drawToolbar .sectionBar .removeImg.active {
+          cursor: pointer; }
+          body .scrawl-main .drawToolbar .sectionBar .removeImg.active .icon {
+            background-image: url("images/delimgH.png"); }
+          body .scrawl-main .drawToolbar .sectionBar .removeImg.active .text {
+            color: #000;
+            cursor: default; }
+        body .scrawl-main .drawToolbar .sectionBar .saveImg {
+          cursor: pointer; }
+          body .scrawl-main .drawToolbar .sectionBar .saveImg .icon {
+            display: inline-block;
+            width: 16px;
+            height: 16px;
+            background-image: url("images/save.png");
+            background-size: 18px 18px;
+            cursor: default; }
+      body .scrawl-main .drawToolbar #clearSetting {
+        cursor: pointer; }
+
+/*# sourceMappingURL=scrawl.css.map */
diff --git a/addons/nkeditor/assets/plugins/graft/css/scrawl.css.map b/addons/nkeditor/assets/plugins/graft/css/scrawl.css.map
new file mode 100644
index 0000000..6143e2c
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/graft/css/scrawl.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["scrawl.scss"],
+"names": [],
+"file": "scrawl.css"
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/graft/css/scrawl.scss b/addons/nkeditor/assets/plugins/graft/css/scrawl.scss
new file mode 100644
index 0000000..fc23a3e
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/graft/css/scrawl.scss
@@ -0,0 +1,284 @@
+/*common
+*/
+body {
+
+    margin: 0;
+    a{text-decoration: none;}
+    em{font-style: normal;}
+
+    .border_style{
+        border: 1px solid #ccc;
+        border-radius: 5px;
+        box-shadow:2px 2px 5px #d3d6da;
+    }
+    em {font-style: normal;}
+
+    .ke-dialog-body {
+        padding-top: 8px;
+    }
+    .scrawl-main {
+        padding: 0px 8px;
+        zoom: 1;
+        overflow: hidden;
+        max-width: 1000px;
+
+
+        // 绘图区域
+        .hot {
+            float:left;
+
+            .drawBoard{
+                position: relative;
+                cursor: crosshair;
+
+                .brushBorad{
+                    position: absolute;
+                    left:0;
+                    top:0;
+                    z-index: 998;
+                }
+
+                .picBoard{
+                    border: none;
+                    text-align: center;
+                    cursor: default;
+                }
+            }
+
+            .operateBar{
+                margin-top:10px;
+                font-size:12px;
+                text-align: center;
+
+                span {margin-left: 10px;}
+
+                button {
+                    background:#e1e1e1;
+                    border: 1px solid #cccccc;
+                    margin: 0px 5px;
+                    cursor:default;
+                }
+
+                .prevStep {
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/undo.png');
+                    }
+                }
+
+                .prevStep.active {
+                    cursor: pointer;
+                    background: #FFFFFF;
+                    border-color: #56CCCC;
+
+                    .icon {
+                        background-image: url('images/undoH.png');
+                    }
+
+                }
+
+                .nextStep {
+                    .icon {
+                        display: inline-block;
+                        width:16px;
+                        height:16px;
+                        background-image: url('images/redo.png');
+                    }
+                }
+
+                .nextStep.active {
+                    cursor: pointer;
+                    background: #FFFFFF;
+                    border-color: #56CCCC;
+
+                    .icon {
+                        background-image: url('images/redoH.png');
+                    }
+                }
+
+                .clearBoard {
+                    cursor: default;
+
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/empty.png');
+                    }
+
+                }
+
+                .clearBoard.active {
+                    cursor: pointer;
+                    background: #FFFFFF;
+                    border-color: #56CCCC;
+
+                    .icon {
+                        background-image: url('images/emptyH.png');
+                    }
+                }
+
+                .scaleBoard {
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/scale.png');
+                        cursor:default;}
+
+                    .iconH {
+                        background-image: url('images/scaleH.png');
+                    }
+
+                    .text{
+                        color:#ccc;
+                        cursor:default;}
+                }
+
+
+            }
+        }
+
+        // 绘图工具
+        .drawToolbar {
+            float:right;
+            width:110px;
+            height:320px;
+            overflow: hidden;
+
+            .brushIcon {
+                display: inline-block;
+                width:16px;height:16px;
+                background-image: url('images/brush.png')}
+
+            .eraserIcon {
+                display: inline-block;
+                width:16px;height:16px;
+                background-image: url('images/eraser.png')}
+
+            .blurIcon {
+                display: inline-block;
+                width:16px;height:16px;
+                background: url(images/blur.png) -2px -2px;
+                background-size: 22px 20px;
+            }
+
+            .colorBar {
+                margin-top:10px;
+                font-size: 12px;
+                text-align: center;
+                zoom: 1;
+                overflow: hidden;
+
+                span {
+                    float: left;
+                    margin: 2px 3px;
+                    width: 10px;
+                    height: 10px;
+                    border:1px solid #c1c1c1;
+                    border-radius: 3px;
+                    cursor: pointer;
+                }
+
+                .active {
+                    border-color: #FF0000;
+                    box-shadow:2px 2px 5px #d3d6da;
+                }
+            }
+
+            .sectionBar {
+                margin-top:15px;
+                font-size: 12px;
+                text-align: center;
+
+                a {
+                    display:inline-block;
+                    width:10px;
+                    height:12px;
+                    color: #888;
+                    text-indent: -999px;
+                    opacity: 0.3
+                }
+
+                .size1 {background: url('images/size.png') 1px center no-repeat ;}
+                .size2 {background: url('images/size.png') -10px center no-repeat;}
+                .size3 {background: url('images/size.png') -22px center no-repeat;}
+                .size4 {background: url('images/size.png') -35px center no-repeat;}
+
+                .icon {
+                    position: relative;
+                    top:3px;
+                }
+                .clearSetting {
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/init.png');
+                        background-size: 16px 16px;
+                    }
+                }
+
+                .addImgH {
+                    position: relative;
+
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/addimg.png');
+                        cursor:default;
+                    }
+
+                    .upload {
+                        position: absolute;
+                        left: 18px;top: -1px;
+                        width: 75px;
+                        height: 21px;
+                        opacity: 0;
+                        cursor: pointer;
+                        opacity: 0;
+                    }
+                }
+
+                .removeImg {
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/delimg.png');
+                        cursor:default;
+                    }
+
+                    .text{color:#ccc;cursor:default;}
+                } //end removeImg
+
+                .removeImg.active {
+                    cursor: pointer;
+
+                    .icon {
+                        background-image: url('images/delimgH.png');
+                    }
+
+                    .text{color:#000;cursor:default;}
+                } //end removeImg
+
+                //保存图片
+                .saveImg {
+                    cursor: pointer;
+
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/save.png');
+                        background-size: 18px 18px;
+                        cursor:default;
+                    }
+                }
+
+            }
+
+            #clearSetting {cursor: pointer;}
+        }
+    }
+
+
+}
+
+
diff --git a/addons/nkeditor/assets/plugins/graft/graft.js b/addons/nkeditor/assets/plugins/graft/graft.js
new file mode 100644
index 0000000..0102a88
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/graft/graft.js
@@ -0,0 +1,189 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('graft', function(K) {
+	var self = this, name = 'graft',
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		allowUploadGraft = K.undef(self.allowUploadGraft, true),
+		lang = self.lang(name + '.');
+
+	if(typeof jQuery == 'undefined') {
+		K.options.errorMsgHandler(lang.depJQueryError, "error");
+		return;
+	} else {
+		K.loadStyle(K.options.pluginsPath+"graft/css/scrawl.css");
+		K.loadScript(K.options.pluginsPath+"graft/scrawl.js");
+	}
+
+	self.plugin.graftDialog = function(options) {
+		var clickFn = options.clickFn;
+		var html = [
+			'<div class="scrawl-main" id="scrawl-main">',
+			//绘图区域
+			'<div class="hot">',
+			'<div class="drawBoard border_style">',
+			'<canvas id="canvas-borad" class="brushBorad">你的浏览器不支持 canvas 绘图</canvas>',
+			'<div class="picBoard" id="picBoard" style=""></div>',
+			'</div>',
+			'<div class="operateBar">',
+			'<button id="J_prevStep" class="prevStep" title="上一步">',
+			'<em class="icon"></em>',
+			'</button>',
+			'<button id="J_nextStep" class="nextStep" title="下一步">',
+			'<em class="icon"></em>',
+			'</button>',
+			'<button id="J_clearBoard" class="clearBoard" title="清空">',
+			'<em class="icon"></em>',
+			'</button>',
+			'</div>',
+			'</div>',
+			//绘图区域 end
+
+			//工具栏
+			'<div class="drawToolbar border_style">',
+			'<div class="colorBar">',
+			'<span data-color="#0099CC" style="background:#0099CC;" class="active"></span>',
+			'<span data-color="#003366" style="background:#003366;"></span>',
+			'<span data-color="#993333" style="background:#993333;"></span>',
+			'<span data-color="#FF9900" style="background:#FF9900;"></span>',
+			'<span data-color="#0000CC" style="background:#0000CC;"></span>',
+			'<span data-color="#CC3333" style="background:#CC3333;"></span>',
+
+			'<span data-color="#F4D03F" style="background:#641E16;"></span>',
+			'<span data-color="#4A235A" style="background:#4A235A;"></span>',
+			'<span data-color="#009966" style="background:#009966;"></span>',
+			'<span data-color="#ffff00" style="background:#ffff00;"></span>',
+			'<span data-color="#7D6608" style="background:#7D6608;"></span>',
+			'<span data-color="#FF33CC" style="background:#FF33CC;"></span>',
+
+			'<span data-color="#990066" style="background:#990066;"></span>',
+			'<span data-color="#ffffff" style="background:#ffffff;"></span>',
+			'<span data-color="#9bbb59" style="background:#9bbb59;"></span>',
+			'<span data-color="#CCFFFF" style="background:#CCFFFF;"></span>',
+			'<span data-color="#FFCCCC" style="background:#FFCCCC;"></span>',
+			'<span data-color="#CC99CC" style="background:#CC99CC;"></span>',
+			'</div>',
+
+			//笔刷设置
+			'<div class="sectionBar">',
+			'<em class="brushIcon"></em>',
+			'<a href="javascript:void(0)" class="brush-size size1">1</a>',
+			'<a href="javascript:void(0)" class="brush-size size2">3</a>',
+			'<a href="javascript:void(0)" class="brush-size size3">5</a>',
+			'<a href="javascript:void(0)" class="brush-size size4">7</a>',
+			'</div>',
+			'<div class="sectionBar">',
+			'<em class="eraserIcon"></em>',
+			'<a href="javascript:void(0)" class="eraser-size size1">5</a>',
+			'<a href="javascript:void(0)" class="eraser-size size2">10</a>',
+			'<a href="javascript:void(0)" class="eraser-size size3">15</a>',
+			'<a href="javascript:void(0)" class="eraser-size size4">20</a>',
+			'</div>',
+			'<div class="sectionBar">',
+			'<em class="blurIcon"></em>',
+			'<a href="javascript:void(0)" class="blur-size size1">2</a>',
+			'<a href="javascript:void(0)" class="blur-size size2">4</a>',
+			'<a href="javascript:void(0)" class="blur-size size3">6</a>',
+			'<a href="javascript:void(0)" class="blur-size size4">8</a>',
+			'</div>',
+			//end 笔刷设置
+			'<div class="sectionBar">',
+			'<span id="clearSetting" class="clearSetting">',
+			'<em class="icon"></em>',
+			'<em class="text">初始化设置</em>',
+			'</span>',
+			'</div>',
+			'<div class="sectionBar">',
+			'<div id="J_addImg" class="addImgH">',
+			'<em class="icon"></em>',
+			'<em class="text">添加背景</em>',
+			'<input type="file" class="upload" id="J_canvas_bg" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>',
+			'</div>',
+			'</div>',
+			'<div class="sectionBar">',
+			'<span id="J_removeImg" class="removeImg">',
+			'<em class="icon"></em>',
+			'<em class="text">删除背景</em>',
+			'</span>',
+			'</div>',
+			'</div>'
+		].join('');
+
+		var dialog = self.createDialog({
+				name : name,
+				width : 750,
+				height : 440,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : lang.btnText,
+					click : function(e) {
+
+						if (dialog.isLoading) {
+							return;
+						}
+						if (canvas.isEmpty()) {
+							K.options.errorMsgHandler(lang.empty, "error");
+							return;
+						}
+						canvas.save(function(data) {
+							//上传涂鸦到服务器
+							if (allowUploadGraft) {
+								dialog.showLoading(self.lang('uploadLoading'));
+								$.post(uploadJson, {
+									img_base64_data : data,
+									fileType : "image",
+									base64 : 1
+								}, function(res) {
+
+									dialog.hideLoading();
+									if (res.code == "000") {
+										K.options.errorMsgHandler(lang.uploadSuccess, "ok");
+										clickFn.call(self, res.data.url);
+										self.hideDialog().focus();
+									} else {
+										K.options.errorMsgHandler(lang.uploadFaild, "error");
+									}
+
+								}, "json");
+
+							} else {
+								clickFn.call(self, data);
+								self.hideDialog().focus();
+							}
+
+						});
+
+					}
+				}
+			});
+		//console.log(div);
+
+		//var urlBox = K('[name="url"]', div),
+		//	viewServerBtn = K('[name="viewServer"]', div),
+		//	titleBox = K('[name="title"]', div);
+
+		var canvas = new Canvas({
+			canvasId : "canvas-borad",
+			width : 600,
+			height : 320
+		});
+
+
+
+	};
+
+	self.clickToolbar(name, function() {
+		self.plugin.graftDialog({
+			clickFn : function(url) {
+				self.exec('insertimage', url);
+			}
+		});
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/graft/index.html b/addons/nkeditor/assets/plugins/graft/index.html
new file mode 100644
index 0000000..9b684f9
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/graft/index.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>在线涂鸦工具</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <link rel="stylesheet" type="text/css" href="css/scrawl.css">
+</head>
+<body>
+<div class="scrawl-main" id="scrawl-main">
+    <div class="hot">
+        <div class="drawBoard border_style">
+            <canvas id="canvas-borad" class="brushBorad">你的浏览器不支持 canvas 绘图</canvas>
+            <div class="picBoard" id="picBoard" style=""></div>
+        </div>
+        <div class="operateBar">
+            <button id="J_prevStep" class="prevStep" title="上一步">
+                <em class="icon"></em>
+            </button>
+            <button id="J_nextStep" class="nextStep" title="下一步">
+                <em class="icon"></em>
+            </button>
+            <button id="J_clearBoard" class="clearBoard" title="清空">
+                <em class="icon"></em>
+            </button>
+            <!--<span id="J_sacleBoard" class="scaleBoard">-->
+                <!--<em class="icon"></em>-->
+                <!--<em class="text">缩放背景</em>-->
+            <!--</span>-->
+        </div>
+    </div>
+    <div class="drawToolbar border_style">
+        <div class="colorBar">
+            <span data-color="#0099CC" style="background:#0099CC;" class="active"></span>
+            <span data-color="#003366" style="background:#003366;"></span>
+            <span data-color="#993333" style="background:#993333;"></span>
+            <span data-color="#FF9900" style="background:#FF9900;"></span>
+            <span data-color="#0000CC" style="background:#0000CC;"></span>
+            <span data-color="#CC3333" style="background:#CC3333;"></span>
+
+            <span data-color="#F4D03F" style="background:#641E16;"></span>
+            <span data-color="#4A235A" style="background:#4A235A;"></span>
+            <span data-color="#009966" style="background:#009966;"></span>
+            <span data-color="#ffff00" style="background:#ffff00;"></span>
+            <span data-color="#7D6608" style="background:#7D6608;"></span>
+            <span data-color="#FF33CC" style="background:#FF33CC;"></span>
+
+            <span data-color="#c00000" style="background:#641E16;"></span>
+            <span data-color="#ffffff" style="background:#ffffff;"></span>
+            <span data-color="#9bbb59" style="background:#9bbb59;"></span>
+            <span data-color="#CCFFFF" style="background:#CCFFFF;"></span>
+            <span data-color="#FFCCCC" style="background:#FFCCCC;"></span>
+            <span data-color="#CC99CC" style="background:#CC99CC;"></span>
+        </div>
+
+        <div class="sectionBar">
+            <em class="brushIcon"></em>
+            <a href="javascript:void(0)" class="brush-size size1">1</a>
+            <a href="javascript:void(0)" class="brush-size size2">3</a>
+            <a href="javascript:void(0)" class="brush-size size3">5</a>
+            <a href="javascript:void(0)" class="brush-size size4">7</a>
+        </div>
+        <div class="sectionBar">
+            <em class="eraserIcon"></em>
+            <a href="javascript:void(0)" class="eraser-size size1">5</a>
+            <a href="javascript:void(0)" class="eraser-size size2">10</a>
+            <a href="javascript:void(0)" class="eraser-size size3">15</a>
+            <a href="javascript:void(0)" class="eraser-size size4">20</a>
+        </div>
+
+        <div class="sectionBar">
+            <em class="blurIcon"></em>
+            <a href="javascript:void(0)" class="blur-size size1">2</a>
+            <a href="javascript:void(0)" class="blur-size size2">4</a>
+            <a href="javascript:void(0)" class="blur-size size3">6</a>
+            <a href="javascript:void(0)" class="blur-size size4">8</a>
+        </div>
+
+        <div class="sectionBar">
+            <span id="clearSetting" class="clearSetting">
+                <em class="icon"></em>
+                <em class="text">初始化设置</em>
+            </span>
+        </div>
+
+        <div class="sectionBar">
+            <div id="J_addImg" class="addImgH">
+                <em class="icon"></em>
+                <em class="text">添加背景</em>
+                <input type="file" class="upload" id="J_canvas_bg"
+                       accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>
+
+            </div>
+        </div>
+
+        <div class="sectionBar">
+            <span id="J_removeImg" class="removeImg">
+                <em class="icon"></em>
+                <em class="text">删除背景</em>
+            </span>
+        </div>
+
+        <div class="sectionBar">
+            <span id="J_saveImg" class="saveImg">
+                <em class="icon"></em>
+                <em class="text">保存图片</em>
+            </span>
+        </div>
+
+    </div>
+</div>
+
+<script type="text/javascript" src="scrawl/libs/jquery.min.js"></script>
+<script type="text/javascript" src="scrawl.js"></script>
+<script>
+    new Canvas({
+        canvasId : "canvas-borad",
+        width : 700,
+        height : 400,
+        save : function(data) {
+            $.post("upload.php", {imgBase64: data}, function(res) {
+                if (res.code == "000") {
+                	alert("图片保存成功!");
+                	location.href = res.url;
+                } else {
+                	alert(res.url);
+                }
+            }, "json");
+        }
+    });
+</script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/graft/scrawl.js b/addons/nkeditor/assets/plugins/graft/scrawl.js
new file mode 100644
index 0000000..fe13f07
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/graft/scrawl.js
@@ -0,0 +1,262 @@
+/**
+ * Created by yangjian on 17-9-18.
+ */
+(function($) {
+
+	// 设置元素可用状态
+	$.fn.enable = function() {
+		$(this).addClass("active");
+		$(this).removeAttr("disabled");
+	}
+
+	// 设置元素不可用状态
+	$.fn.disable = function() {
+		$(this).removeClass("active");
+		$(this).attr("disabled", true);
+	}
+
+	var Canvas = function(options) {
+
+		var configs = {
+			width : 360,
+			height : 300
+		}; //默认配置
+		options = options || {};
+		$.extend(configs, options);
+
+		var canvas = $("#"+configs.canvasId)[0]; //画布
+		canvas.width = configs.width;
+		canvas.height = configs.height;
+		var context = canvas.getContext("2d"); //绘图环境
+		context.lineCap = "round"; //设置线条两端为圆弧
+		context.lineJoin = "round"; //设置线条转折为圆弧
+		//设置默认颜色
+		setColor();
+		var $prevBtn = $("#J_prevStep"); //上一步
+		var $nextBtn = $("#J_nextStep"); //下一步
+		var $clearBtn = $("#J_clearBoard"); //清空画板
+		var drawing = false; //是否正在绘制
+		var erasering = false; //是否正在擦除
+		var prevSteps = []; //返回上一步操作集合
+		var nextSteps = []; //恢复下一步操作集合
+		var o = {};
+
+		$("#picBoard").css({
+			width : configs.width + "px",
+			height : configs.height + "px"
+		});
+
+		// 事件绑定
+		canvas.onmousedown = startDrawing;
+		canvas.onmouseup = stopDrawing;
+		canvas.onmouseout = stopDrawing;
+		canvas.onmousemove = doDrawing;
+		$prevBtn.on("click", gotoPrevStep);
+		$nextBtn.on("click", gotoNextStep);
+		$clearBtn.on("click", clearBoard);
+
+		// 清空设置
+		$("#clearSetting").on("click", function() {
+			context.lineWidth = 1;
+			setColor($(".colorBar span:first").data("color"));
+			context.shadowBlur = 0;
+			alert("画笔已重新初始化,请重新配置画笔。");
+		});
+
+		//上传背景图片
+		$("#J_canvas_bg").on("change", function() {
+
+			if ($("#picBoard img").length > 0) {
+				$("#picBoard img:eq(0)").attr("src", window.URL.createObjectURL(this.files[0]));
+				return;
+			}
+			var $img = '<img src="'+window.URL.createObjectURL(this.files[0])+'" width="'+configs.width+'" height="'+configs.height+'" />';
+			$("#picBoard").append($img);
+
+			// 激活删除背景按钮
+			$("#J_removeImg").enable();
+
+		});
+
+		// 删除背景图片
+		$("#J_removeImg").on("click", function() {
+			$("#picBoard").empty();
+			$(this).disable();
+		});
+
+		//保存图片
+		$('#J_saveImg').on("click", saveImage);
+
+		// 设置笔刷大小
+		$("#scrawl-main .brush-size").on("click", function() {
+
+			context.restore(); //恢复到canvas的上一个状态
+			context.lineWidth = parseInt($(this).text());
+			erasering = false;
+
+		});
+
+		// 设置笔触虚化
+		$("#scrawl-main .blur-size").on("click", function() {
+			context.shadowBlur = parseInt($(this).text());
+		});
+
+		// 橡皮擦功能
+		$("#scrawl-main .eraser-size").on("click", function() {
+
+			if (erasering == true) {
+				return;
+			}
+			erasering = true;
+			context.save(); //保存canvas状态
+			context.lineCap = "round"; //设置线条两端为圆弧
+			context.lineJoin = "round"; //设置线条转折为圆弧
+			context.lineWidth = 10;
+			context.globalCompositeOperation = "destination-out";
+
+		});
+
+		//设置颜色
+		$("#scrawl-main .colorBar span").on("click",function() {
+
+			$("#scrawl-main .colorBar .active").removeClass("active");
+			$(this).addClass("active");
+			setColor($(this).data("color"));
+		});
+
+		// 开始绘制
+		function startDrawing(e) {
+			drawing = true;
+			//记录上一步的数据
+			prevSteps.push(context.getImageData(0, 0, configs.width, configs.height));
+			// 创建一个新的绘图路径
+			context.beginPath();
+			// 把画笔移动到鼠标位置
+			var offset = $(canvas).offset();
+			context.moveTo(e.pageX - offset.left, e.pageY - offset.top);
+		}
+
+		// 停止绘制
+		function stopDrawing() {
+
+			drawing = false;
+			//清空下一步的数据集合,从新开始记录
+			nextSteps = [];
+			$nextBtn.disable();
+			if (prevSteps.length == 1) {
+				$prevBtn.enable();
+				$clearBtn.enable();
+			}
+		}
+
+		//绘制图像
+		function doDrawing(e) {
+			if (drawing) {
+				// 找到鼠标最新位置
+				var offset = $(canvas).offset();
+				var x = e.pageX - offset.left;
+				var y = e.pageY - offset.top;
+				// 画一条直线到鼠标最新位置
+				context.lineTo(x, y);
+				context.stroke();
+			}
+		}
+
+		/**
+		 * 返回上一步操作
+		 */
+		function gotoPrevStep() {
+			if (prevSteps.length > 0) {
+				//保存当前状态到下一步的操作历史库
+				nextSteps.push(context.getImageData(0, 0, configs.width, configs.height));
+				var popData = prevSteps.pop();
+				context.putImageData(popData, 0, 0);
+				$nextBtn.enable();
+
+				if (prevSteps.length == 0) {
+					$prevBtn.disable();
+				}
+			}
+		}
+
+		/**
+		 * 恢复下一步操作
+		 */
+		function gotoNextStep() {
+			if (nextSteps.length > 0) {
+				//保存当前状态到上一步的操作历史库
+				prevSteps.push(context.getImageData(0, 0, configs.width, configs.height));
+				var imgData = nextSteps.pop();
+				context.putImageData(imgData, 0, 0);
+				$prevBtn.enable();
+
+				if (nextSteps.length == 0) {
+					$nextBtn.disable();
+				}
+			}
+		}
+
+		/**
+		 * 清空画板
+		 */
+		function clearBoard() {
+			context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+			prevSteps = [];
+			nextSteps = [];
+
+			$prevBtn.disable();
+			$nextBtn.disable();
+			$clearBtn.disable();
+		}
+
+		/**
+		 * 设置画笔颜色
+		 * @param color
+		 */
+		function setColor(color) {
+			if (!color) {
+				color = $(".colorBar .active:eq(0)").data("color");
+			}
+			context.strokeStyle = color;
+			context.shadowColor = color;
+		}
+
+		/**
+		 * 获取图片 base64 编码
+		 */
+		function saveImage(callback) {
+
+			if ($("#picBoard img").length > 0) {
+				var image = new Image();
+				image.src = $("#picBoard img:eq(0)").attr("src");
+				image.onload = function() {
+					context.save();
+					context.shadowBlur = 0;
+					context.shadowColor = '#FFF';
+					context.globalCompositeOperation = "destination-atop";
+					context.drawImage(this, 0, 0, configs.width, configs.height);
+					context.restore();
+
+					callback(canvas.toDataURL("image/png"));
+				}
+
+			} else {
+				callback(canvas.toDataURL("image/png"));
+			}
+		}
+
+
+		//要导出的API
+		o.nextStep = gotoNextStep;
+		o.prevStep = gotoNextStep;
+		o.setColor = setColor;
+		o.save = saveImage;
+		o.isEmpty = function() {
+			return prevSteps.length == 0;
+		}
+		return o;
+	}
+
+
+	window.Canvas = Canvas;
+})(jQuery);
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/image/image.js b/addons/nkeditor/assets/plugins/image/image.js
new file mode 100644
index 0000000..dc4848a
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/image/image.js
@@ -0,0 +1,340 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('image', function(K) {
+	var self = this, name = 'image',
+		allowImageUpload = K.undef(self.allowImageUpload, true),
+		allowImageRemote = K.undef(self.allowImageRemote, true),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		imageTabIndex = K.undef(self.imageTabIndex, 0),
+		imgPath = self.pluginsPath + 'image/images/',
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false),
+		lang = self.lang(name + '.');
+
+	self.plugin.imageDialog = function(options) {
+		var imageUrl = options.imageUrl,
+			imageWidth = K.undef(options.imageWidth, ''),
+			imageHeight = K.undef(options.imageHeight, ''),
+			imageTitle = K.undef(options.imageTitle, ''),
+			imageAlign = K.undef(options.imageAlign, ''),
+			showRemote = K.undef(options.showRemote, true),
+			showLocal = K.undef(options.showLocal, true),
+			tabIndex = K.undef(options.tabIndex, 0),
+			clickFn = options.clickFn;
+		var target = 'kindeditor_upload_iframe_' + new Date().getTime();
+		var hiddenElements = [];
+		for(var k in extraParams){
+			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+		}
+		var html = [
+			'<div class="ke-dialog-content-inner">',
+			//tabs
+			'<div class="tabs"></div>',
+			//remote image - start
+			'<div class="tab1" style="display:none;">',
+			//url
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label for="remoteUrl" class="row-left">' + lang.remoteUrl + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:250px;" /> &nbsp;',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+			'</span>',
+			'</div>',
+			'</div>',
+			//size
+			'<div class="ke-dialog-row ke-clearfix ">',
+			'<label for="remoteWidth" class="row-left">' + lang.size + ':</label>',
+			'<div class="row-right">'+lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',
+			lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ',
+			'<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />',
+			'</div>',
+			'</div>',
+			//align
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label class="row-left">' + lang.align + ':</label>',
+			'<div class="row-right">',
+			'<span><input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> ' +
+			'<img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" /></span>',
+
+			' <span><input type="radio" name="align" class="ke-inline-block" value="left" /> ' +
+			'<img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" /></span>',
+
+			' <span><input type="radio" name="align" class="ke-inline-block" value="right" /> ' +
+			'<img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" /></span>',
+			'</div>',
+			'</div>',
+			//title
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label for="remoteTitle" class="row-left">' + lang.imgTitle + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:250px;" />',
+			'</div>',
+			'</div>',
+			'</div>',
+			//remote image - end
+			//local upload - start
+			'<div class="tab2" style="display:none;">',
+			'<iframe name="' + target + '" style="display:none;"></iframe>',
+			'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'fileType=image') + '">',
+			//file
+			'<div class="ke-dialog-row ke-clearfix">',
+			hiddenElements.join(''),
+			'<label class="row-left">' + lang.localUrl + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:250px;" readonly="true" /> &nbsp;',
+			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" />',
+			'</div>',
+			'</div>',
+			'</form>',
+			'</div>',
+			//local upload - end
+			'</div>'
+		].join('');
+
+		var dialogWidth = showLocal || allowFileManager ? 450 : 400,
+			dialogHeight = showLocal && showRemote ? 310 : 260;
+		var dialog = self.createDialog({
+			name : name,
+			width : dialogWidth,
+			height : dialogHeight,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					// Bugfix: http://code.google.com/p/kindeditor/issues/detail?id=319
+					if (dialog.isLoading) {
+						return;
+					}
+					// insert local image
+					if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) {
+						if (uploadbutton.fileBox.val() == '') {
+							K.options.errorMsgHandler(self.lang('pleaseSelectFile'), "error");
+							return;
+						}
+						dialog.showLoading(self.lang('uploadLoading'));
+						uploadbutton.submit();
+						localUrlBox.val('');
+						return;
+					}
+					// insert remote image
+					var url = K.trim(urlBox.val()),
+						width = widthBox.val(),
+						height = heightBox.val(),
+						title = titleBox.val(),
+						align = '';
+					alignBox.each(function() {
+						if (this.checked) {
+							align = this.value;
+							return false;
+						}
+					});
+					if (url == 'http://' || K.invalidUrl(url)) {
+						K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+						urlBox[0].focus();
+						return;
+					}
+					if (!/^\d*$/.test(width)) {
+						K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+						widthBox[0].focus();
+						return;
+					}
+					if (!/^\d*$/.test(height)) {
+						K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+						heightBox[0].focus();
+						return;
+					}
+					clickFn.call(self, url, title, width, height, 0, align);
+				}
+			},
+			beforeRemove : function() {
+				viewServerBtn.unbind();
+				widthBox.unbind();
+				heightBox.unbind();
+				refreshBtn.unbind();
+			}
+		}),
+		div = dialog.div;
+
+		var urlBox = K('[name="url"]', div),
+			localUrlBox = K('[name="localUrl"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('.tab1 [name="width"]', div),
+			heightBox = K('.tab1 [name="height"]', div),
+			refreshBtn = K('.ke-refresh-btn', div),
+			titleBox = K('.tab1 [name="title"]', div),
+			alignBox = K('.tab1 [name="align"]', div);
+
+		var tabs;
+		if (showRemote && showLocal) {
+			tabs = K.tabs({
+				src : K('.tabs', div),
+				afterSelect : function(i) {}
+			});
+			tabs.add({
+				title : lang.remoteImage,
+				panel : K('.tab1', div)
+			});
+			tabs.add({
+				title : lang.localImage,
+				panel : K('.tab2', div)
+			});
+			tabs.select(tabIndex);
+		} else if (showRemote) {
+			K('.tab1', div).show();
+		} else if (showLocal) {
+			K('.tab2', div).show();
+		}
+
+		var uploadbutton = K.uploadbutton({
+			button : K('.ke-upload-button', div)[0],
+			fieldName : filePostName,
+			form : K('.ke-form', div),
+			target : target,
+			width: 60,
+			afterUpload : function(data) {
+
+				dialog.hideLoading();
+				if (data.code == "000") {
+
+					K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+
+					var url = data.data.url;
+					if (formatUploadUrl) {
+						url = K.formatUrl(url, 'absolute');
+					}
+					if (!fillDescAfterUploadImage) {
+						clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align);
+					} else {
+						K(".ke-dialog-row ke-clearfix #remoteUrl", div).val(url);
+						K(".ke-tabs-li", div)[0].click();
+						K(".ke-refresh-btn", div).click();
+					}
+				} else {
+					K.options.errorMsgHandler(data.message, "error");
+				}
+			},
+			afterError : function(html) {
+				dialog.hideLoading();
+				self.errorDialog(html);
+			}
+		});
+		uploadbutton.fileBox.change(function(e) {
+			localUrlBox.val(uploadbutton.fileBox.val());
+		});
+		if (allowFileManager) {
+			viewServerBtn.click(function(e) {
+				self.loadPlugin('filemanager', function() {
+					self.plugin.filemanagerDialog({
+						dirName : 'image',
+						clickFn : function(url) {
+							K('[name="url"]', div).val(url);
+							if (self.afterSelectFile) {
+								self.afterSelectFile.call(self, url);
+							}
+						}
+					});
+				});
+			});
+		} else {
+			viewServerBtn.hide();
+		}
+		var originalWidth = 0, originalHeight = 0;
+		function setSize(width, height) {
+			widthBox.val(width);
+			heightBox.val(height);
+			originalWidth = width;
+			originalHeight = height;
+		}
+		refreshBtn.click(function(e) {
+			var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({
+				position : 'absolute',
+				visibility : 'hidden',
+				top : 0,
+				left : '-1000px'
+			});
+			tempImg.bind('load', function() {
+				setSize(tempImg.width(), tempImg.height());
+				tempImg.remove();
+			});
+			K(document.body).append(tempImg);
+		});
+		widthBox.change(function(e) {
+			if (originalWidth > 0) {
+				heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10)));
+			}
+		});
+		heightBox.change(function(e) {
+			if (originalHeight > 0) {
+				widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10)));
+			}
+		});
+		urlBox.val(options.imageUrl);
+		setSize(options.imageWidth, options.imageHeight);
+		titleBox.val(options.imageTitle);
+		alignBox.each(function() {
+			if (this.value === options.imageAlign) {
+				this.checked = true;
+				return false;
+			}
+		});
+		if (showRemote && tabIndex === 0) {
+			urlBox[0].focus();
+			urlBox[0].select();
+		}
+		return dialog;
+	};
+	self.plugin.image = {
+		edit : function() {
+			var img = self.plugin.getSelectedImage();
+			self.plugin.imageDialog({
+				imageUrl : img ? img.attr('data-ke-src') : 'http://',
+				imageWidth : img ? img.width() : '',
+				imageHeight : img ? img.height() : '',
+				imageTitle : img ? img.attr('title') : '',
+				imageAlign : img ? img.attr('align') : '',
+				showRemote : allowImageRemote,
+				showLocal : allowImageUpload,
+				tabIndex: img ? 0 : imageTabIndex,
+				clickFn : function(url, title, width, height, border, align) {
+					if (img) {
+						img.attr('src', url);
+						img.attr('data-ke-src', url);
+						img.attr('width', width);
+						img.attr('height', height);
+						img.attr('title', title);
+						img.attr('align', align);
+						img.attr('alt', title);
+					} else {
+						self.exec('insertimage', url, title, width, height, border, align);
+					}
+					// Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog
+					setTimeout(function() {
+						self.hideDialog().focus();
+					}, 0);
+				}
+			});
+		},
+		'delete' : function() {
+			var target = self.plugin.getSelectedImage();
+			if (target.parent().name == 'a') {
+				target = target.parent();
+			}
+			target.remove();
+			// [IE] 删除图片后立即点击图片按钮出错
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.image.edit);
+});
diff --git a/addons/nkeditor/assets/plugins/image/images/align_left.gif b/addons/nkeditor/assets/plugins/image/images/align_left.gif
new file mode 100644
index 0000000..ab17f56
Binary files /dev/null and b/addons/nkeditor/assets/plugins/image/images/align_left.gif differ
diff --git a/addons/nkeditor/assets/plugins/image/images/align_right.gif b/addons/nkeditor/assets/plugins/image/images/align_right.gif
new file mode 100644
index 0000000..e8ebe6a
Binary files /dev/null and b/addons/nkeditor/assets/plugins/image/images/align_right.gif differ
diff --git a/addons/nkeditor/assets/plugins/image/images/align_top.gif b/addons/nkeditor/assets/plugins/image/images/align_top.gif
new file mode 100644
index 0000000..d8826a5
Binary files /dev/null and b/addons/nkeditor/assets/plugins/image/images/align_top.gif differ
diff --git a/addons/nkeditor/assets/plugins/image/images/refresh.png b/addons/nkeditor/assets/plugins/image/images/refresh.png
new file mode 100644
index 0000000..77e12d1
Binary files /dev/null and b/addons/nkeditor/assets/plugins/image/images/refresh.png differ
diff --git a/addons/nkeditor/assets/plugins/insertfile/insertfile.js b/addons/nkeditor/assets/plugins/insertfile/insertfile.js
new file mode 100644
index 0000000..12d6e27
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/insertfile/insertfile.js
@@ -0,0 +1,141 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('insertfile', function(K) {
+	var self = this, name = 'insertfile',
+		allowFileUpload = K.undef(self.allowFileUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		lang = self.lang(name + '.');
+	self.plugin.fileDialog = function(options) {
+		var fileUrl = K.undef(options.fileUrl, 'http://'),
+			fileTitle = K.undef(options.fileTitle, ''),
+			clickFn = options.clickFn;
+		var html = [
+			'<div class="ke-dialog-content-inner">',
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;',
+			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+			'</span>',
+			'</div>',
+			'</div>',
+			//title
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label for="keTitle" class="row-left">' + lang.title + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',
+			'</div>',
+			'</div>',
+			//form end
+			'</form>',
+			'</div>'
+			].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 450,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var url = K.trim(urlBox.val()),
+						title = titleBox.val();
+					if (url == 'http://' || K.invalidUrl(url)) {
+						K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+						urlBox[0].focus();
+						return;
+					}
+					if (K.trim(title) === '') {
+						title = url;
+					}
+					clickFn.call(self, url, title);
+				}
+			}
+		}),
+		div = dialog.div;
+
+		var urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			titleBox = K('[name="title"]', div);
+
+		if (allowFileUpload) {
+			var uploadbutton = K.uploadbutton({
+				button : K('.ke-upload-button', div)[0],
+				fieldName : filePostName,
+				url : K.addParam(uploadJson, 'fileType=file'),
+				extraParams : extraParams,
+				afterUpload : function(data) {
+					dialog.hideLoading();
+					if (data.code === "000") {
+						var url = data.data.url;
+						if (formatUploadUrl) {
+							url = K.formatUrl(url, 'absolute');
+						}
+						urlBox.val(url);
+						if (self.afterUpload) {
+							self.afterUpload.call(self, url, data, name);
+						}
+						K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+					} else {
+						K.options.errorMsgHandler(data.message, "error");
+					}
+				},
+				afterError : function(html) {
+					dialog.hideLoading();
+					self.errorDialog(html);
+				}
+			});
+			uploadbutton.fileBox.change(function(e) {
+				dialog.showLoading(self.lang('uploadLoading'));
+				uploadbutton.submit();
+			});
+		} else {
+			K('.ke-upload-button', div).hide();
+		}
+		if (allowFileManager) {
+			viewServerBtn.click(function(e) {
+				self.loadPlugin('filemanager', function() {
+					self.plugin.filemanagerDialog({
+						viewType : 'LIST',
+						dirName : 'file',
+						clickFn : function(url) {
+							//console.log(url);
+							K('[name="url"]', div).val(url);
+							if (self.afterSelectFile) {
+								self.afterSelectFile.call(self, url);
+							}
+						}
+					});
+				});
+			});
+		} else {
+			K("#keUrl").css("width", "250px");
+			viewServerBtn.hide();
+		}
+		urlBox.val(fileUrl);
+		titleBox.val(fileTitle);
+		urlBox[0].focus();
+		urlBox[0].select();
+	};
+	self.clickToolbar(name, function() {
+		self.plugin.fileDialog({
+			clickFn : function(url, title) {
+				var html = '<a class="ke-insertfile" href="' + url + '" data-ke-src="' + url + '" target="_blank">' + title + '</a>';
+				self.insertHtml(html).hideDialog().focus();
+			}
+		});
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/lineheight/lineheight.js b/addons/nkeditor/assets/plugins/lineheight/lineheight.js
new file mode 100644
index 0000000..ae679d7
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/lineheight/lineheight.js
@@ -0,0 +1,38 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('lineheight', function(K) {
+	var self = this, name = 'lineheight', lang = self.lang(name + '.');
+	self.clickToolbar(name, function() {
+		var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'});
+		if (commonNode) {
+			curVal = commonNode.css('line-height');
+		}
+		var menu = self.createMenu({
+			name : name,
+			width : 150
+		});
+		K.each(lang.lineHeight, function(i, row) {
+			K.each(row, function(key, val) {
+				menu.addItem({
+					title : val,
+					checked : curVal === key,
+					click : function() {
+						self.cmd.toggle('<span style="line-height:' + key + ';"></span>', {
+							span : '.line-height=' + key
+						});
+						self.updateState();
+						self.addBookmark();
+						self.hideMenu();
+					}
+				});
+			});
+		});
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/link/link.js b/addons/nkeditor/assets/plugins/link/link.js
new file mode 100644
index 0000000..9a42fbd
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/link/link.js
@@ -0,0 +1,71 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('link', function(K) {
+	var self = this, name = 'link';
+	self.plugin.link = {
+		edit : function() {
+			var lang = self.lang(name + '.'),
+				html = ['<div class="ke-dialog-content-inner">',
+				//url
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+				'<div class="row-right">',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" />',
+				'</div>',
+				'</div>',
+				//type
+				'<div class="ke-dialog-row ke-clearfix"">',
+				'<label for="keType" class="row-left">' + lang.linkType + ':</label>',
+				'<div class="row-right">',
+				'<select id="keType" class="ke-select" name="type"></select>',
+				'</div>',
+				'</div>',
+				'</div>'].join(""),
+				dialog = self.createDialog({
+					name : name,
+					width : 450,
+					title : self.lang(name),
+					body : html,
+					yesBtn : {
+						name : self.lang('yes'),
+						click : function(e) {
+							var url = K.trim(urlBox.val());
+							if (url == 'http://' || K.invalidUrl(url)) {
+								K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+								urlBox[0].focus();
+								return;
+							}
+							self.exec('createlink', url, typeBox.val()).hideDialog().focus();
+						}
+					}
+				}),
+				div = dialog.div,
+				urlBox = K('input[name="url"]', div),
+				typeBox = K('select[name="type"]', div);
+			urlBox.val('http://');
+			typeBox[0].options[0] = new Option(lang.newWindow, '_blank');
+			typeBox[0].options[1] = new Option(lang.selfWindow, '');
+			self.cmd.selection();
+			var a = self.plugin.getSelectedLink();
+			if (a) {
+				self.cmd.range.selectNode(a[0]);
+				self.cmd.select();
+				urlBox.val(a.attr('data-ke-src'));
+				typeBox.val(a.attr('target'));
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.exec('unlink', null);
+		}
+	};
+	self.clickToolbar(name, self.plugin.link.edit);
+});
diff --git a/addons/nkeditor/assets/plugins/map/map.html b/addons/nkeditor/assets/plugins/map/map.html
new file mode 100644
index 0000000..fb27555
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/map/map.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+	<head>
+	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
+	<style>
+		html { height: 100% }
+		body { height: 100%; margin: 0; padding: 0; background-color: #FFF }
+		#map_canvas { height: 100% }
+	</style>
+	<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=zh_CN"></script>
+	<script>
+		var map, geocoder;
+		function initialize() {
+			var latlng = new google.maps.LatLng(-34.397, 150.644);
+			var options = {
+				zoom: 11,
+				center: latlng,
+				disableDefaultUI: true,
+				panControl: true,
+				zoomControl: true,
+				mapTypeControl: true,
+				scaleControl: true,
+				streetViewControl: false,
+				overviewMapControl: true,
+				mapTypeId: google.maps.MapTypeId.ROADMAP
+			};
+			map = new google.maps.Map(document.getElementById("map_canvas"), options);
+			geocoder = new google.maps.Geocoder();
+			geocoder.geocode({latLng: latlng}, function(results, status) {
+				if (status == google.maps.GeocoderStatus.OK) {
+					if (results[3]) {
+						parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;
+					}
+				}
+			});
+		}
+		function search(address) {
+			if (!map) return;
+			geocoder.geocode({address : address}, function(results, status) {
+				if (status == google.maps.GeocoderStatus.OK) {
+					map.setZoom(11);
+					map.setCenter(results[0].geometry.location);
+					var marker = new google.maps.Marker({
+						map: map,
+						position: results[0].geometry.location
+					});
+				} else {
+					alert("Invalid address: " + address);
+				}
+			});
+		}
+	</script>
+	</head>
+	<body onload="initialize();">
+		<div id="map_canvas" style="width:100%; height:100%"></div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/map/map.js b/addons/nkeditor/assets/plugins/map/map.js
new file mode 100644
index 0000000..5290875
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/map/map.js
@@ -0,0 +1,137 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Google Maps: http://code.google.com/apis/maps/index.html
+
+KindEditor.plugin('map', function(K) {
+	var self = this, name = 'map', lang = self.lang(name + '.');
+	self.clickToolbar(name, function() {
+		var html = ['<div style="padding:10px 20px;">',
+			'<div class="ke-dialog-row">',
+			lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
+			'</span>',
+			'</div>',
+			'<div class="ke-map" style="width:558px;height:360px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 600,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var geocoder = win.geocoder,
+						map = win.map,
+						center = map.getCenter().lat() + ',' + map.getCenter().lng(),
+						zoom = map.getZoom(),
+						maptype = map.getMapTypeId(),
+						url = 'http://maps.googleapis.com/maps/api/staticmap';
+						url += '?center=' + encodeURIComponent(center);
+						url += '&zoom=' + encodeURIComponent(zoom);
+						url += '&size=558x360';
+						url += '&maptype=' + encodeURIComponent(maptype);
+						url += '&markers=' + encodeURIComponent(center);
+						url += '&language=' + self.langType;
+						url += '&sensor=false';
+					self.exec('insertimage', url).hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			win, doc;
+		var iframeHtml = ['<!doctype html><html><head>',
+			'<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',
+			'<style>',
+			'	html { height: 100% }',
+			'	body { height: 100%; margin: 0; padding: 0; background-color: #FFF }',
+			'	#map_canvas { height: 100% }',
+			'</style>',
+			'<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=' + self.langType + '"></script>',
+			'<script>',
+			'var map, geocoder;',
+			'function initialize() {',
+			'	var latlng = new google.maps.LatLng(31.230393, 121.473704);',
+			'	var options = {',
+			'		zoom: 11,',
+			'		center: latlng,',
+			'		disableDefaultUI: true,',
+			'		panControl: true,',
+			'		zoomControl: true,',
+			'		mapTypeControl: true,',
+			'		scaleControl: true,',
+			'		streetViewControl: false,',
+			'		overviewMapControl: true,',
+			'		mapTypeId: google.maps.MapTypeId.ROADMAP',
+			'	};',
+			'	map = new google.maps.Map(document.getElementById("map_canvas"), options);',
+			'	geocoder = new google.maps.Geocoder();',
+			'	geocoder.geocode({latLng: latlng}, function(results, status) {',
+			'		if (status == google.maps.GeocoderStatus.OK) {',
+			'			if (results[3]) {',
+			'				parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',
+			'			}',
+			'		}',
+			'	});',
+			'}',
+			'function search(address) {',
+			'	if (!map) return;',
+			'	geocoder.geocode({address : address}, function(results, status) {',
+			'		if (status == google.maps.GeocoderStatus.OK) {',
+			'			map.setZoom(11);',
+			'			map.setCenter(results[0].geometry.location);',
+			'			var marker = new google.maps.Marker({',
+			'				map: map,',
+			'				position: results[0].geometry.location',
+			'			});',
+			'		} else {',
+			'			alert("Invalid address: " + address);',
+			'		}',
+			'	});',
+			'}',
+			'</script>',
+			'</head>',
+			'<body onload="initialize();">',
+			'<div id="map_canvas" style="width:100%; height:100%"></div>',
+			'</body></html>'].join('\n');
+		// TODO:用doc.write(iframeHtml)方式加载时,在IE6上第一次加载报错,暂时使用src方式
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'map/map.html" style="width:558px;height:360px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+			//doc.open();
+			//doc.write(iframeHtml);
+			//doc.close();
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/media/media.js b/addons/nkeditor/assets/plugins/media/media.js
new file mode 100644
index 0000000..fab7faa
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/media/media.js
@@ -0,0 +1,186 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('media', function(K) {
+	var self = this, name = 'media', lang = self.lang(name + '.'),
+		allowMediaUpload = K.undef(self.allowMediaUpload, false),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+
+	self.plugin.media = {
+		edit : function() {
+			var html = [
+				'<div class="ke-dialog-content-inner">',
+				//url
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+				'<div class="row-right">',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:180px;" /> &nbsp;',
+				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+				'<span class="ke-button-common ke-button-outer">',
+				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+				'</span>',
+				'<div>支持优酷、爱奇艺、土豆、腾讯视频、56等视频网站【<span style="color:green">通用代码</span>】',
+				'</div>',
+				'</div>',
+				'</div>',
+				//width
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keWidth" class="row-left">' + lang.width + ':</label>',
+				'<div class="row-right">',
+				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',
+				'</div>',
+				'</div>',
+				//height
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keHeight" class="row-left">' + lang.height + ':</label>',
+				'<div class="row-right">',
+				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',
+				'</div>',
+				'</div>',
+				//autostart
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keAutostart" class="row-left">' + lang.autostart + ':</label>',
+				'<div class="row-right">',
+				'<input type="checkbox" id="keAutostart" name="autostart" class="ke-input-checkbox" value="" /> ',
+				'</div>',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 450,
+				height : 260,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+                        var url = K.trim(urlBox.val()),
+                            width = widthBox.val(),
+                            height = heightBox.val();
+                        var match = url.match(/^<iframe\s(.*?)src=('|")(.*?)('|")/);
+                        if(!match) {
+                            if (url == 'http://' || K.invalidUrl(url)) {
+                                K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                                urlBox[0].focus();
+                                return;
+                            }
+                        }
+                        if (!/^\d*$/.test(width)) {
+                            K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                            widthBox[0].focus();
+                            return;
+                        }
+                        if (!/^\d*$/.test(height)) {
+                            K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                            heightBox[0].focus();
+                            return;
+                        }
+                        if(!match) {
+                            var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+                                src: url,
+                                type: K.mediaType(url),
+                                width: width,
+                                height: height,
+                                autostart: autostartBox[0].checked ? 'true' : 'false',
+                                loop: 'true'
+                            });
+                        } else {
+                            var html = '<iframe src="' + match[3] + '" frameborder="0" style="width:' + width + 'px;height:' + height + 'px;"></iframe>';
+                        }
+                        self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('[name="width"]', div),
+			heightBox = K('[name="height"]', div),
+			autostartBox = K('[name="autostart"]', div);
+			urlBox.val('http://');
+
+			if (allowMediaUpload) {
+				var uploadbutton = K.uploadbutton({
+					button : K('.ke-upload-button', div)[0],
+					fieldName : filePostName,
+					extraParams : extraParams,
+					url : K.addParam(uploadJson, 'fileType=media'),
+					afterUpload : function(data) {
+						dialog.hideLoading();
+						if (data.code == "000") {
+							var url = data.data.url;
+							if (formatUploadUrl) {
+								url = K.formatUrl(url, 'absolute');
+							}
+							urlBox.val(url);
+
+							if (self.afterUpload) {
+								self.afterUpload.call(self, url, data, name);
+							}
+							K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+						} else {
+							K.options.errorMsgHandler(data.message, "error", "error");
+						}
+					},
+					afterError : function(html) {
+						dialog.hideLoading();
+						self.errorDialog(html);
+					}
+				});
+				uploadbutton.fileBox.change(function(e) {
+					dialog.showLoading(self.lang('uploadLoading'));
+					uploadbutton.submit();
+				});
+			} else {
+				K('.ke-upload-button', div).hide();
+			}
+
+			if (allowMediaUpload && allowFileManager) {
+				viewServerBtn.click(function(e) {
+					self.loadPlugin('filemanager', function() {
+						self.plugin.filemanagerDialog({
+							dirName : 'media',
+							clickFn : function(url) {
+								K('[name="url"]', div).val(url);
+								if (self.afterSelectFile) {
+									self.afterSelectFile.call(self, url);
+								}
+							}
+						});
+					});
+				});
+			} else {
+				K("#keUrl").css("width", "280px");
+				viewServerBtn.hide();
+			}
+
+			var img = self.plugin.getSelectedMedia();
+			if (img) {
+				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+				urlBox.val(attrs.src);
+				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+				autostartBox[0].checked = (attrs.autostart === 'true');
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedMedia().remove();
+			// [IE] 删除图片后立即点击图片按钮出错
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.media.edit);
+});
diff --git a/addons/nkeditor/assets/plugins/multiimage/BUpload.js b/addons/nkeditor/assets/plugins/multiimage/BUpload.js
new file mode 100644
index 0000000..a314e0c
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/multiimage/BUpload.js
@@ -0,0 +1,625 @@
+/**
+ * HTML5上传插件
+ * @site https://git.oschina.net/blackfox/ajaxUpload
+ * @author yangjian<yangjian102621@gmail.com>
+ * @version 1.0.1
+ */
+(function($) {
+
+	//判断浏览器是否支持html5
+	// if ( !window.applicationCache )
+	// 	throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");
+
+	//image crop
+	$.fn.imageCrop = function(__width, __height) {
+		$(this).on("load", function () {
+
+			var width, height, left, top;
+			var orgRate = this.width/this.height;
+			var cropRate = __width/__height;
+			if ( orgRate >= cropRate ) {
+				height = __height;
+				width = __width * orgRate;
+				top = 0;
+				left = (width - __width)/2;
+			} else {
+				width = __width;
+				height = __height / orgRate;
+				left = 0;
+				//top = (height - __height)/2;
+				top = 0;
+			}
+			$(this).css({
+				"position" : "absolute",
+				top : -top + "px",
+				left : -left + "px",
+				width : width + "px",
+				height : height + "px"
+			});
+		});
+	}
+
+	//make element draggable
+	$.fn.draggable = function(options) {
+		var defaults = {
+			handler : null
+		}
+		options = $.extend(defaults, options);
+		var __self = this;
+		$(options.handler).mousedown(function(e) {
+			var offsetLeft = e.pageX - $(__self).position().left;
+			var offsetTop = e.pageY - $(__self).position().top;
+			$(document).mousemove(function(e) {
+				//清除拖动鼠标的时候选择文本
+				window.getSelection ? window.getSelection().removeAllRanges():document.selection.empty();
+				$(__self).css({
+					'top'  : e.pageY-offsetTop + 'px',
+					'left' : e.pageX-offsetLeft + 'px'
+				});
+			});
+
+		}).mouseup(function() {
+			$(document).unbind('mousemove');
+		});
+
+	}
+
+	if ( Array.prototype.remove == undefined ) {
+		Array.prototype.remove = function(item) {
+			for ( var i = 0; i < this.length; i++ ) {
+				if ( this[i] == item ) {
+					this.splice(i, 1);
+					break;
+				}
+			}
+		}
+	}
+	if ( Array.prototype.uinque == undefined ) {
+		Array.prototype.uinque = function() {
+			var result = [], hash = {};
+			for ( var i = 0, item; (item = this[i]) != null; i++ ) {
+				if ( !hash[item] ) {
+					result.push(item);
+					hash[item] = true;
+				}
+			}
+			return result;
+		}
+	}
+
+	window.BUpload = function(options) {
+
+		options = $.extend({
+			src : "src",
+			upload_url : null,
+			list_url : null,
+			data_type : "json",
+			top : 20,
+			fileType : "image", //文件类型,默认是图片,可选flash,media,file
+			max_filesize : 2048,    //unit:KB
+			max_filenum : 20,
+			no_data_text : "(⊙o⊙)亲,没有多数据了。",
+			ext_allow : "jpg|png|gif|jpeg",
+			ext_refuse : "exe|txt",
+			errorHandler : function(messsage, type) {
+				alert(messsage);
+			},
+			callback : function(data) {
+				console.log(data);
+			}
+		}, options);
+
+		//错误代码和提示消息
+		var codeMessageMap = {
+			'000' : '文件上传成功',
+			'001' : '文件上传失败',
+			'003' : '文件大小超出限制',
+			'004' : '非法文件名后缀'
+		};
+
+		var mimeType = {
+			"3gpp":"audio/3gpp, video/3gpp",
+			"ac3":"audio/ac3",
+			"asf":"allpication/vnd.ms-asf",
+			"au":"audio/basic",
+			"css":"text/css",
+			"csv":"text/csv",
+			"doc":"application/msword",
+			"dot":"application/msword",
+			"dtd":"application/xml-dtd",
+			"dwg":"image/vnd.dwg",
+			"dxf":"image/vnd.dxf",
+			"gif":"image/gif",
+			"htm":"text/html",
+			"html":"text/html",
+			"jp2":"image/jp2",
+			"jpe":"image/jpeg",
+			"jpeg":"image/jpeg",
+			"jpg":"image/jpeg",
+			"js":"text/javascript, application/javascript",
+			"json":"application/json",
+			"mp2":"audio/mpeg, video/mpeg",
+			"mp3":"audio/mpeg",
+			"mp4":"audio/mp4, video/mp4",
+			"mpeg":"video/mpeg",
+			"mpg":"video/mpeg",
+			"mpp":"application/vnd.ms-project",
+			"ogg":"application/ogg, audio/ogg",
+			"pdf":"application/pdf",
+			"png":"image/png",
+			"pot":"application/vnd.ms-powerpoint",
+			"pps":"application/vnd.ms-powerpoint",
+			"ppt":"application/vnd.ms-powerpoint",
+			"rtf":"application/rtf, text/rtf",
+			"svf":"image/vnd.svf",
+			"tif":"image/tiff",
+			"tiff":"image/tiff",
+			"txt":"text/plain",
+			"wdb":"application/vnd.ms-works",
+			"wps":"application/vnd.ms-works",
+			"xhtml":"application/xhtml+xml",
+			"xlc":"application/vnd.ms-excel",
+			"xlm":"application/vnd.ms-excel",
+			"xls":"application/vnd.ms-excel",
+			"xlt":"application/vnd.ms-excel",
+			"xlw":"application/vnd.ms-excel",
+			"xml":"text/xml, application/xml",
+			"zip":"aplication/zip",
+			"xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+		}
+
+		var o = {};
+		o.dialog = null;
+		o.todoList = new Array(); //the file queue to be uploaded
+		o.uploadSuccessNum = 0; //已经上传成功的图片数量
+		o.selectedList = new Array(); //the file queue upload successfully
+		o.addedFileNumber = 0; //the numbers of files that has added
+		o.totalFilesize = 0; //total file size
+		o.uploadLock = false; //upload thread lock
+		o.page = 1; //服务器图片列表页码
+		o.marker = null, //七牛云上传的分页标识
+		o.noRecord = false;
+		var dialogSCode = Math.ceil(Math.random() * 1000000000000); //对话框的令牌,如果创建多个BUpload上传对象用来保持唯一性
+
+		//close the dialog
+		o.close = function () {
+			o.dialog.remove();
+			if (typeof options.close == 'function') {
+				options.close();
+			}
+		}
+
+		//create dialog
+		function createDialog() {
+
+			var builder = new StringBuilder();
+			builder.append('<div class="uedbody ke-animated"><div class="ued_title">');
+			builder.append('<div class="uedbar"><span>'+options.lang.title+'</span></div><div class="close_btn icon"' +
+				' title="'+options.lang.closeText+'"></div>');
+			builder.append('</div><div class="wrapper"><div id="wra_head" class="wra_head"><span class="tab' +
+				' tab-upload focus" tab="upload-panel">'+options.lang.localUpload+'</span>');
+			if ( options.list_url != null ) {
+				builder.append('<span class="tab tab-online" tab="online">'+options.lang.fileServer+'</span>');
+			}
+			builder.append('</div><div class="wra_body"><div class="tab-panel upload-panel"><div class="wra_pla"><div class="upload-image-placeholder">');
+			builder.append('<div class="btn btn-primary image-select">'+options.lang.selectFile+'</div><input type="file" name="'+options.src+'" class="webuploader-element-invisible"' +
+				' multiple="multiple" accept="'+getAccept()+'">');
+			builder.append('</div></div><div class="image-list-box" style="display: none;"><div class="wra_bar"><div class="info fl"></div>');
+			builder.append('<div class="fr"><span class="btn btn-default btn-continue-add">'+options.lang.continueAdd+'</span><span class="btn btn-primary btn-start-upload">'+options.lang.startUpload+'</span></div></div>');
+			builder.append('<ul class="filelist"></ul></div></div><div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>');
+			builder.append('<div class="tab-panel searchbox"><div class="search-bar"><input class="searTxt"' +
+				' type="text" placeholder="'+options.lang.searchPlaceholder+'" />');
+			builder.append('<input value="'+options.lang.searchBtn+'" class="btn btn-primary btn-search" type="button" /><input value="'+options.lang.searchClear+'" class="btn btn-default btn-reset" type="button" />');
+			builder.append('</div><div class="search-imagelist-box"><ul class="search-list"></ul><div class="no-data"></div></div>');
+			builder.append('</div><div class="loading-icon"></div></div><!-- end of wrapper --></div><div class="wra-btn-group"><span class="btn btn-primary btn-confirm">'+options.lang.confirmBtnText+'</span>');
+			builder.append('<span class="btn btn-default btn-cancel">'+options.lang.cancelBtnText+'</span></div></div>');
+
+			o.dialog = $(builder.toString());
+			$("body").append(o.dialog);
+			if (options.top == 0) {
+				options.top = ($(window).height() - o.dialog.height())/2;
+			}
+			o.dialog.css({
+				left : ($(window).width() - o.dialog.width())/2 + "px",
+				top : options.top + "px"
+			});
+			//给对话框添加拖拽事件
+			o.dialog.draggable({handler : o.dialog.find(".ued_title")})
+
+		}
+
+		//绑定元素事件
+		function bindEvent() {
+
+			//选项卡事件
+			G(".tab").on("click", function() {
+				var tab = $(this).attr("tab");
+				G(".tab-panel").hide();
+				G("."+tab).show();
+				G(".tab").removeClass("focus");
+				$(this).addClass("focus");
+			});
+
+			//关闭对话框
+			G(".close_btn").on("click", function() {
+				o.close();
+			});
+
+			//选择文件事件
+			G(".webuploader-element-invisible").on("change", function() {
+				addFiles(this);
+			});
+
+			//弹出上传文件选择框
+			G(".image-select").on("click", function() {
+				G(".webuploader-element-invisible").trigger("click");
+			});
+			G(".btn-continue-add").on("click", function() {
+				G(".webuploader-element-invisible").trigger("click");
+			});
+
+			//开始上传按钮事件
+			G(".btn-start-upload").on("click", function() {
+				if ( o.uploadLock ) return;
+
+				if ( o.todoList.length == 0 ) {
+					options.errorHandler(options.lang.noFileAdded, "error");
+					return false;
+				}
+				$(this).addClass("disabled").text(options.lang.uploading);
+				uploadFile(o.todoList.shift());
+			});
+
+			//点击确认|取消按钮事件
+			G(".btn-confirm").on("click", function() {
+				if ( o.todoList.length > 0 ) {
+					options.errorHandler(options.lang.fileNotUpload, "error");
+					return false;
+				}
+				if (o.selectedList.length == 0) {
+					options.errorHandler(options.lang.noFileSelected, "error");
+					return false;
+				}
+				options.callback(o.selectedList);
+				o.close();
+
+			});
+			G(".btn-cancel").on("click", function() {
+				o.close();
+			});
+
+			//从服务器加载文件
+			G(".tab-online").on("click", function() {
+
+				if ( G(".imagelist .list").children().length == 0 ) {
+					loadFilesFromServer()
+				}
+
+			});
+
+			//当滚动条滚到底部时自动去加载图片
+			G(".imagelist").on("scroll", function() {
+
+				if ( this.scrollTop + this.clientHeight >= this.scrollHeight ) {
+					loadFilesFromServer();
+				}
+			});
+		}
+
+		//add file to upload list
+		function addFiles(input) {
+
+			var files = input.files;
+			var totalFileNum = o.todoList.length + o.uploadSuccessNum + files.length; //本次上传文件总数
+			for ( var i = o.addedFileNumber; i < o.addedFileNumber+files.length; i++ ) {
+
+				if ( totalFileNum > options.max_filenum ) {
+					options.errorHandler(KindEditor.tmpl(options.lang.uploadLimit, {uploadLimit: options.max_filenum}), "error");
+					return;
+				}
+				var builder = new StringBuilder();
+				var tempFile = files[i- o.addedFileNumber];
+				builder.append('<li id="img-comtainer-'+dialogSCode+i+'"><div class="imgWrap">');
+
+				//如果上传的不是图片,则通过判断文件后缀来显示不同的图标
+				var extension = getFileExt(tempFile.name);
+				if ( extension == '' ) extension = "default";
+				extension = extension.toLowerCase();
+				if ( "jpg|jpeg|gif|png|bmp".indexOf(extension) == -1 ) {
+					builder.append('<span class="icon-placeholder icon-default icon-'+extension+'"></span>');
+				} else {
+					builder.append('<img src="'+window.URL.createObjectURL(tempFile)+'" border="0" />');
+				}
+
+				builder.append('</div><div class="file-opt-box clearfix"><span class="remove" index="'+i+'">'+options.lang.remove+'</span><span class="rotateRight">'+options.lang.rotateRight+'</span>');
+				builder.append('<span class="rotateLeft">'+options.lang.rotateLeft+'</span></div><div class="success"></div><div class="error"></div>');
+				builder.append('<div class="progress"><span style="display: none; width: 0px;"></span></div></li>');
+
+				var $image = $(builder.toString());
+				//bind onelele event
+				$image.find(".remove").on("click", function() {
+					$(this).parents("li").remove(); //remove element
+					//remove file from todoList
+					var index = $(this).attr("index");
+					for ( var i = 0; i < o.todoList.length; i++ ) {
+						if ( o.todoList[i].index == index ) {
+							o.totalFilesize -= o.todoList[i].file.size;
+							updateInfoText(o.uploadSuccessNum + o.todoList.length-1, o.totalFilesize);
+							o.todoList.splice(i, 1);
+							break;
+						}
+					}
+					if (G(".filelist li").length == 0) {
+						G(".image-list-box").hide();
+						G(".wra_pla").show();
+					}
+				});
+				$image.on("mouseover", function() {
+					$(this).find(".file-opt-box").show();
+				}).on("mouseout", function() {
+					$(this).find(".file-opt-box").hide();
+				});
+
+				G(".wra_pla").hide();
+				G(".image-list-box").show();
+				G(".filelist").append($image);
+
+				o.todoList.push({index:i, file:tempFile});
+				o.totalFilesize += tempFile.size;
+
+				//console.log(tempFile);
+			}
+			o.addedFileNumber += files.length;
+			updateInfoText(o.uploadSuccessNum + o.todoList.length, o.totalFilesize);
+
+			//缩放并裁剪图片
+			$(".imgWrap img").imageCrop(113,113);
+
+		}
+
+		/**
+		 * upload file function(文件上传主函数)
+		 * @param node 数据节点
+		 */
+		function uploadFile(node) {
+
+			if ( !fileCheckHandler(node) ) {
+				uploadNextFile();   //skip the file and upload the next file
+				return;
+			}
+
+			// prepare XMLHttpRequest
+			var xhr = new XMLHttpRequest();
+			xhr.open('POST', options.upload_url);
+			//upload successfully
+			xhr.addEventListener('load',function(e) {
+
+				if ( options.data_type == "json" ) {
+					//console.log(e);
+					var data = $.parseJSON(e.target.responseText);
+					if ( data.code == "000" ) {
+						o.selectedList.push(data.data.url);   //添加文件到上传文件列表
+						o.uploadSuccessNum++;
+						$("#img-comtainer-"+dialogSCode+ node.index).find(".file-opt-box").remove();
+						$("#img-comtainer-"+dialogSCode+ node.index).find(".progress").remove();
+						$("#img-comtainer-"+dialogSCode+ node.index).find(".success").show();
+					} else {
+						__error__(codeMessageMap[data.code], node);
+					}
+				}
+
+			}, false);
+
+			// file upload complete
+			xhr.addEventListener('loadend', function () {
+				uploadNextFile();   //upload the next file
+			}, false);
+
+			//上传失败
+			xhr.addEventListener('error', function() {
+				__error__(options.lang.uploadFail, node);
+			}, false);
+
+			xhr.upload.addEventListener('progress', function(e) {
+				updateProgress(e, node);
+			}, false);
+
+			// prepare FormData
+			var formData = new FormData();
+			formData.append(options.src, node.file);
+			xhr.send(formData);
+
+		}
+
+		//upload next file(上传下一个文件)
+		function uploadNextFile() {
+
+			if ( o.todoList.length ) {
+				var nextFile = o.todoList.shift();
+				uploadFile(nextFile);
+			} else {
+				o.uploadLock = false; //release the upload lock
+				G(".btn-start-upload").removeClass("disabled").text(options.lang.startUpload);
+				//console.log(o.selectedList);
+			}
+		}
+
+		// progress handler(文件上传进度控制)
+		function updateProgress(e, node) {
+			if ( e.lengthComputable ) {
+				$("#img-comtainer-"+dialogSCode+ node.index).find(".progress span").css({"width" : (e.loaded/e.total)*100+'%', "display":"block"});
+			}
+		}
+
+		//update file info text
+		function updateInfoText(filenum, filesize) {
+			var text = KindEditor.tmpl(options.lang.uploadDesc, {numSelect:filenum, totalSize:formatFileSize(filesize), numLeft:(options.max_filenum - filenum)});
+			G(".info").text(text);
+		}
+
+		//format file size(格式化文件大小)
+		function formatFileSize(size) {
+
+			if ( size/1048576 > 1 ) {
+				return (size/1048576).toFixed(2)+"MB";
+			} else {
+				return (size/1024).toFixed(2)+"KB";
+			}
+
+		}
+
+		//file check handler(文件检测处理函数)
+		function fileCheckHandler(node) {
+
+			//检查文件大小
+			var maxsize = options.max_filesize * 1024;
+			if ( maxsize > 0 && node.file.size > maxsize ) {
+				__error__(KindEditor.tmpl(options.lang.sizeLimit, {sizeLimit:options.max_filesize}), node);
+				return false;
+			}
+
+			//检查文件后缀名
+			var ext = getFileExt(node.file.name);
+			if ( ext && options.ext_allow.indexOf(ext) != -1
+				&& options.ext_refuse.indexOf(ext) == -1 ) {
+				return true;
+			} else {
+				__error__(KindEditor.tmpl(options.lang.invalidExt, {invalidExt:ext}), node);
+				return false;
+			}
+
+		}
+
+		//获取文件后缀名
+		function getFileExt(filename) {
+			if ( !filename ) return false;
+			var position = filename.lastIndexOf('.')
+			if ( position != -1 ) {
+				return filename.substr(position+1).toLowerCase();
+			}
+			return false;
+		}
+
+		//获取可接受的文件后缀
+		function getAccept() {
+			var extensions = options.ext_allow.split("|");
+			var accept = [];
+			$.each(extensions, function(idx, item) {
+				accept.push(mimeType[item]);
+			});
+			if ( accept.length > 1 ) {
+				return accept.uinque().join(",");
+			}
+			return "*";
+		}
+
+		//显示上传错误信息
+		function __error__(message, node) {
+			G("#img-comtainer-"+dialogSCode+ node.index).find(".error").show().text(message);
+		}
+
+		//query
+		function G(query) {
+			return o.dialog.find(query);
+		}
+
+		//从服务器上获取图片地址
+		function loadFilesFromServer() {
+			if ( !options.list_url ) {
+				G(".online .no-data").html('<span class="error">'+options.lang.noListUrl+'</span>').show();
+				return false;
+			}
+			if ( o.noRecord ) return false;
+
+			G(".loading-icon").show(); //显示加载图标
+			$.get(options.list_url, {
+				page : o.page,
+				marker : o.marker,
+				fileType : options.fileType,
+			}, function(res) {
+
+				G(".loading-icon").hide(); //隐藏加载图标
+				if ( res.code == "000" ) {
+
+					if (!res.data[0]) { //没有加载到数据
+						G(".online .no-data").text(options.lang.noDataText).show();
+						return;
+					}
+					o.marker = res.extra; //存储marker
+					o.page++;
+					appendFiles(res.data, "online");
+				} else {
+					G(".online .no-data").text(options.lang.noDataText).show();
+					o.noRecord = true;
+				}
+
+			}, "json");
+		}
+
+		//追加元素到图片列表
+		function appendFiles(data, module) {
+
+			$.each(data, function(idx, item) {
+
+				var builder = new StringBuilder();
+				builder.append('<li>');
+				var extension = getFileExt(item.thumbURL);
+				if ( extension == '' ) extension = "default";
+				extension = extension.toLowerCase();
+				//如果不是图片,则根据文件的后缀名去加载对应的缩略图
+				var imgSize = item.width+'x'+item.height; //图片尺寸
+				if ( "jpg|jpeg|gif|png|bmp".indexOf(extension) == -1 ) {
+					imgSize = formatFileSize(item.filesize); //如果是文件则显示文件大小
+					builder.append('<span class="icon-placeholder icon-'+extension+'" data-src="'+item.oriURL+'"></span>');
+				} else {
+					builder.append('<img src="'+item.thumbURL+'" data-src="'+item.oriURL+'" border="0">');
+				}
+
+				builder.append('<span class="ic" data-module="'+module+'"><em class="img-size">'+imgSize+'</em></span></li>');
+				var $image = $(builder.toString());
+
+				//绑定选择图片事件
+				$image.find(".ic").on("click", function() {
+					var src = $(this).prev().data("src");
+					var module = $(this).data("module");
+					if ( $(this).hasClass("selected") ) {
+						$(this).removeClass("selected");
+					} else {
+						$(this).addClass("selected");
+						o.selectedList.push(src);
+					}
+					//console.log(o.selectedList);
+				});
+				//裁剪显示图片
+				$image.find("img").imageCrop(113, 113);
+				if ( module == "online" ) {
+					G(".imagelist .list").append($image);
+				} else if ( module == "search" ) {
+					G(".search-imagelist-box .search-list").append($image);
+				}
+			});
+
+		}
+
+		//initialize dialog
+		createDialog();
+		bindEvent();
+		return o;
+	}; //end of JUpload
+
+	//string builder
+	var StringBuilder = function() {
+
+		var buffer = new Array();
+		StringBuilder.prototype.append = function(str) {
+			buffer.push(str);
+		}
+
+		StringBuilder.prototype.toString = function () {
+			return buffer.join("");
+		}
+
+	}
+
+
+})(jQuery);
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/multiimage/BUpload.min.js b/addons/nkeditor/assets/plugins/multiimage/BUpload.min.js
new file mode 100644
index 0000000..182c6fa
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/multiimage/BUpload.min.js
@@ -0,0 +1,2 @@
+/* NKeditor 5.0.3 (2018-10-25), Copyright (C) r9it.com,*/
+!function(a){if(!window.applicationCache)throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");a.fn.imageCrop=function(b,c){a(this).on("load",function(){var d,e,f,g,h=this.width/this.height,i=b/c;h>=i?(e=c,d=b*h,g=0,f=(d-b)/2):(d=b,e=c/h,f=0,g=0),a(this).css({position:"absolute",top:-g+"px",left:-f+"px",width:d+"px",height:e+"px"})})},a.fn.draggable=function(b){var c={handler:null};b=a.extend(c,b);var d=this;a(b.handler).mousedown(function(b){var c=b.pageX-a(d).position().left,e=b.pageY-a(d).position().top;a(document).mousemove(function(b){window.getSelection?window.getSelection().removeAllRanges():document.selection.empty(),a(d).css({top:b.pageY-e+"px",left:b.pageX-c+"px"})})}).mouseup(function(){a(document).unbind("mousemove")})},void 0==Array.prototype.remove&&(Array.prototype.remove=function(a){for(var b=0;b<this.length;b++)if(this[b]==a){this.splice(b,1);break}}),void 0==Array.prototype.uinque&&(Array.prototype.uinque=function(){for(var a,b=[],c={},d=0;null!=(a=this[d]);d++)c[a]||(b.push(a),c[a]=!0);return b}),window.BUpload=function(c){function d(){var d=new b;d.append('<div class="uedbody ke-animated"><div class="ued_title">'),d.append('<div class="uedbar"><span>'+c.lang.title+'</span></div><div class="close_btn icon" title="'+c.lang.closeText+'"></div>'),d.append('</div><div class="wrapper"><div id="wra_head" class="wra_head"><span class="tab tab-upload focus" tab="upload-panel">'+c.lang.localUpload+"</span>"),null!=c.list_url&&d.append('<span class="tab tab-online" tab="online">'+c.lang.fileServer+"</span>"),d.append('</div><div class="wra_body"><div class="tab-panel upload-panel"><div class="wra_pla"><div class="upload-image-placeholder">'),d.append('<div class="btn btn-primary image-select">'+c.lang.selectFile+'</div><input type="file" name="'+c.src+'" class="webuploader-element-invisible" multiple="multiple" accept="'+n()+'">'),d.append('</div></div><div class="image-list-box" style="display: none;"><div class="wra_bar"><div class="info fl"></div>'),d.append('<div class="fr"><span class="btn btn-default btn-continue-add">'+c.lang.continueAdd+'</span><span class="btn btn-primary btn-start-upload">'+c.lang.startUpload+"</span></div></div>"),d.append('<ul class="filelist"></ul></div></div><div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>'),d.append('<div class="tab-panel searchbox"><div class="search-bar"><input class="searTxt" type="text" placeholder="'+c.lang.searchPlaceholder+'" />'),d.append('<input value="'+c.lang.searchBtn+'" class="btn btn-primary btn-search" type="button" /><input value="'+c.lang.searchClear+'" class="btn btn-default btn-reset" type="button" />'),d.append('</div><div class="search-imagelist-box"><ul class="search-list"></ul><div class="no-data"></div></div>'),d.append('</div><div class="loading-icon"></div></div><!-- end of wrapper --></div><div class="wra-btn-group"><span class="btn btn-primary btn-confirm">'+c.lang.confirmBtnText+"</span>"),d.append('<span class="btn btn-default btn-cancel">'+c.lang.cancelBtnText+"</span></div></div>"),u.dialog=a(d.toString()),a("body").append(u.dialog),0==c.top&&(c.top=(a(window).height()-u.dialog.height())/2),u.dialog.css({left:(a(window).width()-u.dialog.width())/2+"px",top:c.top+"px"}),u.dialog.draggable({handler:u.dialog.find(".ued_title")})}function e(){p(".tab").on("click",function(){var b=a(this).attr("tab");p(".tab-panel").hide(),p("."+b).show(),p(".tab").removeClass("focus"),a(this).addClass("focus")}),p(".close_btn").on("click",function(){u.close()}),p(".webuploader-element-invisible").on("change",function(){f(this)}),p(".image-select").on("click",function(){p(".webuploader-element-invisible").trigger("click")}),p(".btn-continue-add").on("click",function(){p(".webuploader-element-invisible").trigger("click")}),p(".btn-start-upload").on("click",function(){if(!u.uploadLock){if(0==u.todoList.length)return c.errorHandler(c.lang.noFileAdded,"error"),!1;a(this).addClass("disabled").text(c.lang.uploading),g(u.todoList.shift())}}),p(".btn-confirm").on("click",function(){return u.todoList.length>0?(c.errorHandler(c.lang.fileNotUpload,"error"),!1):0==u.selectedList.length?(c.errorHandler(c.lang.noFileSelected,"error"),!1):(c.callback(u.selectedList),void u.close())}),p(".btn-cancel").on("click",function(){u.close()}),p(".tab-online").on("click",function(){0==p(".imagelist .list").children().length&&q()}),p(".imagelist").on("scroll",function(){this.scrollTop+this.clientHeight>=this.scrollHeight&&q()})}function f(d){for(var e=d.files,f=u.todoList.length+u.uploadSuccessNum+e.length,g=u.addedFileNumber;g<u.addedFileNumber+e.length;g++){if(f>c.max_filenum)return void c.errorHandler(KindEditor.tmpl(c.lang.uploadLimit,{uploadLimit:c.max_filenum}),"error");var h=new b,i=e[g-u.addedFileNumber];h.append('<li id="img-comtainer-'+v+g+'"><div class="imgWrap">');var k=m(i.name);""==k&&(k="default"),k=k.toLowerCase(),-1=="jpg|jpeg|gif|png|bmp".indexOf(k)?h.append('<span class="icon-placeholder icon-default icon-'+k+'"></span>'):h.append('<img src="'+window.URL.createObjectURL(i)+'" border="0" />'),h.append('</div><div class="file-opt-box clearfix"><span class="remove" index="'+g+'">'+c.lang.remove+'</span><span class="rotateRight">'+c.lang.rotateRight+"</span>"),h.append('<span class="rotateLeft">'+c.lang.rotateLeft+'</span></div><div class="success"></div><div class="error"></div>'),h.append('<div class="progress"><span style="display: none; width: 0px;"></span></div></li>');var l=a(h.toString());l.find(".remove").on("click",function(){a(this).parents("li").remove();for(var b=a(this).attr("index"),c=0;c<u.todoList.length;c++)if(u.todoList[c].index==b){u.totalFilesize-=u.todoList[c].file.size,j(u.uploadSuccessNum+u.todoList.length-1,u.totalFilesize),u.todoList.splice(c,1);break}0==p(".filelist li").length&&(p(".image-list-box").hide(),p(".wra_pla").show())}),l.on("mouseover",function(){a(this).find(".file-opt-box").show()}).on("mouseout",function(){a(this).find(".file-opt-box").hide()}),p(".wra_pla").hide(),p(".image-list-box").show(),p(".filelist").append(l),u.todoList.push({index:g,file:i}),u.totalFilesize+=i.size}u.addedFileNumber+=e.length,j(u.uploadSuccessNum+u.todoList.length,u.totalFilesize),a(".imgWrap img").imageCrop(113,113)}function g(b){if(!l(b))return void h();var d=new XMLHttpRequest;d.open("POST",c.upload_url),d.addEventListener("load",function(d){if("json"==c.data_type){var e=a.parseJSON(d.target.responseText);"000"==e.code?(u.selectedList.push(e.data.url),u.uploadSuccessNum++,a("#img-comtainer-"+v+b.index).find(".file-opt-box").remove(),a("#img-comtainer-"+v+b.index).find(".progress").remove(),a("#img-comtainer-"+v+b.index).find(".success").show()):o(s[e.code],b)}},!1),d.addEventListener("loadend",function(){h()},!1),d.addEventListener("error",function(){o(c.lang.uploadFail,b)},!1),d.upload.addEventListener("progress",function(a){i(a,b)},!1);var e=new FormData;e.append(c.src,b.file),d.send(e)}function h(){if(u.todoList.length){var a=u.todoList.shift();g(a)}else u.uploadLock=!1,p(".btn-start-upload").removeClass("disabled").text(c.lang.startUpload)}function i(b,c){b.lengthComputable&&a("#img-comtainer-"+v+c.index).find(".progress span").css({width:b.loaded/b.total*100+"%",display:"block"})}function j(a,b){var d=KindEditor.tmpl(c.lang.uploadDesc,{numSelect:a,totalSize:k(b),numLeft:c.max_filenum-a});p(".info").text(d)}function k(a){return a/1048576>1?(a/1048576).toFixed(2)+"MB":(a/1024).toFixed(2)+"KB"}function l(a){var b=1024*c.max_filesize;if(b>0&&a.file.size>b)return o(KindEditor.tmpl(c.lang.sizeLimit,{sizeLimit:c.max_filesize}),a),!1;var d=m(a.file.name);return d&&-1!=c.ext_allow.indexOf(d)&&-1==c.ext_refuse.indexOf(d)?!0:(o(KindEditor.tmpl(c.lang.invalidExt,{invalidExt:d}),a),!1)}function m(a){if(!a)return!1;var b=a.lastIndexOf(".");return-1!=b?a.substr(b+1).toLowerCase():!1}function n(){var b=c.ext_allow.split("|"),d=[];return a.each(b,function(a,b){d.push(t[b])}),d.length>1?d.uinque().join(","):"*"}function o(a,b){p("#img-comtainer-"+v+b.index).find(".error").show().text(a)}function p(a){return u.dialog.find(a)}function q(){return c.list_url?u.noRecord?!1:(p(".loading-icon").show(),void a.get(c.list_url,{page:u.page,marker:u.marker,fileType:c.fileType},function(a){if(p(".loading-icon").hide(),"000"==a.code){if(!a.data[0])return void p(".online .no-data").text(c.lang.noDataText).show();u.marker=a.extra,u.page++,r(a.data,"online")}else p(".online .no-data").text(c.lang.noDataText).show(),u.noRecord=!0},"json")):(p(".online .no-data").html('<span class="error">'+c.lang.noListUrl+"</span>").show(),!1)}function r(c,d){a.each(c,function(c,e){var f=new b;f.append("<li>");var g=m(e.thumbURL);""==g&&(g="default"),g=g.toLowerCase();var h=e.width+"x"+e.height;-1=="jpg|jpeg|gif|png|bmp".indexOf(g)?(h=k(e.filesize),f.append('<span class="icon-placeholder icon-'+g+'" data-src="'+e.oriURL+'"></span>')):f.append('<img src="'+e.thumbURL+'" data-src="'+e.oriURL+'" border="0">'),f.append('<span class="ic" data-module="'+d+'"><em class="img-size">'+h+"</em></span></li>");var i=a(f.toString());i.find(".ic").on("click",function(){var b=a(this).prev().data("src");a(this).data("module");a(this).hasClass("selected")?a(this).removeClass("selected"):(a(this).addClass("selected"),u.selectedList.push(b))}),i.find("img").imageCrop(113,113),"online"==d?p(".imagelist .list").append(i):"search"==d&&p(".search-imagelist-box .search-list").append(i)})}c=a.extend({src:"src",upload_url:null,list_url:null,data_type:"json",top:20,fileType:"image",max_filesize:2048,max_filenum:20,no_data_text:"(⊙o⊙)亲,没有多数据了。",ext_allow:"jpg|png|gif|jpeg",ext_refuse:"exe|txt",errorHandler:function(a,b){alert(a)},callback:function(a){console.log(a)}},c);var s={"000":"文件上传成功","001":"文件上传失败","003":"文件大小超出限制","004":"非法文件名后缀"},t={"3gpp":"audio/3gpp, video/3gpp",ac3:"audio/ac3",asf:"allpication/vnd.ms-asf",au:"audio/basic",css:"text/css",csv:"text/csv",doc:"application/msword",dot:"application/msword",dtd:"application/xml-dtd",dwg:"image/vnd.dwg",dxf:"image/vnd.dxf",gif:"image/gif",htm:"text/html",html:"text/html",jp2:"image/jp2",jpe:"image/jpeg",jpeg:"image/jpeg",jpg:"image/jpeg",js:"text/javascript, application/javascript",json:"application/json",mp2:"audio/mpeg, video/mpeg",mp3:"audio/mpeg",mp4:"audio/mp4, video/mp4",mpeg:"video/mpeg",mpg:"video/mpeg",mpp:"application/vnd.ms-project",ogg:"application/ogg, audio/ogg",pdf:"application/pdf",png:"image/png",pot:"application/vnd.ms-powerpoint",pps:"application/vnd.ms-powerpoint",ppt:"application/vnd.ms-powerpoint",rtf:"application/rtf, text/rtf",svf:"image/vnd.svf",tif:"image/tiff",tiff:"image/tiff",txt:"text/plain",wdb:"application/vnd.ms-works",wps:"application/vnd.ms-works",xhtml:"application/xhtml+xml",xlc:"application/vnd.ms-excel",xlm:"application/vnd.ms-excel",xls:"application/vnd.ms-excel",xlt:"application/vnd.ms-excel",xlw:"application/vnd.ms-excel",xml:"text/xml, application/xml",zip:"aplication/zip",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},u={};u.dialog=null,u.todoList=new Array,u.uploadSuccessNum=0,u.selectedList=new Array,u.addedFileNumber=0,u.totalFilesize=0,u.uploadLock=!1,u.page=1,u.marker=null,u.noRecord=!1;var v=Math.ceil(1e12*Math.random());return u.close=function(){u.dialog.remove(),"function"==typeof c.close&&c.close()},d(),e(),u};var b=function(){var a=new Array;b.prototype.append=function(b){a.push(b)},b.prototype.toString=function(){return a.join("")}}}(jQuery);
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/aep.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/aep.png
new file mode 100644
index 0000000..1ae4e95
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/aep.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/asp.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/asp.png
new file mode 100644
index 0000000..a4fb174
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/asp.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/avi.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/avi.png
new file mode 100644
index 0000000..f358993
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/avi.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/c.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/c.png
new file mode 100644
index 0000000..bdc1f78
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/c.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/conf.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/conf.png
new file mode 100644
index 0000000..ac9cf49
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/conf.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/css.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/css.png
new file mode 100644
index 0000000..5475124
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/css.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/default.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/default.png
new file mode 100644
index 0000000..946d095
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/default.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/doc.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/doc.png
new file mode 100644
index 0000000..6b827c6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/doc.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/eml.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/eml.png
new file mode 100644
index 0000000..8edc065
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/eml.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/eps.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/eps.png
new file mode 100644
index 0000000..0e6fb79
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/eps.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/fla.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/fla.png
new file mode 100644
index 0000000..767c56c
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/fla.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/htm.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/htm.png
new file mode 100644
index 0000000..9cc5171
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/htm.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/idn.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/idn.png
new file mode 100644
index 0000000..3c83e99
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/idn.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/ini.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/ini.png
new file mode 100644
index 0000000..0449595
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/ini.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/java.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/java.png
new file mode 100644
index 0000000..cbd350a
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/java.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/js.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/js.png
new file mode 100644
index 0000000..f65b15d
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/js.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/jsf.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/jsf.png
new file mode 100644
index 0000000..e551416
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/jsf.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/markdown.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/markdown.png
new file mode 100644
index 0000000..57e0870
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/markdown.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/mdb.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/mdb.png
new file mode 100644
index 0000000..56f037c
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/mdb.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/midi.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/midi.png
new file mode 100644
index 0000000..7ff836a
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/midi.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/mov.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/mov.png
new file mode 100644
index 0000000..8b5b776
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/mov.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/mp3.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/mp3.png
new file mode 100644
index 0000000..11f13ad
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/mp3.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/mpeg.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/mpeg.png
new file mode 100644
index 0000000..eccb9fc
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/mpeg.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/pdf.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/pdf.png
new file mode 100644
index 0000000..ca81a58
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/pdf.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/php.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/php.png
new file mode 100644
index 0000000..8c4a2c2
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/php.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/ppt.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/ppt.png
new file mode 100644
index 0000000..4b15ad6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/ppt.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/psd.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/psd.png
new file mode 100644
index 0000000..a5f49e2
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/psd.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/pst.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/pst.png
new file mode 100644
index 0000000..fbe7fe5
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/pst.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/pub.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/pub.png
new file mode 100644
index 0000000..71a92c1
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/pub.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/py.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/py.png
new file mode 100644
index 0000000..8e2f6e2
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/py.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/rb.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/rb.png
new file mode 100644
index 0000000..5956ee7
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/rb.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/rmvb.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/rmvb.png
new file mode 100644
index 0000000..eccb9fc
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/rmvb.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/scss.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/scss.png
new file mode 100644
index 0000000..e043f36
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/scss.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/sql.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/sql.png
new file mode 100644
index 0000000..0023d84
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/sql.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/tif.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/tif.png
new file mode 100644
index 0000000..04e77a4
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/tif.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/txt.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/txt.png
new file mode 100644
index 0000000..876352b
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/txt.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/vsd.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/vsd.png
new file mode 100644
index 0000000..c248eb3
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/vsd.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/wav.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/wav.png
new file mode 100644
index 0000000..c6ec2f6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/wav.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/wma.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/wma.png
new file mode 100644
index 0000000..68316b5
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/wma.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/wmv.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/wmv.png
new file mode 100644
index 0000000..194ac20
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/wmv.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/xls.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/xls.png
new file mode 100644
index 0000000..b9eada4
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/xls.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/xml.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/xml.png
new file mode 100644
index 0000000..805f307
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/xml.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/icons/zip.png b/addons/nkeditor/assets/plugins/multiimage/css/icons/zip.png
new file mode 100644
index 0000000..6f0a434
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/icons/zip.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/images/dialog-title-bg.png b/addons/nkeditor/assets/plugins/multiimage/css/images/dialog-title-bg.png
new file mode 100644
index 0000000..f744f26
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/images/dialog-title-bg.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/images/icons-all.gif b/addons/nkeditor/assets/plugins/multiimage/css/images/icons-all.gif
new file mode 100644
index 0000000..21915e5
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/images/icons-all.gif differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/images/icons.png b/addons/nkeditor/assets/plugins/multiimage/css/images/icons.png
new file mode 100644
index 0000000..12e4700
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/images/icons.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/images/image.png b/addons/nkeditor/assets/plugins/multiimage/css/images/image.png
new file mode 100644
index 0000000..19699f6
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/images/image.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/images/loader.gif b/addons/nkeditor/assets/plugins/multiimage/css/images/loader.gif
new file mode 100644
index 0000000..5bb90fd
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/images/loader.gif differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/images/progress.png b/addons/nkeditor/assets/plugins/multiimage/css/images/progress.png
new file mode 100644
index 0000000..717c486
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/images/progress.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/images/success.png b/addons/nkeditor/assets/plugins/multiimage/css/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/addons/nkeditor/assets/plugins/multiimage/css/images/success.png differ
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/upload.css b/addons/nkeditor/assets/plugins/multiimage/css/upload.css
new file mode 100644
index 0000000..cff67e2
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/multiimage/css/upload.css
@@ -0,0 +1,552 @@
+@charset "UTF-8";
+.uedbody {
+  box-sizing: content-box !important;
+  -webkit-box-sizing: content-box !important;
+  -moz-box-sizing: content-box !important;
+  width: 652px;
+  position: fixed;
+  padding: 2px 0px 0px 2px;
+  background-color: #FFF;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.2);
+  z-index: 811213;
+  font-family: "微软雅黑";
+  font-size: 12px;
+  margin: 0px auto; }
+  .uedbody div, .uedbody dl, .uedbody dt, .uedbody dd, .uedbody ul, .uedbody li, .uedbody ol, .uedbody h1, .uedbody h2, .uedbody h3, .uedbody h4, .uedbody h5, .uedbody h6, .uedbody pre, .uedbody code, .uedbody form, .uedbody fieldset, .uedbody legend, .uedbody button, .uedbody textarea, .uedbody blockquote, .uedbody p {
+    margin: 0;
+    padding: 0; }
+  .uedbody h1, .uedbody h2, .uedbody h3, .uedbody h4, .uedbody h5, .uedbody h6 {
+    font-weight: normal; }
+  .uedbody li {
+    list-style-type: none; }
+  .uedbody ol, .uedbody ul, .uedbody dl {
+    list-style: none; }
+  .uedbody em {
+    font-style: normal; }
+  .uedbody img {
+    border: none;
+    vertical-align: middle; }
+  .uedbody select, .uedbody label, .uedbody input {
+    vertical-align: middle;
+    padding: 0;
+    margin: 0;
+    outline: medium;
+    font-size: 12px; }
+  .uedbody textarea {
+    resize: none;
+    line-height: 18px; }
+  .uedbody table {
+    border-collapse: collapse;
+    border-spacing: 0;
+    empty-cell: show; }
+  .uedbody a {
+    text-decoration: none;
+    color: #333;
+    outline: none;
+    cursor: pointer; }
+  .uedbody a:hover {
+    cursor: pointer;
+    blr: expression(this.onFocus=this.blur()); }
+  .uedbody * {
+    padding: 0;
+    margin: 0;
+    box-sizing: content-box !important;
+    -webkit-box-sizing: content-box !important;
+    -moz-box-sizing: content-box !important; }
+  .uedbody .clearfix:before, .uedbody .clearfix:after {
+    content: "";
+    display: table; }
+  .uedbody .clearfix:after {
+    clear: both; }
+  .uedbody .clearfix {
+    *zoom: 1; }
+  .uedbody .fr {
+    float: right; }
+  .uedbody .fl {
+    float: left; }
+  .uedbody .ued_title {
+    height: 26px;
+    border-bottom: 1px solid #C6C6C6;
+    background: transparent url("images/dialog-title-bg.png") repeat-x scroll 0% 0%;
+    position: relative;
+    cursor: move; }
+    .uedbody .ued_title .icon {
+      background: url("images/icons-all.gif") no-repeat center; }
+    .uedbody .ued_title .uedbar span {
+      font-weight: bold;
+      font-size: 14px;
+      color: #444;
+      line-height: 26px;
+      padding-left: 5px; }
+    .uedbody .ued_title .close_btn {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background-position: 0px -59px;
+      position: absolute;
+      right: 5px;
+      top: 3px; }
+      .uedbody .ued_title .close_btn:hover {
+        background-position: 0px -89px; }
+  .uedbody .btn {
+    display: inline-block;
+    margin-bottom: 0px;
+    margin-right: 5px;
+    padding: 4px 10px;
+    font-weight: 400;
+    text-align: center;
+    cursor: pointer;
+    border: 1px solid transparent;
+    white-space: nowrap;
+    font-size: 14px;
+    border-radius: 3px;
+    -moz-user-select: none;
+    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+    padding: 5px 14px; }
+  .uedbody .btn-default {
+    border: 1px solid #CFCFCF;
+    color: #565656;
+    background: #ffffff; }
+    .uedbody .btn-default:hover {
+      background: #f0f0f0; }
+  .uedbody .btn-primary {
+    background: #00b7ee;
+    color: #ffffff; }
+    .uedbody .btn-primary:hover {
+      background: #00a2d4; }
+  .uedbody .btn.disabled {
+    cursor: not-allowed;
+    opacity: .65; }
+    .uedbody .btn.disabled:hover {
+      background: #00b7ee; }
+  .uedbody .wrapper {
+    width: 630px;
+    height: 380px;
+    margin: 0px auto;
+    padding: 10px;
+    position: relative;
+    font-family: sans-serif; }
+    .uedbody .wrapper .wra_head span {
+      float: left;
+      padding: 0px 5px;
+      margin-right: 3px;
+      height: 30px;
+      border: 1px solid #CCC;
+      background: transparent url("images/dialog-title-bg.png") repeat-x scroll 0% 0%;
+      text-align: center;
+      line-height: 30px;
+      cursor: pointer;
+      position: relative; }
+    .uedbody .wrapper .wra_head span.focus {
+      height: 31px;
+      border-bottom: medium none;
+      background: #FFF none repeat scroll 0% 0%;
+      position: relative;
+      z-index: 2; }
+    .uedbody .wrapper .wra_body {
+      width: 100%;
+      height: 346px;
+      clear: both;
+      margin: 0px auto;
+      border: 1px solid #CCC;
+      display: block;
+      clip: auto;
+      overflow: hidden;
+      top: -1px;
+      position: relative; }
+      .uedbody .wrapper .wra_body .upload-panel .wra_pla {
+        zoom: 1;
+        overflow: hidden;
+        text-align: center; }
+        .uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder {
+          margin: 10px;
+          border: 2px dashed #e6e6e6;
+          height: 172px;
+          padding-top: 150px;
+          text-align: center;
+          background: url("images/image.png") center 70px no-repeat;
+          position: relative;
+          top: 0; }
+          .uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder .webuploader-element-invisible {
+            opacity: 0;
+            width: 0;
+            height: 0; }
+          .uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder .image-select {
+            padding: 10px 30px;
+            cursor: pointer; }
+      .uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar {
+        border-bottom: 1px solid #DADADA;
+        padding: 8px;
+        vertical-align: middle;
+        position: relative;
+        zoom: 1;
+        overflow: hidden; }
+        .uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar .info {
+          font-size: 14px;
+          color: #666;
+          margin-top: 6px; }
+        .uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar .fr .btn {
+          padding: 6px 15px; }
+      .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist {
+        list-style: outside none none;
+        margin: 0px;
+        padding: 0px;
+        overflow-x: hidden;
+        overflow-y: auto;
+        position: relative;
+        height: 300px; }
+        .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li {
+          width: 113px;
+          height: 113px;
+          margin: 9px 0px 0px 9px;
+          position: relative;
+          display: block;
+          float: left;
+          overflow: hidden;
+          font-size: 12px; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .imgWrap {
+            position: relative;
+            vertical-align: middle;
+            text-align: center;
+            overflow: hidden;
+            width: 113px;
+            height: 113px;
+            transform-origin: 50% 50% 0px;
+            transition: all 200ms ease-out 0s; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box {
+            position: absolute;
+            display: none;
+            background: rgba(0, 0, 0, 0.5) none repeat scroll 0% 0%;
+            width: 100%;
+            top: 0px;
+            left: 0px;
+            overflow: hidden; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box span {
+              width: 24px;
+              height: 24px;
+              display: inline;
+              float: right;
+              text-indent: -9999px;
+              overflow: hidden;
+              background: url("images/icons.png") no-repeat;
+              margin: 5px 1px 1px;
+              cursor: pointer;
+              -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+              -webkit-user-select: none;
+              -moz-user-select: none;
+              -ms-user-select: none;
+              user-select: none; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .remove {
+              background-position: -48px -24px; }
+              .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .remove:hover {
+                background-position: -48px -0px; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateRight {
+              display: none;
+              background-position: -24px -24px; }
+              .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateRight:hover {
+                background-position: -24px -0px; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateLeft {
+              display: none;
+              background-position: 0px -24px; }
+              .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateLeft:hover {
+                background-position: 0px 0px; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .success {
+            background: url("images/success.png") no-repeat right;
+            position: absolute;
+            display: none;
+            left: 0px;
+            bottom: 0px;
+            height: 40px;
+            width: 100%; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .error {
+            position: absolute;
+            width: 100%;
+            display: none;
+            background: rgba(255, 255, 255, 0.7) none repeat scroll 0% 0%;
+            left: 0;
+            padding: 5px 3px;
+            color: #cc0000;
+            border: 1px solid #cccccc;
+            bottom: 0; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .progress {
+            position: absolute;
+            width: 100%;
+            bottom: 0;
+            left: 0;
+            bottom: 0;
+            height: 8px;
+            overflow: hidden;
+            z-index: 50;
+            margin: 0;
+            border-radius: 0;
+            background: none;
+            -webkit-box-shadow: 0 0 0; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .progress span {
+              width: 0;
+              height: 100%;
+              background: #1483d8 url("images/progress.png") repeat-x;
+              -webit-transition: width 200ms linear;
+              -moz-transition: width 200ms linear;
+              -o-transition: width 200ms linear;
+              -ms-transition: width 200ms linear;
+              transition: width 200ms linear;
+              -webkit-animation: progressmove 2s linear infinite;
+              -moz-animation: progressmove 2s linear infinite;
+              -o-animation: progressmove 2s linear infinite;
+              -ms-animation: progressmove 2s linear infinite;
+              animation: progressmove 2s linear infinite;
+              -webkit-transform: translateZ(0); }
+      .uedbody .wrapper .wra_body .online {
+        width: 100%;
+        height: 336px;
+        padding: 10px 0px 0px;
+        display: none; }
+        .uedbody .wrapper .wra_body .online .imagelist {
+          width: 100%;
+          height: 100%;
+          overflow-x: hidden;
+          overflow-y: auto;
+          position: relative; }
+          .uedbody .wrapper .wra_body .online .imagelist .list li {
+            float: left;
+            display: block;
+            list-style: outside none none;
+            padding: 0px;
+            width: 113px;
+            height: 113px;
+            margin: 0px 0px 9px 9px;
+            background-color: #EEE;
+            overflow: hidden;
+            cursor: pointer;
+            position: relative; }
+            .uedbody .wrapper .wra_body .online .imagelist .list li img {
+              cursor: pointer; }
+            .uedbody .wrapper .wra_body .online .imagelist .list li span.ic {
+              position: absolute;
+              top: 0px;
+              left: 0px;
+              cursor: pointer;
+              width: 113px;
+              height: 113px; }
+              .uedbody .wrapper .wra_body .online .imagelist .list li span.ic .img-size {
+                font-size: 12px;
+                padding: 5px;
+                background: rgba(0, 0, 0, 0.6);
+                display: none;
+                color: #ffffff; }
+              .uedbody .wrapper .wra_body .online .imagelist .list li span.ic:hover {
+                width: 107px;
+                height: 107px;
+                border: 3px solid #1094FA;
+                background-position: 72px 72px; }
+                .uedbody .wrapper .wra_body .online .imagelist .list li span.ic:hover .img-size {
+                  display: inline-block;
+                  width: 97px; }
+            .uedbody .wrapper .wra_body .online .imagelist .list li span.selected {
+              background: url("images/success.png") no-repeat 75px 75px; }
+      .uedbody .wrapper .wra_body .searchbox {
+        width: 100%;
+        padding: 10px 0px 0px;
+        zoom: 1;
+        overflow: hidden;
+        display: none; }
+        .uedbody .wrapper .wra_body .searchbox .search-bar .searTxt {
+          margin-left: 5px;
+          background: #FFF none repeat scroll 0% 0%;
+          width: 300px;
+          height: 21px;
+          line-height: 21px;
+          padding: 3px 6px;
+          font-size: 14px;
+          line-height: 1.42857;
+          border: 1px solid #CCC;
+          border-radius: 4px;
+          box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
+          transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
+          margin-right: 10px; }
+        .uedbody .wrapper .wra_body .searchbox .search-bar .searchBtn {
+          color: #FFF;
+          border-color: #285E8E;
+          background-color: #3B97D7; }
+        .uedbody .wrapper .wra_body .searchbox .search-bar .searchRese {
+          color: #333;
+          border-color: #CCC;
+          background-color: #FFF; }
+        .uedbody .wrapper .wra_body .searchbox .search-imagelist-box {
+          width: 100%;
+          height: 292px;
+          overflow-x: hidden;
+          overflow-y: auto;
+          position: relative;
+          margin-top: 10px; }
+          .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list {
+            zoom: 1;
+            overflow: hidden; }
+            .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li {
+              float: left;
+              display: block;
+              list-style: outside none none;
+              padding: 0px;
+              width: 113px;
+              height: 113px;
+              margin: 0px 0px 9px 9px;
+              background-color: #EEE;
+              overflow: hidden;
+              cursor: pointer;
+              position: relative; }
+              .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li img {
+                cursor: pointer; }
+              .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic {
+                position: absolute;
+                top: 0px;
+                left: 0px;
+                cursor: pointer;
+                width: 113px;
+                height: 113px; }
+                .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic .img-size {
+                  font-size: 12px;
+                  padding: 5px;
+                  background: rgba(0, 0, 0, 0.6);
+                  display: none;
+                  color: #ffffff; }
+                .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic:hover {
+                  width: 107px;
+                  height: 107px;
+                  border: 3px solid #1094FA;
+                  background-position: 72px 72px;
+                  overflow: hidden; }
+                  .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic:hover .img-size {
+                    display: inline-block;
+                    width: 97px; }
+              .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.selected {
+                background: url("images/success.png") no-repeat 75px 75px; }
+      .uedbody .wrapper .wra_body .no-data {
+        line-height: 40px;
+        height: 40px;
+        font-size: 14px;
+        color: #999999;
+        text-align: center;
+        display: none; }
+        .uedbody .wrapper .wra_body .no-data .error {
+          color: #cc0000; }
+      .uedbody .wrapper .wra_body .loading-icon {
+        background: rgba(0, 0, 0, 0.4) url("images/loader.gif") no-repeat center center;
+        position: absolute;
+        width: 100%;
+        height: 346px;
+        top: 0;
+        left: 0;
+        display: none;
+        text-align: center; }
+        .uedbody .wrapper .wra_body .loading-icon .loading-message {
+          position: absolute;
+          font-size: 14px;
+          color: #f0f0f0;
+          top: 210px;
+          left: 253px; }
+      .uedbody .wrapper .wra_body .icon-placeholder {
+        background-size: 113px 113px;
+        display: block;
+        width: 113px;
+        height: 113px; }
+      .uedbody .wrapper .wra_body .icon-aep, .uedbody .wrapper .wra_body .icon-aepx {
+        background-image: url("icons/aep.png"); }
+      .uedbody .wrapper .wra_body .icon-asp {
+        background-image: url("icons/asp.png"); }
+      .uedbody .wrapper .wra_body .icon-avi {
+        background-image: url("icons/avi.png"); }
+      .uedbody .wrapper .wra_body .icon-c, .uedbody .wrapper .wra_body .icon-cpp {
+        background-image: url("icons/c.png"); }
+      .uedbody .wrapper .wra_body .icon-conf {
+        background-image: url("icons/conf.png"); }
+      .uedbody .wrapper .wra_body .icon-css {
+        background-image: url("icons/css.png"); }
+      .uedbody .wrapper .wra_body .icon-htm, .uedbody .wrapper .wra_body .icon-html {
+        background-image: url("icons/htm.png"); }
+      .uedbody .wrapper .wra_body .icon-default {
+        background-image: url("icons/txt.png"); }
+      .uedbody .wrapper .wra_body .icon-doc, .uedbody .wrapper .wra_body .icon-docx {
+        background-image: url("icons/doc.png"); }
+      .uedbody .wrapper .wra_body .icon-eps {
+        background-image: url("icons/eps.png"); }
+      .uedbody .wrapper .wra_body .icon-fla, .uedbody .wrapper .wra_body .icon-swf {
+        background-image: url("icons/fla.png"); }
+      .uedbody .wrapper .wra_body .icon-idn {
+        background-image: url("icons/idn.png"); }
+      .uedbody .wrapper .wra_body .icon-ini {
+        background-image: url("icons/ini.png"); }
+      .uedbody .wrapper .wra_body .icon-java, .uedbody .wrapper .wra_body .icon-jar, .uedbody .wrapper .wra_body .icon-war {
+        background-image: url("icons/java.png"); }
+      .uedbody .wrapper .wra_body .icon-js {
+        background-image: url("icons/js.png"); }
+      .uedbody .wrapper .wra_body .icon-jsf {
+        background-image: url("icons/jsf.png"); }
+      .uedbody .wrapper .wra_body .icon-md, .uedbody .wrapper .wra_body .icon-markdown {
+        background-image: url("icons/markdown.png"); }
+      .uedbody .wrapper .wra_body .icon-mdb {
+        background-image: url("icons/mdb.png"); }
+      .uedbody .wrapper .wra_body .icon-midi {
+        background-image: url("icons/midi.png"); }
+      .uedbody .wrapper .wra_body .icon-mov {
+        background-image: url("icons/mov.png"); }
+      .uedbody .wrapper .wra_body .icon-mp3 {
+        background-image: url("icons/mp3.png"); }
+      .uedbody .wrapper .wra_body .icon-mpeg {
+        background-image: url("icons/mpeg.png"); }
+      .uedbody .wrapper .wra_body .icon-pdf {
+        background-image: url("icons/pdf.png"); }
+      .uedbody .wrapper .wra_body .icon-php {
+        background-image: url("icons/php.png"); }
+      .uedbody .wrapper .wra_body .icon-ppt, .uedbody .wrapper .wra_body .icon-pptx {
+        background-image: url("icons/ppt.png"); }
+      .uedbody .wrapper .wra_body .icon-psd {
+        background-image: url("icons/psd.png"); }
+      .uedbody .wrapper .wra_body .icon-pst {
+        background-image: url("icons/pst.png"); }
+      .uedbody .wrapper .wra_body .icon-pub {
+        background-image: url("icons/pub.png"); }
+      .uedbody .wrapper .wra_body .icon-py {
+        background-image: url("icons/py.png"); }
+      .uedbody .wrapper .wra_body .icon-rb {
+        background-image: url("icons/rb.png"); }
+      .uedbody .wrapper .wra_body .icon-rm, .uedbody .wrapper .wra_body .icon-rmvb {
+        background-image: url("icons/rmvb.png"); }
+      .uedbody .wrapper .wra_body .icon-scss {
+        background-image: url("icons/scss.png"); }
+      .uedbody .wrapper .wra_body .icon-tif {
+        background-image: url("icons/tif.png"); }
+      .uedbody .wrapper .wra_body .icon-txt {
+        background-image: url("icons/txt.png"); }
+      .uedbody .wrapper .wra_body .icon-vsd {
+        background-image: url("icons/vsd.png"); }
+      .uedbody .wrapper .wra_body .icon-wav {
+        background-image: url("icons/wav.png"); }
+      .uedbody .wrapper .wra_body .icon-wma {
+        background-image: url("icons/wma.png"); }
+      .uedbody .wrapper .wra_body .icon-wmv {
+        background-image: url("icons/wmv.png"); }
+      .uedbody .wrapper .wra_body .icon-xls, .uedbody .wrapper .wra_body .icon-xlsx {
+        background-image: url("icons/xls.png"); }
+      .uedbody .wrapper .wra_body .icon-xml {
+        background-image: url("icons/xml.png"); }
+      .uedbody .wrapper .wra_body .icon-zip, .uedbody .wrapper .wra_body .icon-rar, .uedbody .wrapper .wra_body .icon-tgz, .uedbody .wrapper .wra_body .icon-gz, .uedbody .wrapper .wra_body .icon-tar, .uedbody .wrapper .wra_body .icon-7z {
+        background-image: url("icons/zip.png"); }
+    .uedbody .wrapper .wra_body_server {
+      height: 380px; }
+      .uedbody .wrapper .wra_body_server .online {
+        display: block !important;
+        height: 365px; }
+  .uedbody .wra-btn-group {
+    clear: both;
+    zoom: 1;
+    text-align: right;
+    padding: 10px 20px 20px 0px; }
+    .uedbody .wra-btn-group .tip-text {
+      float: left;
+      padding: 5px 10px;
+      color: #999;
+      font-size: 14px; }
+
+/*# sourceMappingURL=upload.css.map */
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/upload.css.map b/addons/nkeditor/assets/plugins/multiimage/css/upload.css.map
new file mode 100644
index 0000000..b7e49d4
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/multiimage/css/upload.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["upload.scss"],
+"names": [],
+"file": "upload.css"
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/upload.min.css b/addons/nkeditor/assets/plugins/multiimage/css/upload.min.css
new file mode 100644
index 0000000..3f463d7
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/multiimage/css/upload.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.uedbody{box-sizing:content-box!important;-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;width:652px;position:fixed;padding:2px 0 0 2px;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);z-index:811213;font-family:"微软雅黑";font-size:12px;margin:0 auto}.uedbody blockquote,.uedbody button,.uedbody code,.uedbody dd,.uedbody div,.uedbody dl,.uedbody dt,.uedbody fieldset,.uedbody form,.uedbody h1,.uedbody h2,.uedbody h3,.uedbody h4,.uedbody h5,.uedbody h6,.uedbody legend,.uedbody li,.uedbody ol,.uedbody p,.uedbody pre,.uedbody textarea,.uedbody ul{margin:0;padding:0}.uedbody h1,.uedbody h2,.uedbody h3,.uedbody h4,.uedbody h5,.uedbody h6{font-weight:400}.uedbody li{list-style-type:none}.uedbody dl,.uedbody ol,.uedbody ul{list-style:none}.uedbody em{font-style:normal}.uedbody img{border:none;vertical-align:middle}.uedbody input,.uedbody label,.uedbody select{vertical-align:middle;padding:0;margin:0;outline:medium;font-size:12px}.uedbody textarea{resize:none;line-height:18px}.uedbody table{border-collapse:collapse;border-spacing:0;empty-cell:show}.uedbody a{text-decoration:none;color:#333;outline:0;cursor:pointer}.uedbody a:hover{cursor:pointer;blr:expression(this.onFocus=this.blur())}.uedbody *{padding:0;margin:0;box-sizing:content-box!important;-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important}.uedbody .clearfix:after,.uedbody .clearfix:before{content:"";display:table}.uedbody .clearfix:after{clear:both}.uedbody .fr{float:right}.uedbody .fl{float:left}.uedbody .ued_title{height:26px;border-bottom:1px solid #c6c6c6;background:transparent url(images/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.uedbody .ued_title .icon{background:url(images/icons-all.gif) no-repeat center}.uedbody .ued_title .uedbar span{font-weight:700;font-size:14px;color:#444;line-height:26px;padding-left:5px}.uedbody .ued_title .close_btn{height:20px;width:20px;cursor:pointer;background-position:0 -59px;position:absolute;right:5px;top:3px}.uedbody .ued_title .close_btn:hover{background-position:0 -89px}.uedbody .btn{display:inline-block;margin-bottom:0;margin-right:5px;padding:4px 10px;font-weight:400;text-align:center;cursor:pointer;border:1px solid transparent;white-space:nowrap;font-size:14px;border-radius:3px;-moz-user-select:none;box-shadow:0 1px 1px rgba(0,0,0,.1);padding:5px 14px}.uedbody .btn-default{border:1px solid #cfcfcf;color:#565656;background:#fff}.uedbody .btn-default:hover{background:#f0f0f0}.uedbody .btn-primary{background:#00b7ee;color:#fff}.uedbody .btn-primary:hover{background:#00a2d4}.uedbody .btn.disabled{cursor:not-allowed;opacity:.65}.uedbody .btn.disabled:hover{background:#00b7ee}.uedbody .wrapper{width:630px;height:380px;margin:0 auto;padding:10px;position:relative;font-family:sans-serif}.uedbody .wrapper .wra_head span{float:left;padding:0 5px;margin-right:3px;height:30px;border:1px solid #ccc;background:transparent url(images/dialog-title-bg.png) repeat-x scroll 0 0;text-align:center;line-height:30px;cursor:pointer;position:relative}.uedbody .wrapper .wra_head span.focus{height:31px;border-bottom:medium none;background:#fff none repeat scroll 0 0;position:relative;z-index:2}.uedbody .wrapper .wra_body{width:100%;height:346px;clear:both;margin:0 auto;border:1px solid #ccc;display:block;clip:auto;overflow:hidden;top:-1px;position:relative}.uedbody .wrapper .wra_body .upload-panel .wra_pla{zoom:1;overflow:hidden;text-align:center}.uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder{margin:10px;border:2px dashed #e6e6e6;height:172px;padding-top:150px;text-align:center;background:url(images/image.png) center 70px no-repeat;position:relative;top:0}.uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder .webuploader-element-invisible{opacity:0;width:0;height:0}.uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder .image-select{padding:10px 30px;cursor:pointer}.uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar{border-bottom:1px solid #dadada;padding:8px;vertical-align:middle;position:relative;zoom:1;overflow:hidden}.uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar .info{font-size:14px;color:#666;margin-top:6px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar .fr .btn{padding:6px 15px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist{list-style:outside none none;margin:0;padding:0;overflow-x:hidden;overflow-y:auto;position:relative;height:300px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li{width:113px;height:113px;margin:9px 0 0 9px;position:relative;display:block;float:left;overflow:hidden;font-size:12px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .imgWrap{position:relative;vertical-align:middle;text-align:center;overflow:hidden;width:113px;height:113px;transform-origin:50% 50% 0;transition:all .2s ease-out 0s}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box{position:absolute;display:none;background:rgba(0,0,0,.5) none repeat scroll 0 0;width:100%;top:0;left:0;overflow:hidden}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box span{width:24px;height:24px;display:inline;float:right;text-indent:-9999px;overflow:hidden;background:url(images/icons.png) no-repeat;margin:5px 1px 1px;cursor:pointer;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .remove{background-position:-48px -24px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .remove:hover{background-position:-48px 0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateRight{display:none;background-position:-24px -24px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateRight:hover{background-position:-24px 0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateLeft{display:none;background-position:0 -24px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateLeft:hover{background-position:0 0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .success{background:url(images/success.png) no-repeat right;position:absolute;display:none;left:0;bottom:0;height:40px;width:100%}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .error{position:absolute;width:100%;display:none;background:rgba(255,255,255,.7) none repeat scroll 0 0;left:0;padding:5px 3px;color:#c00;border:1px solid #ccc;bottom:0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .progress{position:absolute;width:100%;bottom:0;left:0;bottom:0;height:8px;overflow:hidden;z-index:50;margin:0;border-radius:0;background:0 0;-webkit-box-shadow:0 0 0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .progress span{width:0;height:100%;background:#1483d8 url(images/progress.png) repeat-x;-webit-transition:width .2s linear;-moz-transition:width .2s linear;-o-transition:width .2s linear;-ms-transition:width .2s linear;transition:width .2s linear;-webkit-animation:progressmove 2s linear infinite;-moz-animation:progressmove 2s linear infinite;-o-animation:progressmove 2s linear infinite;-ms-animation:progressmove 2s linear infinite;animation:progressmove 2s linear infinite;-webkit-transform:translateZ(0)}.uedbody .wrapper .wra_body .online{width:100%;height:336px;padding:10px 0 0;display:none}.uedbody .wrapper .wra_body .online .imagelist{width:100%;height:100%;overflow-x:hidden;overflow-y:auto;position:relative}.uedbody .wrapper .wra_body .online .imagelist .list li{float:left;display:block;list-style:outside none none;padding:0;width:113px;height:113px;margin:0 0 9px 9px;background-color:#eee;overflow:hidden;cursor:pointer;position:relative}.uedbody .wrapper .wra_body .online .imagelist .list li img{cursor:pointer}.uedbody .wrapper .wra_body .online .imagelist .list li span.ic{position:absolute;top:0;left:0;cursor:pointer;width:113px;height:113px}.uedbody .wrapper .wra_body .online .imagelist .list li span.ic .img-size{font-size:12px;padding:5px;background:rgba(0,0,0,.6);display:none;color:#fff}.uedbody .wrapper .wra_body .online .imagelist .list li span.ic:hover{width:107px;height:107px;border:3px solid #1094fa;background-position:72px 72px}.uedbody .wrapper .wra_body .online .imagelist .list li span.ic:hover .img-size{display:inline-block;width:97px}.uedbody .wrapper .wra_body .online .imagelist .list li span.selected{background:url(images/success.png) no-repeat 75px 75px}.uedbody .wrapper .wra_body .searchbox{width:100%;padding:10px 0 0;zoom:1;overflow:hidden;display:none}.uedbody .wrapper .wra_body .searchbox .search-bar .searTxt{margin-left:5px;background:#fff none repeat scroll 0 0;width:300px;height:21px;line-height:21px;padding:3px 6px;font-size:14px;line-height:1.42857;border:1px solid #ccc;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.075) inset;transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;margin-right:10px}.uedbody .wrapper .wra_body .searchbox .search-bar .searchBtn{color:#fff;border-color:#285e8e;background-color:#3b97d7}.uedbody .wrapper .wra_body .searchbox .search-bar .searchRese{color:#333;border-color:#ccc;background-color:#fff}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box{width:100%;height:292px;overflow-x:hidden;overflow-y:auto;position:relative;margin-top:10px}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list{zoom:1;overflow:hidden}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li{float:left;display:block;list-style:outside none none;padding:0;width:113px;height:113px;margin:0 0 9px 9px;background-color:#eee;overflow:hidden;cursor:pointer;position:relative}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li img{cursor:pointer}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic{position:absolute;top:0;left:0;cursor:pointer;width:113px;height:113px}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic .img-size{font-size:12px;padding:5px;background:rgba(0,0,0,.6);display:none;color:#fff}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic:hover{width:107px;height:107px;border:3px solid #1094fa;background-position:72px 72px;overflow:hidden}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic:hover .img-size{display:inline-block;width:97px}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.selected{background:url(images/success.png) no-repeat 75px 75px}.uedbody .wrapper .wra_body .no-data{line-height:40px;height:40px;font-size:14px;color:#999;text-align:center;display:none}.uedbody .wrapper .wra_body .no-data .error{color:#c00}.uedbody .wrapper .wra_body .loading-icon{background:rgba(0,0,0,.4) url(images/loader.gif) no-repeat center center;position:absolute;width:100%;height:346px;top:0;left:0;display:none;text-align:center}.uedbody .wrapper .wra_body .loading-icon .loading-message{position:absolute;font-size:14px;color:#f0f0f0;top:210px;left:253px}.uedbody .wrapper .wra_body .icon-placeholder{background-size:113px 113px;display:block;width:113px;height:113px}.uedbody .wrapper .wra_body .icon-aep,.uedbody .wrapper .wra_body .icon-aepx{background-image:url(icons/aep.png)}.uedbody .wrapper .wra_body .icon-asp{background-image:url(icons/asp.png)}.uedbody .wrapper .wra_body .icon-avi{background-image:url(icons/avi.png)}.uedbody .wrapper .wra_body .icon-c,.uedbody .wrapper .wra_body .icon-cpp{background-image:url(icons/c.png)}.uedbody .wrapper .wra_body .icon-conf{background-image:url(icons/conf.png)}.uedbody .wrapper .wra_body .icon-css{background-image:url(icons/css.png)}.uedbody .wrapper .wra_body .icon-htm,.uedbody .wrapper .wra_body .icon-html{background-image:url(icons/htm.png)}.uedbody .wrapper .wra_body .icon-default{background-image:url(icons/txt.png)}.uedbody .wrapper .wra_body .icon-doc,.uedbody .wrapper .wra_body .icon-docx{background-image:url(icons/doc.png)}.uedbody .wrapper .wra_body .icon-eps{background-image:url(icons/eps.png)}.uedbody .wrapper .wra_body .icon-fla,.uedbody .wrapper .wra_body .icon-swf{background-image:url(icons/fla.png)}.uedbody .wrapper .wra_body .icon-idn{background-image:url(icons/idn.png)}.uedbody .wrapper .wra_body .icon-ini{background-image:url(icons/ini.png)}.uedbody .wrapper .wra_body .icon-jar,.uedbody .wrapper .wra_body .icon-java,.uedbody .wrapper .wra_body .icon-war{background-image:url(icons/java.png)}.uedbody .wrapper .wra_body .icon-js{background-image:url(icons/js.png)}.uedbody .wrapper .wra_body .icon-jsf{background-image:url(icons/jsf.png)}.uedbody .wrapper .wra_body .icon-markdown,.uedbody .wrapper .wra_body .icon-md{background-image:url(icons/markdown.png)}.uedbody .wrapper .wra_body .icon-mdb{background-image:url(icons/mdb.png)}.uedbody .wrapper .wra_body .icon-midi{background-image:url(icons/midi.png)}.uedbody .wrapper .wra_body .icon-mov{background-image:url(icons/mov.png)}.uedbody .wrapper .wra_body .icon-mp3{background-image:url(icons/mp3.png)}.uedbody .wrapper .wra_body .icon-mpeg{background-image:url(icons/mpeg.png)}.uedbody .wrapper .wra_body .icon-pdf{background-image:url(icons/pdf.png)}.uedbody .wrapper .wra_body .icon-php{background-image:url(icons/php.png)}.uedbody .wrapper .wra_body .icon-ppt,.uedbody .wrapper .wra_body .icon-pptx{background-image:url(icons/ppt.png)}.uedbody .wrapper .wra_body .icon-psd{background-image:url(icons/psd.png)}.uedbody .wrapper .wra_body .icon-pst{background-image:url(icons/pst.png)}.uedbody .wrapper .wra_body .icon-pub{background-image:url(icons/pub.png)}.uedbody .wrapper .wra_body .icon-py{background-image:url(icons/py.png)}.uedbody .wrapper .wra_body .icon-rb{background-image:url(icons/rb.png)}.uedbody .wrapper .wra_body .icon-rm,.uedbody .wrapper .wra_body .icon-rmvb{background-image:url(icons/rmvb.png)}.uedbody .wrapper .wra_body .icon-scss{background-image:url(icons/scss.png)}.uedbody .wrapper .wra_body .icon-tif{background-image:url(icons/tif.png)}.uedbody .wrapper .wra_body .icon-txt{background-image:url(icons/txt.png)}.uedbody .wrapper .wra_body .icon-vsd{background-image:url(icons/vsd.png)}.uedbody .wrapper .wra_body .icon-wav{background-image:url(icons/wav.png)}.uedbody .wrapper .wra_body .icon-wma{background-image:url(icons/wma.png)}.uedbody .wrapper .wra_body .icon-wmv{background-image:url(icons/wmv.png)}.uedbody .wrapper .wra_body .icon-xls,.uedbody .wrapper .wra_body .icon-xlsx{background-image:url(icons/xls.png)}.uedbody .wrapper .wra_body .icon-xml{background-image:url(icons/xml.png)}.uedbody .wrapper .wra_body .icon-7z,.uedbody .wrapper .wra_body .icon-gz,.uedbody .wrapper .wra_body .icon-rar,.uedbody .wrapper .wra_body .icon-tar,.uedbody .wrapper .wra_body .icon-tgz,.uedbody .wrapper .wra_body .icon-zip{background-image:url(icons/zip.png)}.uedbody .wrapper .wra_body_server{height:380px}.uedbody .wrapper .wra_body_server .online{display:block!important;height:365px}.uedbody .wra-btn-group{clear:both;zoom:1;text-align:right;padding:10px 20px 20px 0}.uedbody .wra-btn-group .tip-text{float:left;padding:5px 10px;color:#999;font-size:14px}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/multiimage/css/upload.scss b/addons/nkeditor/assets/plugins/multiimage/css/upload.scss
new file mode 100644
index 0000000..10ff832
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/multiimage/css/upload.scss
@@ -0,0 +1,642 @@
+$dialogWidth:652px;
+$dialogZindex:811213;
+$fontsize:14px;
+.uedbody{
+	div, dl, dt, dd, ul, li,ol, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, button, textarea, blockquote,p{margin:0; padding:0;}
+	h1,h2,h3,h4,h5,h6 {font-weight:normal;}
+	li{list-style-type:none;}
+	ol,ul,dl{list-style:none;}
+	em{font-style:normal;}
+	img{border:none;vertical-align:middle;}
+	select,label,input{vertical-align:middle; padding:0; margin:0;outline:medium;font-size:12px;}
+	textarea{resize: none; line-height:18px;}
+	table { border-collapse: collapse; border-spacing: 0; empty-cell:show;}
+	a{text-decoration:none;color:#333;outline:none; cursor:pointer;}
+	a:hover{cursor:pointer;blr:expression(this.onFocus=this.blur());}
+
+	box-sizing : content-box !important;
+	-webkit-box-sizing: content-box !important;
+	-moz-box-sizing: content-box !important;
+
+	* {
+		padding: 0; margin: 0;
+		box-sizing : content-box !important;
+		-webkit-box-sizing: content-box !important;
+		-moz-box-sizing: content-box !important;
+	}
+
+	.clearfix:before, .clearfix:after {
+		content: "";
+		display: table;
+	}
+	.clearfix:after{
+		clear: both;
+	}
+	.clearfix{
+		*zoom: 1;
+	}
+	.fr{float: right;}
+	.fl{float: left;}
+
+	width: $dialogWidth;
+	position: fixed;
+	padding: 2px 0px 0px 2px;
+	background-color: #FFF;
+	border: 1px solid rgba(0, 0, 0, 0.2);
+	border-radius: 6px;
+	box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.2);
+	z-index: $dialogZindex;
+	font-family:"微软雅黑";
+	font-size: 12px;
+	margin: 0px auto;
+
+	//start of ued_title
+	.ued_title{
+		height: 26px;
+		border-bottom: 1px solid #C6C6C6;
+		background: transparent url("images/dialog-title-bg.png") repeat-x scroll 0% 0%;
+		position: relative;
+		cursor: move;
+
+		.icon{background: url("images/icons-all.gif") no-repeat center;}
+
+		.uedbar {
+			span{
+				font-weight: bold;
+				font-size: 14px;
+				color: #444;
+				line-height: 26px;
+				padding-left: 5px;
+			}
+		}
+
+		.close_btn{
+			height: 20px;
+			width: 20px;
+			cursor: pointer;
+			background-position :0px -59px;
+			position: absolute;
+			right: 5px;
+			top: 3px;
+
+			&:hover{background-position: 0px -89px;}
+		}
+	}
+	//end of ued_title
+
+	//button styles
+	.btn {
+		display: inline-block;
+		margin-bottom: 0px;
+		margin-right: 5px;
+		padding: 4px 10px;
+		font-weight: 400;
+		text-align: center;
+		cursor: pointer;
+		border: 1px solid transparent;
+		white-space: nowrap;
+		font-size: $fontsize;
+		border-radius: 3px;
+		-moz-user-select: none;
+		box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+		padding: 5px 14px;
+	}
+	.btn-default {
+		border: 1px solid #CFCFCF;
+		color: #565656;
+		background: #ffffff;
+		&:hover {
+			background: #f0f0f0;
+		}
+	}
+	.btn-primary {
+		background:#00b7ee;
+		color: #ffffff;
+		&:hover {
+			background: #00a2d4;
+		}
+	}//button style end
+	.btn.disabled {
+		cursor: not-allowed;
+		opacity: .65;
+		&:hover {
+			background: #00b7ee;
+		}
+	}
+
+	//start of wrapper
+	.wrapper {
+		width: 630px;
+		height: 380px;
+		margin: 0px auto;
+		padding: 10px;
+		position: relative;
+		font-family: sans-serif;
+
+		//start of wra_head
+		.wra_head {
+			span {
+				float: left;
+				padding: 0px 5px;
+				margin-right:3px;
+				height: 30px;
+				border: 1px solid #CCC;
+				background: transparent url("images/dialog-title-bg.png") repeat-x scroll 0% 0%;
+				text-align: center;
+				line-height: 30px;
+				cursor: pointer;
+				position: relative;
+			}
+			span.focus {
+				height: 31px;
+				border-bottom: medium none;
+				background: #FFF none repeat scroll 0% 0%;
+				position: relative;
+				z-index: 2;
+			}
+		}//end of wra_head
+
+		//start of wra_body
+		.wra_body{
+
+			width: 100%;
+			height: 346px;
+			clear: both;
+			margin: 0px auto;
+			border: 1px solid #CCC;
+			display: block;
+			clip: auto;
+			overflow: hidden;
+			top: -1px;
+			position: relative;
+
+			//upload panel start
+			.upload-panel {
+				.wra_pla {
+					zoom: 1; overflow: hidden;
+					text-align: center;
+
+					.upload-image-placeholder {
+						margin: 10px;
+						border: 2px dashed #e6e6e6;
+						height: 172px;
+						padding-top: 150px;
+						text-align: center;
+						background: url("images/image.png") center 70px no-repeat;
+						position: relative;
+						top: 0;
+
+						.webuploader-element-invisible {
+							//width: 145px;
+							//height: 40px;
+							//position: absolute;
+							//left: 225px;
+							opacity: 0;
+							width: 0; height: 0;
+						}
+
+						.image-select {
+							padding: 10px 30px;
+							cursor: pointer;
+						}
+					}
+				}
+
+				//image list box start
+				.image-list-box {
+					.wra_bar {
+						border-bottom: 1px solid #DADADA;
+						padding: 8px;
+						vertical-align: middle;
+						position: relative;
+						zoom: 1;  overflow: hidden;
+
+						.info{
+							font-size: $fontsize;
+							color: #666;
+							margin-top: 6px;
+						}
+
+						.fr {
+							.btn {padding: 6px 15px;}
+						}
+
+					}
+
+					//filelist start
+					.filelist{
+						list-style: outside none none;
+						margin: 0px;
+						padding: 0px;
+						overflow-x: hidden;
+						overflow-y: auto;
+						position: relative;
+						height: 300px;
+
+						li {
+							width: 113px;
+							height: 113px;
+							margin: 9px 0px 0px 9px;
+							position: relative;
+							display: block;
+							float: left;
+							overflow: hidden;
+							font-size: 12px;
+
+							.imgWrap{
+								position: relative;
+								vertical-align: middle;
+								text-align: center;
+								overflow: hidden;
+								width: 113px;
+								height: 113px;
+								transform-origin: 50% 50% 0px;
+								transition: all 200ms ease-out 0s;
+
+							}
+
+							//file opt box start
+							.file-opt-box{
+								position: absolute;
+								display: none;
+								background: rgba(0, 0, 0, 0.5) none repeat scroll 0% 0%;
+								width: 100%;
+								top: 0px;
+								left: 0px;
+								overflow: hidden;
+
+								span {
+									width: 24px;
+									height: 24px;
+									display: inline;
+									float: right;
+									text-indent: -9999px;
+									overflow: hidden;
+									background: url("images/icons.png") no-repeat;
+									margin: 5px 1px 1px;
+									cursor: pointer;
+									-webkit-tap-highlight-color: rgba(0,0,0,0);
+									-webkit-user-select: none;
+									-moz-user-select: none;
+									-ms-user-select: none;
+									user-select: none;
+								}
+
+								.remove{
+									background-position: -48px -24px;
+									&:hover{
+										background-position: -48px -0px;
+									}
+								}
+								.rotateRight{
+									display: none;
+									background-position: -24px -24px;
+									&:hover{
+										background-position: -24px -0px;
+									}
+								}
+								.rotateLeft{
+									display: none;
+									background-position: 0px -24px;
+									&:hover{
+										background-position: 0px 0px;
+									}
+								}
+							}//file opt box end
+
+							.success{
+								background: url("images/success.png") no-repeat right;
+								position: absolute;
+								display: none;
+								left: 0px;
+								bottom: 0px;
+								height: 40px;
+								width: 100%;
+							}
+
+							.error {
+								position: absolute;
+								width: 100%;
+								display: none;
+								background: rgba(255, 255, 255, 0.7) none repeat scroll 0% 0%;
+								left: 0;
+								padding:5px 3px;
+								color: #cc0000;
+								border: 1px solid #cccccc;
+								bottom: 0;
+							}
+
+							.progress {
+								position: absolute;
+								width: 100%;
+								bottom: 0;
+								left: 0;
+								bottom: 0;
+								height: 8px;
+								overflow: hidden;
+								z-index: 50;
+								margin: 0;
+								border-radius: 0;
+								background: none;
+								-webkit-box-shadow: 0 0 0;
+
+								span {
+									width: 0;
+									height: 100%;
+									background: #1483d8 url("images/progress.png") repeat-x;
+									-webit-transition: width 200ms linear;
+									-moz-transition: width 200ms linear;
+									-o-transition: width 200ms linear;
+									-ms-transition: width 200ms linear;
+									transition: width 200ms linear;
+									-webkit-animation: progressmove 2s linear infinite;
+									-moz-animation: progressmove 2s linear infinite;
+									-o-animation: progressmove 2s linear infinite;
+									-ms-animation: progressmove 2s linear infinite;
+									animation: progressmove 2s linear infinite;
+									-webkit-transform: translateZ(0);
+								}
+							}
+						}//end li
+
+					}//filelist end
+
+				}//image list box end
+			}//upload panel end
+
+			//image online start
+			.online{
+				width: 100%;
+				height: 336px;
+				padding: 10px 0px 0px;
+				display: none;
+
+				.imagelist {
+					width: 100%;
+					height: 100%;
+					overflow-x: hidden;
+					overflow-y: auto;
+					position: relative;
+
+					.list {
+						li {
+							float: left;
+							display: block;
+							list-style: outside none none;
+							padding: 0px;
+							width: 113px;
+							height: 113px;
+							margin: 0px 0px 9px 9px;
+							background-color: #EEE;
+							overflow: hidden;
+							cursor: pointer;
+							position: relative;
+
+							img{cursor: pointer;}
+
+							span.ic {
+								position: absolute;
+								top: 0px;
+								left: 0px;
+								cursor: pointer;
+								width: 113px;
+								height: 113px;
+
+								.img-size {
+									font-size:12px;
+									padding: 5px;
+									background:rgba(0,0,0,0.6);
+									display: none;
+									color: #ffffff;
+								}
+
+								&:hover{
+									width: 107px;
+									height: 107px;
+									border: 3px solid #1094FA;
+									background-position: 72px 72px;
+									.img-size {
+										display: inline-block;
+										width: 97px;
+									}
+
+								}
+							}
+							span.selected {
+								background: url("images/success.png") no-repeat 75px 75px;
+							}
+						}
+					}
+
+				}
+
+			} //image online end
+
+			//image search start
+			.searchbox {
+				width: 100%;
+				padding: 10px 0px 0px;
+				zoom: 1; overflow: hidden;
+				display: none;
+
+				//搜索条
+				.search-bar {
+
+					.searTxt{
+						margin-left: 5px;
+						background: #FFF none repeat scroll 0% 0%;
+						width: 300px;
+						height: 21px;
+						line-height: 21px;
+						padding: 3px 6px;
+						font-size: $fontsize;
+						line-height: 1.42857;
+						border: 1px solid #CCC;
+						border-radius: 4px;
+						box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
+						transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
+						margin-right:10px;
+					}
+
+					.searchBtn {
+						color: #FFF;
+						border-color: #285E8E;
+						background-color: #3B97D7;
+					}
+					.searchRese{
+						color: #333;
+						border-color: #CCC;
+						background-color: #FFF;
+					}
+				}
+
+				.search-imagelist-box {
+					width: 100%;
+					height: 292px;
+					overflow-x: hidden;
+					overflow-y: auto;
+					position: relative;
+					margin-top:10px;
+
+					.search-list {
+						zoom:1; overflow: hidden;
+						li {
+							float: left;
+							display: block;
+							list-style: outside none none;
+							padding: 0px;
+							width: 113px;
+							height: 113px;
+							margin: 0px 0px 9px 9px;
+							background-color: #EEE;
+							overflow: hidden;
+							cursor: pointer;
+							position: relative;
+
+							img {
+								cursor: pointer;
+							}
+
+							span.ic {
+								position: absolute;
+								top: 0px;
+								left: 0px;
+								cursor: pointer;
+								width: 113px;
+								height: 113px;
+
+								.img-size {
+									font-size:12px;
+									padding: 5px;
+									background:rgba(0,0,0,0.6);
+									display: none;
+									color: #ffffff;
+								}
+
+								&:hover {
+									width: 107px;
+									height: 107px;
+									border: 3px solid #1094FA;
+									background-position: 72px 72px;
+									overflow: hidden;
+									.img-size {
+										display: inline-block;
+										width: 97px;
+									}
+								}
+							}
+							span.selected {
+								background: url("images/success.png") no-repeat 75px 75px;
+							}
+						}
+					}
+				}
+
+			}//image search start end
+
+			.no-data {
+				line-height: 40px;
+				height: 40px;
+				font-size:$fontsize;
+				color: #999999;
+				text-align: center;
+				display: none;
+				.error {
+					color: #cc0000;
+				}
+			}
+
+			.loading-icon {
+				background:rgba(0,0,0,0.4) url("images/loader.gif") no-repeat center center;
+				position: absolute;
+				width: 100%;
+				height: 346px;
+				top:0; left: 0;
+				display: none;
+				text-align: center;
+
+				.loading-message {
+					position: absolute;
+					font-size: 14px;
+					color: #f0f0f0;
+					top: 210px;
+					left:253px;
+				}
+			}
+
+			//图片占位符
+			.icon-placeholder {
+				background-size: 113px 113px;
+				display: block;
+				width: 113px;
+				height: 113px;
+			}
+			.icon-aep, .icon-aepx {background-image: url("icons/aep.png");}
+			.icon-asp {background-image: url("icons/asp.png");}
+			.icon-avi {background-image: url("icons/avi.png");}
+			.icon-c, .icon-cpp {background-image: url("icons/c.png");}
+			.icon-conf {background-image: url("icons/conf.png");}
+			.icon-css {background-image: url("icons/css.png");}
+			.icon-htm,.icon-html {background-image: url("icons/htm.png");}
+			.icon-default {background-image: url("icons/txt.png");}
+			.icon-doc,.icon-docx {background-image: url("icons/doc.png");}
+			.icon-eps {background-image: url("icons/eps.png");}
+			.icon-fla,.icon-swf {background-image: url("icons/fla.png");}
+			.icon-idn {background-image: url("icons/idn.png");}
+			.icon-ini {background-image: url("icons/ini.png");}
+			.icon-java, .icon-jar, .icon-war {background-image: url("icons/java.png");}
+			.icon-js {background-image: url("icons/js.png");}
+			.icon-jsf {background-image: url("icons/jsf.png");}
+			.icon-md, .icon-markdown {background-image: url("icons/markdown.png");}
+			.icon-mdb {background-image: url("icons/mdb.png");}
+			.icon-midi {background-image: url("icons/midi.png");}
+			.icon-mov {background-image: url("icons/mov.png");}
+			.icon-mp3 {background-image: url("icons/mp3.png");}
+			.icon-mpeg {background-image: url("icons/mpeg.png");}
+			.icon-pdf {background-image: url("icons/pdf.png");}
+			.icon-php {background-image: url("icons/php.png");}
+			.icon-ppt, .icon-pptx {background-image: url("icons/ppt.png");}
+			.icon-psd {background-image: url("icons/psd.png");}
+			.icon-pst {background-image: url("icons/pst.png");}
+			.icon-pub {background-image: url("icons/pub.png");}
+			.icon-py {background-image: url("icons/py.png");}
+			.icon-rb {background-image: url("icons/rb.png");}
+			.icon-rm, .icon-rmvb {background-image: url("icons/rmvb.png");}
+			.icon-scss {background-image: url("icons/scss.png");}
+			.icon-tif {background-image: url("icons/tif.png");}
+			.icon-txt {background-image: url("icons/txt.png");}
+			.icon-vsd {background-image: url("icons/vsd.png");}
+			.icon-wav {background-image: url("icons/wav.png");}
+			.icon-wma {background-image: url("icons/wma.png");}
+			.icon-wmv {background-image: url("icons/wmv.png");}
+			.icon-xls, .icon-xlsx {background-image: url("icons/xls.png");}
+			.icon-xml {background-image: url("icons/xml.png");}
+			.icon-zip, .icon-rar, .icon-tgz, .icon-gz, .icon-tar, .icon-7z {background-image: url("icons/zip.png");}
+
+		}//end of wra_body
+
+		.wra_body_server {
+			height: 380px;
+
+			.online {
+				display: block !important;
+				height: 365px;
+			}
+		}
+
+	}//start of wrapper
+
+	.wra-btn-group {
+		clear: both;
+		zoom: 1;
+		text-align: right;
+		padding: 10px 20px 20px 0px;
+
+		.tip-text {
+			float: left;
+			padding: 5px 10px;
+			color: #999;
+			font-size: 14px;
+		}
+	}
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/multiimage/multiimage.js b/addons/nkeditor/assets/plugins/multiimage/multiimage.js
new file mode 100644
index 0000000..fbc89b3
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/multiimage/multiimage.js
@@ -0,0 +1,90 @@
+/**
+ * HTML5 批量文件上传
+ * @author yangjian <yangjian102621@gmail.com>
+ * @since v4.1.12(2017-09-12)
+ * @site http://git.oschina.net/blackfox/kindeditor
+ */
+
+KindEditor.plugin('multiimage', function(K) {
+	var self = this, name = 'multiimage',
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'),
+		imageSizeLimit = K.undef(self.imageSizeLimit, 2048), //单位KB
+		imageFileTypes = K.undef(self.imageFileTypes, 'jpg|png|gif|jpeg'),
+		imageUploadLimit = K.undef(self.imageUploadLimit, 20),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		lang = self.lang(name + '.');
+
+	if(typeof jQuery == 'undefined') {
+		K.options.errorMsgHandler(lang.depJQueryError, "error");
+		return;
+	} else {
+		K.loadScript(K.options.pluginsPath+name+"/BUpload.js");
+		K.loadStyle(K.options.pluginsPath+name+"/css/upload.css");
+	}
+
+	//锁屏插件
+	K.locker = function () {
+		var docWidth = Math.max(document.documentElement.clientWidth, document.body.clientWidth);
+		var docHeight = Math.max(document.documentElement.clientHeight, document.body.clientHeight, $(document).height()) + document.documentElement.scrollTop;
+		return K.widget({
+			x : 0,
+			y : 0,
+			cls : 'ke-dialog-lock',
+			width : docWidth,
+			height : docHeight
+		});
+	}
+	self.plugin.multiImageDialog = function(options) {
+
+		if ( !window.applicationCache ) {
+			K.options.errorMsgHandler("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!", "error");
+			return;
+		}
+		var clickFn = options.clickFn;
+		var locker = K.locker();
+		locker.show();
+
+		var dialog = new BUpload({
+			src : filePostName,
+			upload_url : uploadJson,
+			list_url : fileManagerJson,	//图片列表数据获取url
+			max_filesize : imageSizeLimit,
+			max_filenum : imageUploadLimit,
+			ext_allow : imageFileTypes,
+			lang : lang,
+			top : self.dialogOffset,
+			fileType : "image",
+			errorHandler : K.options.errorMsgHandler,
+			callback : function(data) {
+				//console.log(data);
+				clickFn.call(this, data);
+			},
+			close : function () {
+				locker.remove();
+			}
+		});
+
+		return dialog;
+	};
+	self.clickToolbar(name, function() {
+		self.plugin.multiImageDialog({
+			clickFn : function (urlList) {
+
+				if (urlList.length === 0) {
+					return;
+				}
+				K.each(urlList, function(i, data) {
+					if (self.afterUpload) {
+						self.afterUpload.call(self, data, data, 'multiimage');
+					}
+					self.exec('insertimage', data);
+				});
+				// Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog
+				setTimeout(function() {
+					self.hideDialog().focus();
+				}, 0);
+			}
+		});
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/multiimage/template/template.html b/addons/nkeditor/assets/plugins/multiimage/template/template.html
new file mode 100644
index 0000000..6625f0a
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/multiimage/template/template.html
@@ -0,0 +1,95 @@
+<div class="uedbody">
+	<div class="ued_title">
+		<div class="uedbar">
+			<span>多图上传</span>
+		</div>
+		<div class="close_but icon" title="关闭对话框"></div>
+	</div>
+
+	<div class="wrapper">
+		<div id="wra_head" class="wra_head">
+			<span class="tab tab-upload focus" tab="upload-panel">本地上传</span>
+			<span class="tab tab-online" tab="online">文件服务器</span>
+			<span class="tab tab-search" tab="searchbox">图片搜索</span>
+		</div>
+
+		<div class="wra_body">
+			<div class="tab-panel upload-panel">
+				<div class="wra_pla">
+					<div class="upload-image-placeholder">
+						<div class="btn btn-primary image-select">点击选择图片</div>
+						<input type="file" name="src" class="webuploader-element-invisible" multiple="multiple">
+					</div>
+				</div>
+
+				<div class="image-list-box" style="display: none;">
+					<div class="wra_bar">
+						<div class="info fl">选中 {img.num} 张图片,共 {img.size} K</div>
+						<div class="fr">
+							<span class="btn btn-default btn-continue-add">继续添加</span>
+							<span class="btn btn-primary btn-start-upload">开始上传</span>
+						</div>
+					</div>
+
+					<ul class="filelist">
+						<?php for ( $i = 0; $i < 20; $i++ ) {?>
+						<li>
+							<div class="imgWrap">
+								<img src="http://ueditor.baidu.com/server/ueditor/upload/image/3.jpg?noCache=iokrzz5b" width="113" height="113" border="0" />
+							</div>
+							<div class="file-opt-box clearfix">
+								<span class="remove">删除</span>
+								<span class="rotateRight">向右旋转</span>
+								<span class="rotateLeft">向左旋转</span>
+							</div>
+							<div class="success"></div>
+							<div class="error">这是错误信息</div>
+							<div class="progress"><span style="display: none; width: 0px;"></span></div>
+						</li>
+						<?php }?>
+
+					</ul>
+
+				</div>
+			</div>
+
+			<div class="tab-panel online">
+				<div class="imagelist">
+					<ul class="list">
+						<li>
+							<img style="margin-left: -33px;" src="http://ueditor.baidu.com/server/ueditor/upload/image/10.jpg?noCache=iokuzbsf" height="113" width="179">
+							<span class="ic <?php if ($i%2==0) {echo "selected";}?>"></span>
+						</li>
+					</ul>
+					<div class="no-data">(⊙o⊙)亲,没有多数据了。</div>
+				</div>
+			</div>
+
+			<div class="tab-panel searchbox">
+				<div class="search-bar">
+					<input class="searTxt" type="text" placeholder="请输入搜索关键词" />
+					<input value="百度一下" class="btn btn-primary btn-search" type="button" />
+					<input value="清空搜索" class="btn btn-default btn-cancel" type="button" />
+				</div>
+
+				<div class="search-imagelist-box">
+					<ul class="search-list">
+						<li>
+							<img style="margin-left: -33px;" src="http://ueditor.baidu.com/server/ueditor/upload/image/10.jpg?noCache=iokuzbsf" height="113" width="179">
+							<span class="ic <?php if ($i%2==0) {echo "selected";}?>"></span>
+						</li>
+					</ul>
+					<div class="no-data">(⊙o⊙)亲,没有多数据了。</div>
+				</div>
+			</div>
+
+			<div class="loading-icon"></div>
+		</div><!-- end of wrapper -->
+
+	</div>
+
+	<div class="wra-btn-group">
+		<span class="btn btn-primary btn-confirm">确认</span>
+		<span class="btn btn-default btn-cancel">取消</span>
+	</div>
+</div>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/pagebreak/pagebreak.js b/addons/nkeditor/assets/plugins/pagebreak/pagebreak.js
new file mode 100644
index 0000000..dfa883a
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/pagebreak/pagebreak.js
@@ -0,0 +1,27 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('pagebreak', function(K) {
+	var self = this;
+	var name = 'pagebreak';
+	var pagebreakHtml = K.undef(self.pagebreakHtml, '<hr style="page-break-after: always;" class="ke-pagebreak" />');
+
+	self.clickToolbar(name, function() {
+		var cmd = self.cmd, range = cmd.range;
+		self.focus();
+		var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : '<span id="__kindeditor_tail_tag__"></span>';
+		self.insertHtml(pagebreakHtml + tail);
+		if (tail !== '') {
+			var p = K('#__kindeditor_tail_tag__', self.edit.doc);
+			range.selectNodeContents(p[0]);
+			p.removeAttr('id');
+			cmd.select();
+		}
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/plainpaste/plainpaste.js b/addons/nkeditor/assets/plugins/plainpaste/plainpaste.js
new file mode 100644
index 0000000..8f7bed8
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/plainpaste/plainpaste.js
@@ -0,0 +1,41 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('plainpaste', function(K) {
+	var self = this, name = 'plainpaste';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = '<div style="padding:10px 20px;">' +
+				'<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var html = textarea.val();
+						html = K.escape(html);
+						html = html.replace(/ {2}/g, ' &nbsp;');
+						if (self.newlineTag == 'p') {
+							html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>');
+						} else {
+							html = html.replace(/\n/g, '<br />$&');
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/preview/preview.js b/addons/nkeditor/assets/plugins/preview/preview.js
new file mode 100644
index 0000000..029c227
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/preview/preview.js
@@ -0,0 +1,134 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('preview', function(K) {
+	var self = this, name = 'preview', undefined;
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			width = document.documentElement.clientWidth * 0.9,
+			height = document.documentElement.clientHeight - 160,
+			html = '<div style="padding:10px 20px;">' +
+				'<iframe class="ke-textarea" frameborder="0" style="width:'+(width-42)+'px;height:'+height+'px;"></iframe>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : width,
+				title : self.lang(name),
+				body : html
+			}),
+			iframe = K('iframe', dialog.div),
+			doc = K.iframeDoc(iframe);
+		doc.open();
+
+		var cssPath = self.options.cssPath;
+		var jsPath = self.options.jsPath;
+		var arr = [
+			'<html lang="en">',
+			'<head><meta charset="utf-8" /><title></title>',
+			//'<link href="http://localhost/editor/nkeditor/plugins/code/prettify.css" rel="stylesheet">',
+			'<style>',
+			'html {margin:0;padding:0;}',
+			'body {margin:0;padding:5px;}',
+			'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
+			'body, p, div {word-wrap: break-word;}',
+			'p {margin:5px 0;}',
+			'table {border-collapse:collapse;}',
+			'img {border:0;}',
+			'noscript {display:none;}',
+			'table.ke-zeroborder td {border:1px dotted #AAA;}',
+			'img.ke-flash {',
+			'	border:1px solid #AAA;',
+			'	background-image:url(' + self.options.themesPath + 'common/flash.svg);',
+			'	*background-image:url(' + self.options.themesPath + 'common/flash.png);',
+			'	background-size:64px 64px;',
+			'	background-position:center center;',
+			'	background-repeat:no-repeat;',
+			'	width:100px;',
+			'	height:100px;',
+			'}',
+			'img.ke-rm {',
+			'	border:1px solid #AAA;',
+			'	background-image:url(' + self.options.themesPath + 'common/rm.gif);',
+			'	background-position:center center;',
+			'	background-repeat:no-repeat;',
+			'	width:100px;',
+			'	height:100px;',
+			'}',
+			'img.ke-media {',
+			'	border:1px solid #AAA;',
+			'	background-image:url(' + self.options.themesPath + 'common/play.svg);',
+			'	*background-image:url(' + self.options.themesPath + 'common/play.png);',
+			'	background-position:center center;',
+			'	background-size:64px 64px;',
+			'	background-repeat:no-repeat;',
+			'	width:100px;',
+			'	height:100px;',
+			'}',
+			'img.ke-anchor {',
+			'	border:1px dashed #666;',
+			'	width:16px;',
+			'	height:16px;',
+			'}',
+			'.ke-script, .ke-noscript, .ke-display-none {',
+			'	display:none;',
+			'	font-size:0;',
+			'	width:0;',
+			'	height:0;',
+			'}',
+			'.ke-pagebreak {',
+			'	border:1px dotted #AAA;',
+			'	font-size:0;',
+			'	height:2px;',
+			'}'
+		];
+
+		if (self.options.showHelpGrid) {
+			arr.push('p,ul,ol,li,div{border: 1px dashed #c1c1c1;}');
+			arr.push('li{margin:5px 0px}');
+			arr.push('div,ul,ol{margin-bottom:10px}');
+		}
+		arr.push('</style>');
+		// 加载 css
+		if (!K.isArray(cssPath)) {
+			cssPath = [cssPath];
+		}
+		if (K.inArray(self.options.pluginsPath+'code/prism.css', cssPath) < 0) {
+			cssPath.push(self.options.pluginsPath+'code/prism.css');
+		}
+		K.each(cssPath, function(i, path) {
+			if (path) {
+				arr.push('<link href="' + path + '" rel="stylesheet" />');
+			}
+		});
+		if (self.options.cssData) {
+			arr.push('<style>' + self.options.cssData + '</style>');
+		}
+		arr.push('</head><body ' + (self.options.bodyClass ? 'class="' + self.options.bodyClass + '"' : '') + '>');
+		// 获取编辑器内容
+		arr.push(self.fullHtml());
+		// 加载脚本
+		if (!K.isArray(jsPath)) {
+			jsPath = [jsPath];
+		}
+		// 加载代码高亮的脚本
+		if (K.inArray(self.options.pluginsPath+'code/prism.js', jsPath) < 0) {
+			jsPath.push(self.options.pluginsPath+'code/prism.js');
+		}
+		K.each(jsPath, function(i, path) {
+			if (path) {
+				arr.push('<script type="text/javascript" src="' + path + '"></script>');
+			}
+		});
+		arr.push('</body></html>');
+		doc.write(arr.join('\n'));
+		doc.close();
+		K(doc.body).css('background-color', '#FFF');
+		iframe[0].contentWindow.focus();
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/quickformat/quickformat.js b/addons/nkeditor/assets/plugins/quickformat/quickformat.js
new file mode 100644
index 0000000..5b98c72
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/quickformat/quickformat.js
@@ -0,0 +1,81 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('quickformat', function(K) {
+	var self = this, name = 'quickformat',
+		blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p');
+	function getFirstChild(knode) {
+		var child = knode.first();
+		while (child && child.first()) {
+			child = child.first();
+		}
+		return child;
+	}
+	self.clickToolbar(name, function() {
+		self.focus();
+		var doc = self.edit.doc,
+			range = self.cmd.range,
+			child = K(doc.body).first(), next,
+			nodeList = [], subList = [],
+			bookmark = range.createBookmark(true);
+		while(child) {
+			next = child.next();
+			var firstChild = getFirstChild(child);
+			if (!firstChild || firstChild.name != 'img') {
+				if (blockMap[child.name]) {
+					child.html(child.html().replace(/^(\s|&nbsp;| )+/ig, ''));
+					child.css('text-indent', '2em');
+				} else {
+					subList.push(child);
+				}
+				if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) {
+					if (subList.length > 0) {
+						nodeList.push(subList);
+					}
+					subList = [];
+				}
+			}
+			child = next;
+		}
+		K.each(nodeList, function(i, subList) {
+			var wrapper = K('<p style="text-indent:2em;"></p>', doc);
+			subList[0].before(wrapper);
+			K.each(subList, function(i, knode) {
+				wrapper.append(knode);
+			});
+		});
+		range.moveToBookmark(bookmark);
+		self.addBookmark();
+	});
+});
+
+/**
+--------------------------
+abcd<br />
+1234<br />
+
+to
+
+<p style="text-indent:2em;">
+	abcd<br />
+	1234<br />
+</p>
+
+--------------------------
+
+&nbsp; abcd<img>1233
+<p>1234</p>
+
+to
+
+<p style="text-indent:2em;">abcd<img>1233</p>
+<p style="text-indent:2em;">1234</p>
+
+--------------------------
+*/
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/quote/quote.js b/addons/nkeditor/assets/plugins/quote/quote.js
new file mode 100644
index 0000000..b4daca4
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/quote/quote.js
@@ -0,0 +1,12 @@
+/**
+ * 引用插件
+ * @author yangjian
+ */
+KindEditor.plugin('quote', function(K) {
+	var self = this;
+	var name = 'quote';
+	self.clickToolbar(name, function() {
+		self.insertHtml('<blockquote class="ke-quote"><p>这里输入引用内容...</p></blockquote><br/>');
+		self.focus();
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/table/table.js b/addons/nkeditor/assets/plugins/table/table.js
new file mode 100644
index 0000000..1068edc
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/table/table.js
@@ -0,0 +1,746 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('table', function(K) {
+	var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder';
+	var borderColor = K.undef(self.options.tableBorderColor, '#cccccc');
+	// 设置颜色
+	function _setColor(box, color) {
+		color = color.toUpperCase();
+		box.css('background-color', color);
+		box.css('color', color === '#000000' ? '#FFFFFF' : '#000000');
+		box.html(color);
+	}
+	// 初始化取色器
+	var pickerList = [];
+	function _initColorPicker(dialogDiv, colorBox) {
+		colorBox.bind('click,mousedown', function(e){
+			e.stopPropagation();
+		});
+		function removePicker() {
+			K.each(pickerList, function() {
+				this.remove();
+			});
+			pickerList = [];
+			K(document).unbind('click,mousedown', removePicker);
+			dialogDiv.unbind('click,mousedown', removePicker);
+		}
+		colorBox.click(function(e) {
+			removePicker();
+			var box = K(this),
+				pos = box.pos();
+			var picker = K.colorpicker({
+				x : pos.x,
+				y : pos.y + box.height(),
+				z : 811214,
+				selectedColor : K(this).html(),
+				colors : self.colorTable,
+				noColor : self.lang('noColor'),
+				shadowMode : self.shadowMode,
+				click : function(color) {
+					_setColor(box, color);
+					removePicker();
+				}
+			});
+			pickerList.push(picker);
+			K(document).bind('click,mousedown', removePicker);
+			dialogDiv.bind('click,mousedown', removePicker);
+		});
+	}
+	// 取得下一行cell的index
+	function _getCellIndex(table, row, cell) {
+		var rowSpanCount = 0;
+		for (var i = 0, len = row.cells.length; i < len; i++) {
+			if (row.cells[i] == cell) {
+				break;
+			}
+			rowSpanCount += row.cells[i].rowSpan - 1;
+		}
+		return cell.cellIndex - rowSpanCount;
+	}
+	self.plugin.table = {
+		//insert or modify table
+		prop : function(isInsert) {
+			var html = [
+				'<div class="ke-dialog-content-inner">',
+				//rows, cols
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keRows" class="row-left">' + lang.cells + ':</label>',
+				'<div class="row-right">',
+				lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',
+				lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',
+				'</div>',
+				'</div>',
+				//width, height
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keWidth" class="row-left">' + lang.size + ':</label>',
+				'<div class="row-right">',
+				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+				'<select name="widthType" class="ke-select">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select> &nbsp; ',
+				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+				'<select name="heightType" class="ke-select">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select>',
+				'</div>',
+				'</div>',
+				//space, padding
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="kePadding" class="row-left">' + lang.space + ':</label>',
+				'<div class="row-right">',
+				lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',
+				lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',
+				'</div>',
+				'</div>',
+				//align
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keAlign" class="row-left">' + lang.align + ':</label>',
+				'<div class="row-right">',
+				'<select id="keAlign" class="ke-select" name="align">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="left">' + lang.alignLeft + '</option>',
+				'<option value="center">' + lang.alignCenter + '</option>',
+				'<option value="right">' + lang.alignRight + '</option>',
+				'</select>',
+				'</div>',
+				'</div>',
+				//border
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keBorder" class="row-left">' + lang.border + ':</label>',
+				'<div class="row-right">',
+				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>',
+				//background color
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keBgColor" class="row-left">' + lang.backgroundColor + ':</label>',
+				'<div class="row-right">',
+				'<span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>',
+				'</div>'
+			].join('');
+			var bookmark = self.cmd.range.createBookmark();
+			var dialog = self.createDialog({
+				name : name,
+				width : 500,
+				title : self.lang(name),
+				body : html,
+				beforeRemove : function() {
+					colorBox.unbind();
+				},
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var rows = rowsBox.val(),
+							cols = colsBox.val(),
+							width = widthBox.val(),
+							height = heightBox.val(),
+							widthType = widthTypeBox.val(),
+							heightType = heightTypeBox.val(),
+							padding = paddingBox.val(),
+							spacing = spacingBox.val(),
+							align = alignBox.val(),
+							border = borderBox.val(),
+							borderColor = K(colorBox[0]).html() || '',
+							bgColor = K(colorBox[1]).html() || '';
+						if (rows == 0 || !/^\d+$/.test(rows)) {
+							K.options.errorMsgHandler(self.lang('invalidRows'), "error");
+							rowsBox[0].focus();
+							return;
+						}
+						if (cols == 0 || !/^\d+$/.test(cols)) {
+							K.options.errorMsgHandler(self.lang('invalidRows'), "error");
+							colsBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+							heightBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(padding)) {
+							K.options.errorMsgHandler(self.lang('invalidPadding'), "error");
+							paddingBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(spacing)) {
+							K.options.errorMsgHandler(self.lang('invalidSpacing'), "error");
+							spacingBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(border)) {
+							K.options.errorMsgHandler(self.lang('invalidBorder'), "error");
+							borderBox[0].focus();
+							return;
+						}
+						//modify table
+						if (table) {
+							if (width !== '') {
+								table.width(width + widthType);
+							} else {
+								table.css('width', '');
+							}
+							if (table[0].width !== undefined) {
+								table.removeAttr('width');
+							}
+							if (height !== '') {
+								table.height(height + heightType);
+							} else {
+								table.css('height', '');
+							}
+							if (table[0].height !== undefined) {
+								table.removeAttr('height');
+							}
+							table.css('background-color', bgColor);
+							if (table[0].bgColor !== undefined) {
+								table.removeAttr('bgColor');
+							}
+							if (padding !== '') {
+								table[0].cellPadding = padding;
+							} else {
+								table.removeAttr('cellPadding');
+							}
+							if (spacing !== '') {
+								table[0].cellSpacing = spacing;
+							} else {
+								table.removeAttr('cellSpacing');
+							}
+							if (align !== '') {
+								table[0].align = align;
+							} else {
+								table.removeAttr('align');
+							}
+							if (border !== '') {
+								table.attr('border', border);
+							} else {
+								table.removeAttr('border');
+							}
+							if (border === '' || border === '0') {
+								table.addClass(zeroborder);
+							} else {
+								table.removeClass(zeroborder);
+							}
+							if (borderColor !== '') {
+								table.attr('borderColor', borderColor);
+							} else {
+								table.removeAttr('borderColor');
+							}
+							self.hideDialog().focus();
+							self.cmd.range.moveToBookmark(bookmark);
+							self.cmd.select();
+							self.addBookmark();
+							return;
+						}
+						//insert new table
+						var style = '';
+						if (width !== '') {
+							style += 'width:' + width + widthType + ';';
+						}
+						if (height !== '') {
+							style += 'height:' + height + heightType + ';';
+						}
+						if (bgColor !== '') {
+							style += 'background-color:' + bgColor + ';';
+						}
+						var html = '<table class="table"';
+						if (style !== '') {
+							html += ' style="' + style + '"';
+						}
+						if (padding !== '') {
+							html += ' cellpadding="' + padding + '"';
+						}
+						if (spacing !== '') {
+							html += ' cellspacing="' + spacing + '"';
+						}
+						if (align !== '') {
+							html += ' align="' + align + '"';
+						}
+						if (border !== '') {
+							html += ' border="' + border + '"';
+						}
+						if (border === '' || border === '0') {
+							html += ' class="table ' + zeroborder + '"';
+						}
+						if (borderColor !== '') {
+							html += ' bordercolor="' + borderColor + '"';
+						}
+						html += '>';
+						for (var i = 0; i < rows; i++) {
+							html += '<tr>';
+							for (var j = 0; j < cols; j++) {
+								html += '<td>' + (K.IE ? '&nbsp;' : '<br />') + '</td>';
+							}
+							html += '</tr>';
+						}
+						html += '</table>';
+						if (!K.IE) {
+							html += '<br />';
+						}
+						// 取得range的block标签
+						function getAncestorTag(range) {
+							var ancestor = K(range.commonAncestor());
+							while (ancestor) {
+								if (ancestor.type == 1 && !ancestor.isStyle()) {
+									break;
+								}
+								ancestor = ancestor.parent();
+							}
+							return ancestor;
+						}
+						// 如果是在 p 标签中插入表格,则自动删除当前 p 标签
+						var tag = getAncestorTag(self.cmd.range);
+						if (tag.name == 'p') {
+							tag.before(K(html));
+							tag.remove();
+							self.cmd.selection();
+							self.insertHtml('<br />');
+							self.select().hideDialog().focus();
+						} else {
+							self.insertHtml(html);
+							self.select().hideDialog().focus();
+							self.addBookmark();
+						}
+					}
+				}
+			}),
+			div = dialog.div,
+			rowsBox = K('[name="rows"]', div).val(3),
+			colsBox = K('[name="cols"]', div).val(2),
+			widthBox = K('[name="width"]', div).val(100),
+			heightBox = K('[name="height"]', div),
+			widthTypeBox = K('[name="widthType"]', div),
+			heightTypeBox = K('[name="heightType"]', div),
+			paddingBox = K('[name="padding"]', div).val(0),
+			spacingBox = K('[name="spacing"]', div).val(0),
+			alignBox = K('[name="align"]', div),
+			borderBox = K('[name="border"]', div).val(1),
+			colorBox = K('.ke-input-color', div);
+			_initColorPicker(div, colorBox.eq(0));
+			_initColorPicker(div, colorBox.eq(1));
+			//_setColor(colorBox.eq(0), borderColor);
+			_setColor(colorBox.eq(1), '');
+			// foucs and select
+			rowsBox[0].focus();
+			rowsBox[0].select();
+			var table;
+			if (isInsert) {
+				return;
+			}
+			//get selected table node
+			table = self.plugin.getSelectedTable();
+			if (table) {
+				rowsBox.val(table[0].rows.length);
+				colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0);
+				rowsBox.attr('disabled', true);
+				colsBox.attr('disabled', true);
+				var match,
+					tableWidth = table[0].style.width || table[0].width,
+					tableHeight = table[0].style.height || table[0].height;
+				if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) {
+					widthBox.val(match[1]);
+					widthTypeBox.val(match[2]);
+				} else {
+					widthBox.val('');
+				}
+				if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) {
+					heightBox.val(match[1]);
+					heightTypeBox.val(match[2]);
+				}
+				paddingBox.val(table[0].cellPadding || '');
+				spacingBox.val(table[0].cellSpacing || '');
+				alignBox.val(table[0].align || '');
+				borderBox.val(table[0].border === undefined ? '' : table[0].border);
+				_setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || ''));
+				_setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || ''));
+				widthBox[0].focus();
+				widthBox[0].select();
+			}
+		},
+		//modify cell
+		cellprop : function() {
+			var html = [
+				'<div style="padding:20px;">',
+				//width, height
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
+				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+				'<select name="widthType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select> &nbsp; ',
+				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+				'<select name="heightType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select>',
+				'</div>',
+				//align
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
+				lang.textAlign + ' <select id="keAlign" name="textAlign">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="left">' + lang.alignLeft + '</option>',
+				'<option value="center">' + lang.alignCenter + '</option>',
+				'<option value="right">' + lang.alignRight + '</option>',
+				'</select> ',
+				lang.verticalAlign + ' <select name="verticalAlign">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="top">' + lang.alignTop + '</option>',
+				'<option value="middle">' + lang.alignMiddle + '</option>',
+				'<option value="bottom">' + lang.alignBottom + '</option>',
+				'<option value="baseline">' + lang.alignBaseline + '</option>',
+				'</select>',
+				'</div>',
+				//border
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
+				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				//background color
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
+				'<span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>'
+			].join('');
+			var bookmark = self.cmd.range.createBookmark();
+			var dialog = self.createDialog({
+				name : name,
+				width : 500,
+				title : self.lang('tablecell'),
+				body : html,
+				beforeRemove : function() {
+					colorBox.unbind();
+				},
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var width = widthBox.val(),
+							height = heightBox.val(),
+							widthType = widthTypeBox.val(),
+							heightType = heightTypeBox.val(),
+							padding = paddingBox.val(),
+							spacing = spacingBox.val(),
+							textAlign = textAlignBox.val(),
+							verticalAlign = verticalAlignBox.val(),
+							border = borderBox.val(),
+							borderColor = K(colorBox[0]).html() || '',
+							bgColor = K(colorBox[1]).html() || '';
+						if (!/^\d*$/.test(width)) {
+							K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+							heightBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(border)) {
+							K.options.errorMsgHandler(self.lang('invalidBorder'), "error");
+							borderBox[0].focus();
+							return;
+						}
+						cell.css({
+							width : width !== '' ? (width + widthType) : '',
+							height : height !== '' ? (height + heightType) : '',
+							'background-color' : bgColor,
+							'text-align' : textAlign,
+							'vertical-align' : verticalAlign,
+							'border-width' : border,
+							'border-style' : border !== '' ? 'solid' : '',
+							'border-color' : borderColor
+						});
+						self.hideDialog().focus();
+						self.cmd.range.moveToBookmark(bookmark);
+						self.cmd.select();
+						self.addBookmark();
+					}
+				}
+			}),
+			div = dialog.div,
+			widthBox = K('[name="width"]', div).val(100),
+			heightBox = K('[name="height"]', div),
+			widthTypeBox = K('[name="widthType"]', div),
+			heightTypeBox = K('[name="heightType"]', div),
+			paddingBox = K('[name="padding"]', div).val(0),
+			spacingBox = K('[name="spacing"]', div).val(0),
+			textAlignBox = K('[name="textAlign"]', div),
+			verticalAlignBox = K('[name="verticalAlign"]', div),
+			borderBox = K('[name="border"]', div).val(1),
+			colorBox = K('.ke-input-color', div);
+			_initColorPicker(div, colorBox.eq(0));
+			_initColorPicker(div, colorBox.eq(1));
+			//_setColor(colorBox.eq(0), '#000000');
+			_setColor(colorBox.eq(1), '');
+			// foucs and select
+			widthBox[0].focus();
+			widthBox[0].select();
+			// get selected cell
+			var cell = self.plugin.getSelectedCell();
+			var match,
+				cellWidth = cell[0].style.width || cell[0].width || '',
+				cellHeight = cell[0].style.height || cell[0].height || '';
+			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) {
+				widthBox.val(match[1]);
+				widthTypeBox.val(match[2]);
+			} else {
+				widthBox.val('');
+			}
+			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) {
+				heightBox.val(match[1]);
+				heightTypeBox.val(match[2]);
+			}
+			textAlignBox.val(cell[0].style.textAlign || '');
+			verticalAlignBox.val(cell[0].style.verticalAlign || '');
+			var border = cell[0].style.borderWidth || '';
+			if (border) {
+				border = parseInt(border);
+			}
+			borderBox.val(border);
+			_setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || ''));
+			_setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || ''));
+			widthBox[0].focus();
+			widthBox[0].select();
+		},
+		insert : function() {
+			this.prop(true);
+		},
+		'delete' : function() {
+			var table = self.plugin.getSelectedTable();
+			self.cmd.range.setStartBefore(table[0]).collapse(true);
+			self.cmd.select();
+			table.remove();
+			self.addBookmark();
+		},
+		colinsert : function(offset) {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				index = cell.cellIndex + offset;
+			// 取得第一行的index
+			index += table.rows[0].cells.length - row.cells.length;
+
+			for (var i = 0, len = table.rows.length; i < len; i++) {
+				var newRow = table.rows[i],
+					newCell = newRow.insertCell(index);
+				newCell.innerHTML = K.IE ? '' : '<br />';
+				// 调整下一行的单元格index
+				index = _getCellIndex(table, newRow, newCell);
+			}
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colinsertleft : function() {
+			this.colinsert(0);
+		},
+		colinsertright : function() {
+			this.colinsert(1);
+		},
+		rowinsert : function(offset) {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0];
+			var rowIndex = row.rowIndex;
+			if (offset === 1) {
+				rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset;
+			}
+			var newRow = table.insertRow(rowIndex);
+
+			for (var i = 0, len = row.cells.length; i < len; i++) {
+				// 调整cell个数
+				if (row.cells[i].rowSpan > 1) {
+					len -= row.cells[i].rowSpan - 1;
+				}
+				var newCell = newRow.insertCell(i);
+				// copy colspan
+				if (offset === 1 && row.cells[i].colSpan > 1) {
+					newCell.colSpan = row.cells[i].colSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+			}
+			// 调整rowspan
+			for (var j = rowIndex; j >= 0; j--) {
+				var cells = table.rows[j].cells;
+				if (cells.length > i) {
+					for (var k = cell.cellIndex; k >= 0; k--) {
+						if (cells[k].rowSpan > 1) {
+							cells[k].rowSpan += 1;
+						}
+					}
+					break;
+				}
+			}
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		rowinsertabove : function() {
+			this.rowinsert(0);
+		},
+		rowinsertbelow : function() {
+			this.rowinsert(1);
+		},
+		rowmerge : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex, // 当前行的index
+				nextRowIndex = rowIndex + cell.rowSpan, // 下一行的index
+				nextRow = table.rows[nextRowIndex]; // 下一行
+			// 最后一行不能合并
+			if (table.rows.length <= nextRowIndex) {
+				return;
+			}
+			var cellIndex = cell.cellIndex; // 下一行单元格的index
+			if (nextRow.cells.length <= cellIndex) {
+				return;
+			}
+			var nextCell = nextRow.cells[cellIndex]; // 下一行单元格
+			// 上下行的colspan不一致时不能合并
+			if (cell.colSpan !== nextCell.colSpan) {
+				return;
+			}
+			cell.rowSpan += nextCell.rowSpan;
+			nextRow.deleteCell(cellIndex);
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colmerge : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex, // 当前行的index
+				cellIndex = cell.cellIndex,
+				nextCellIndex = cellIndex + 1;
+			// 最后一列不能合并
+			if (row.cells.length <= nextCellIndex) {
+				return;
+			}
+			var nextCell = row.cells[nextCellIndex];
+			// 左右列的rowspan不一致时不能合并
+			if (cell.rowSpan !== nextCell.rowSpan) {
+				return;
+			}
+			cell.colSpan += nextCell.colSpan;
+			row.deleteCell(nextCellIndex);
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		rowsplit : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex;
+			// 不是可分割单元格
+			if (cell.rowSpan === 1) {
+				return;
+			}
+			var cellIndex = _getCellIndex(table, row, cell);
+			for (var i = 1, len = cell.rowSpan; i < len; i++) {
+				var newRow = table.rows[rowIndex + i],
+					newCell = newRow.insertCell(cellIndex);
+				if (cell.colSpan > 1) {
+					newCell.colSpan = cell.colSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+				// 调整下一行的单元格index
+				cellIndex = _getCellIndex(table, newRow, newCell);
+			}
+			K(cell).removeAttr('rowSpan');
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colsplit : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				cellIndex = cell.cellIndex;
+			// 不是可分割单元格
+			if (cell.colSpan === 1) {
+				return;
+			}
+			for (var i = 1, len = cell.colSpan; i < len; i++) {
+				var newCell = row.insertCell(cellIndex + i);
+				if (cell.rowSpan > 1) {
+					newCell.rowSpan = cell.rowSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+			}
+			K(cell).removeAttr('colSpan');
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		coldelete : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				index = cell.cellIndex;
+			for (var i = 0, len = table.rows.length; i < len; i++) {
+				var newRow = table.rows[i],
+					newCell = newRow.cells[index];
+				if (newCell.colSpan > 1) {
+					newCell.colSpan -= 1;
+					if (newCell.colSpan === 1) {
+						K(newCell).removeAttr('colSpan');
+					}
+				} else {
+					newRow.deleteCell(index);
+				}
+				// 跳过不需要删除的行
+				if (newCell.rowSpan > 1) {
+					i += newCell.rowSpan - 1;
+				}
+			}
+			if (row.cells.length === 0) {
+				self.cmd.range.setStartBefore(table).collapse(true);
+				self.cmd.select();
+				K(table).remove();
+			} else {
+				self.cmd.selection(true);
+			}
+			self.addBookmark();
+		},
+		rowdelete : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex;
+			// 从下到上删除
+			for (var i = cell.rowSpan - 1; i >= 0; i--) {
+				table.deleteRow(rowIndex + i);
+			}
+			if (table.rows.length === 0) {
+				self.cmd.range.setStartBefore(table).collapse(true);
+				self.cmd.select();
+				K(table).remove();
+			} else {
+				self.cmd.selection(true);
+			}
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.table.prop);
+});
diff --git a/addons/nkeditor/assets/plugins/template/html/1.html b/addons/nkeditor/assets/plugins/template/html/1.html
new file mode 100644
index 0000000..034126b
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/template/html/1.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<h3>
+		<img align="left" height="100" style="margin-right: 10px" width="100" />在此处输入标题
+	</h3>
+	<p>
+		在此处输入内容
+	</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/template/html/2.html b/addons/nkeditor/assets/plugins/template/html/2.html
new file mode 100644
index 0000000..dc2584a
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/template/html/2.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<h3>
+		标题
+	</h3>
+	<table style="width:100%;" cellpadding="2" cellspacing="0" border="1">
+		<tbody>
+			<tr>
+				<td>
+					<h3>标题1</h3>
+				</td>
+				<td>
+					<h3>标题1</h3>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					内容1
+				</td>
+				<td>
+					内容2
+				</td>
+			</tr>
+			<tr>
+				<td>
+					内容3
+				</td>
+				<td>
+					内容4
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	<p>
+		表格说明
+	</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/template/html/3.html b/addons/nkeditor/assets/plugins/template/html/3.html
new file mode 100644
index 0000000..873f0c6
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/template/html/3.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<p>
+		在此处输入内容
+	</p>
+	<ol>
+		<li>
+			描述1
+		</li>
+		<li>
+			描述2
+		</li>
+		<li>
+			描述3
+		</li>
+	</ol>
+	<p>
+		在此处输入内容
+	</p>
+	<ul>
+		<li>
+			描述1
+		</li>
+		<li>
+			描述2
+		</li>
+		<li>
+			描述3
+		</li>
+	</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/plugins/template/template.js b/addons/nkeditor/assets/plugins/template/template.js
new file mode 100644
index 0000000..30d0dc3
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/template/template.js
@@ -0,0 +1,58 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('template', function(K) {
+	var self = this, name = 'template', lang = self.lang(name + '.'),
+		htmlPath = self.pluginsPath + name + '/html/';
+	function getFilePath(fileName) {
+		return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION);
+	}
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			arr = ['<div class="ke-dialog-content-inner" style="padding-top:0">',
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<div class="ke-header" style="height: 32px;">',
+				// left start
+				lang. selectTemplate + ' <select class="ke-select">'];
+			K.each(lang.fileList, function(key, val) {
+				arr.push('<option value="' + key + '">' + val + '</option>');
+			});
+			html = [arr.join(''),
+				'</select>',
+				// right start
+				'<input type="checkbox" id="keReplaceFlag" class="checkbox" name="replaceFlag" value="1" /> <label for="keReplaceFlag">' + lang.replaceContent + '</label>',
+				'</div>',
+				'</div>',
+
+				//template iframe
+				'<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',
+				'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 500,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var doc = K.iframeDoc(iframe);
+					self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus();
+				}
+			}
+		});
+		var selectBox = K('select', dialog.div),
+			checkbox = K('[name="replaceFlag"]', dialog.div),
+			iframe = K('iframe', dialog.div);
+		checkbox[0].checked = true;
+		iframe.attr('src', getFilePath(selectBox.val()));
+		selectBox.change(function() {
+			iframe.attr('src', getFilePath(this.value));
+		});
+	});
+});
diff --git a/addons/nkeditor/assets/plugins/wordpaste/wordpaste.js b/addons/nkeditor/assets/plugins/wordpaste/wordpaste.js
new file mode 100644
index 0000000..9f828e0
--- /dev/null
+++ b/addons/nkeditor/assets/plugins/wordpaste/wordpaste.js
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+
+KindEditor.plugin('wordpaste', function (K) {
+    var self = this, name = 'wordpaste';
+    self.clickToolbar(name, function () {
+        var jsonp = function (url, callback) {
+            var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
+            window[callbackName] = function (data) {
+                delete window[callbackName];
+                document.body.removeChild(script);
+                callback(data);
+            };
+
+            var script = document.createElement('script');
+            script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
+            document.body.appendChild(script);
+        };
+        var lang = self.lang(name + '.'),
+            html = '<div style="padding:10px 20px;">' +
+                '<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+                '<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>' +
+                '</div>',
+            dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var str = doc.body.innerHTML;
+                        str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags);
+                        if (typeof self.wordImageServer !== 'undefined' && self.wordImageServer) {
+                            var i = 0;
+                            var arr = [];
+                            var replacedStr = str.replace(/file:\/\/+(localhost)?(\S+\.(png|jpg|jpeg|gif|bmp))/ig, function (value) {
+                                arr[i] = value;
+                                var replaced = "##" + i + "##";
+                                i++;
+                                return replaced;
+                            });
+                            for (var j = 0; j < arr.length; j++) {
+                                jsonp("http://" + self.wordImageServer + "/word?index=" + j + "&file=" + encodeURIComponent(arr[j]), function (data) {
+                                    K.uploadwordimage.call(self, data.index, data.info);
+                                });
+                            }
+                            str = replacedStr;
+                        }
+                        self.insertHtml(str).hideDialog().focus();
+                    }
+                }
+            }),
+            div = dialog.div,
+            iframe = K('iframe', div),
+            doc = K.iframeDoc(iframe);
+        if (!K.IE) {
+            doc.designMode = 'on';
+        }
+        doc.open();
+        doc.write('<!doctype html><html><head><title>WordPaste</title></head>');
+        doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');
+        if (!K.IE) {
+            doc.write('<br />');
+        }
+        doc.write('</body></html>');
+        doc.close();
+        if (K.IE) {
+            doc.body.contentEditable = 'true';
+        }
+        iframe[0].contentWindow.focus();
+    });
+});
diff --git a/addons/nkeditor/assets/themes/app.css b/addons/nkeditor/assets/themes/app.css
new file mode 100644
index 0000000..baba45f
--- /dev/null
+++ b/addons/nkeditor/assets/themes/app.css
@@ -0,0 +1,96 @@
+/* 引用样式 */
+blockquote {
+    padding: 20px;
+    margin: 20px 0;
+    border: 1px solid #eee;
+    border-left-width: 5px;
+    border-left-color: #ce4844;
+    border-radius: 3px;
+}
+
+blockquote, q {
+    quotes: none;
+}
+
+/* 表格样式 */
+table {
+    border-spacing: 0;
+    border-collapse: collapse;
+}
+
+td,
+th {
+    padding: 0;
+}
+
+.table {
+    border-collapse: collapse !important;
+}
+
+.table td,
+.table th {
+    background-color: #fff !important;
+    border: 1px solid #ddd;
+}
+
+.table-bordered th,
+.table-bordered td {
+    border: 1px solid #ddd !important;
+}
+
+.table {
+    width: 100%;
+    max-width: 100%;
+    margin-bottom: 20px;
+}
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+    padding: 8px;
+    line-height: 1.42857143;
+    vertical-align: top;
+    border-top: 1px solid #ddd;
+}
+
+.table > thead > tr > th {
+    vertical-align: bottom;
+    border-bottom: 2px solid #ddd;
+}
+
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+    border-top: 0;
+}
+
+.table > tbody + tbody {
+    border-top: 2px solid #ddd;
+}
+
+.table .table {
+    background-color: #fff;
+}
+
+table col[class*="col-"] {
+    position: static;
+    display: table-column;
+    float: none;
+}
+
+table td[class*="col-"],
+table th[class*="col-"] {
+    position: static;
+    display: table-cell;
+    float: none;
+}
+
+.ke-content img {
+    max-width: 100%;
+}
diff --git a/addons/nkeditor/assets/themes/black/editor.css b/addons/nkeditor/assets/themes/black/editor.css
new file mode 100644
index 0000000..a84525c
--- /dev/null
+++ b/addons/nkeditor/assets/themes/black/editor.css
@@ -0,0 +1,822 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+.ke-container-black .ke-toolbar {
+  border-top: 5px solid #222222;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  background-clip: padding-box;
+  text-rendering: optimizelegibility; }
+  .ke-container-black .ke-toolbar .ke-toolbar-icon {
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-container-black .ke-toolbar .ke-icon-source {
+    background-position: 0 0px; }
+  .ke-container-black .ke-toolbar .ke-icon-preview {
+    background-position: 0 -63px; }
+  .ke-container-black .ke-toolbar .ke-icon-print {
+    background-position: 0 -84px; }
+  .ke-container-black .ke-toolbar .ke-icon-undo {
+    background-position: 0 -21px; }
+  .ke-container-black .ke-toolbar .ke-icon-redo {
+    background-position: 0 -42px; }
+  .ke-container-black .ke-toolbar .ke-icon-template {
+    background-position: 0 -105px; }
+  .ke-container-black .ke-toolbar .ke-icon-cut {
+    background-position: 0 -147px; }
+  .ke-container-black .ke-toolbar .ke-icon-copy {
+    background-position: 0 -168px; }
+  .ke-container-black .ke-toolbar .ke-icon-paste {
+    background-position: 0 -189px; }
+  .ke-container-black .ke-toolbar .ke-icon-selectall {
+    background-position: 0 -483px; }
+  .ke-container-black .ke-toolbar .ke-icon-justifyleft {
+    background-position: 0 -252px; }
+  .ke-container-black .ke-toolbar .ke-icon-justifycenter {
+    background-position: 0 -273px; }
+  .ke-container-black .ke-toolbar .ke-icon-justifyright {
+    background-position: 0 -294px; }
+  .ke-container-black .ke-toolbar .ke-icon-justifyfull {
+    background-position: 0 -315px; }
+  .ke-container-black .ke-toolbar .ke-icon-insertorderedlist {
+    background-position: 0 -336px; }
+  .ke-container-black .ke-toolbar .ke-icon-insertunorderedlist {
+    background-position: 0 -357px; }
+  .ke-container-black .ke-toolbar .ke-icon-indent {
+    background-position: 0 -378px; }
+  .ke-container-black .ke-toolbar .ke-icon-outdent {
+    background-position: 0 -399px; }
+  .ke-container-black .ke-toolbar .ke-icon-subscript {
+    background-position: 0 -420px; }
+  .ke-container-black .ke-toolbar .ke-icon-superscript {
+    background-position: 0 -441px; }
+  .ke-container-black .ke-toolbar .ke-icon-date {
+    background-position: 0px -304px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-time {
+    background-position: 0px -320px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-formatblock {
+    background-position: 0 -546px; }
+  .ke-container-black .ke-toolbar .ke-icon-fontname {
+    background-position: 0 -567px; }
+  .ke-container-black .ke-toolbar .ke-icon-fontsize {
+    background-position: 0 -588px; }
+  .ke-container-black .ke-toolbar .ke-icon-forecolor {
+    background-position: 0 -609px; }
+  .ke-container-black .ke-toolbar .ke-icon-hilitecolor {
+    background-position: 0 -630px; }
+  .ke-container-black .ke-toolbar .ke-icon-bold {
+    background-position: 0 -651px; }
+  .ke-container-black .ke-toolbar .ke-icon-italic {
+    background-position: 0 -672px; }
+  .ke-container-black .ke-toolbar .ke-icon-underline {
+    background-position: 0 -693px; }
+  .ke-container-black .ke-toolbar .ke-icon-strikethrough {
+    background-position: 0 -714px; }
+  .ke-container-black .ke-toolbar .ke-icon-removeformat {
+    background-position: 0 -756px; }
+  .ke-container-black .ke-toolbar .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-container-black .ke-toolbar .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-container-black .ke-toolbar .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-container-black .ke-toolbar .ke-icon-div {
+    background-position: 0px -544px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-formula {
+    background-position: 0px -576px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-hr {
+    background-position: 0 -924px; }
+  .ke-container-black .ke-toolbar .ke-icon-emoticons {
+    background-position: 0 -945px; }
+  .ke-container-black .ke-toolbar .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-container-black .ke-toolbar .ke-icon-unlink {
+    background-position: 0 -1029px; }
+  .ke-container-black .ke-toolbar .ke-icon-fullscreen {
+    background-position: 0 -525px; }
+  .ke-container-black .ke-toolbar .ke-icon-about {
+    background-position: 0 -1092px; }
+  .ke-container-black .ke-toolbar .ke-icon-quote {
+    background-position: 0 -1114px; }
+  .ke-container-black .ke-toolbar .ke-icon-plainpaste {
+    background-position: 0 -210px; }
+  .ke-container-black .ke-toolbar .ke-icon-wordpaste {
+    background-position: 0 -231px; }
+  .ke-container-black .ke-toolbar .ke-icon-table {
+    background-position: 0px -903px;
+    width: 18px !important; }
+  .ke-container-black .ke-toolbar .ke-icon-tablemenu {
+    background-position: 0px -768px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-code {
+    background-position: 0 -126px; }
+  .ke-container-black .ke-toolbar .ke-icon-map {
+    background-position: 0px -976px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-baidumap {
+    background-position: 0 -1050px; }
+  .ke-container-black .ke-toolbar .ke-icon-lineheight {
+    background-position: 0 -735px; }
+  .ke-container-black .ke-toolbar .ke-icon-clearhtml {
+    background-position: 0 -462px; }
+  .ke-container-black .ke-toolbar .ke-icon-pagebreak {
+    background-position: 0 -966px; }
+  .ke-container-black .ke-toolbar .ke-icon-insertfile {
+    background-position: 0 -882px; }
+  .ke-container-black .ke-toolbar .ke-icon-quickformat {
+    background-position: 0 -504px; }
+  .ke-container-black .ke-toolbar .ke-icon-anchor {
+    background-position: 0 -987px; }
+  .ke-container-black .ke-toolbar .ke-icon-search {
+    background-position: 0px -1184px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-new {
+    background-position: 0px -1200px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-specialchar {
+    background-position: 0px -1216px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-multiimage {
+    background-position: 0 -798px; }
+  .ke-container-black .ke-toolbar .ke-icon-graft {
+    background-position: 0 -819px; }
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-black .ke-menu-item .ke-menu-item-left {
+  width: 27px;
+  text-align: center;
+  overflow: hidden; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert {
+    background-position: 0 -903px;
+    width: 18px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete {
+    background-position: 0 -1428px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft {
+    background-position: 0 -1176px;
+    width: 18px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright {
+    background-position: 0 -1323px;
+    width: 18px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove {
+    background-position: 0 -1302px;
+    width: 22px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow {
+    background-position: 0 -1155px;
+    width: 22px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete {
+    background-position: 0 -1239px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete {
+    background-position: 0 -1260px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop {
+    background-position: 0 -1218px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tableprop {
+    background-position: 0 -1134px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit {
+    background-position: 0px -1088px;
+    width: 16px;
+    height: 16px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge {
+    background-position: -1px -1197px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge {
+    background-position: -4px -1365px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-checked {
+    background-position: 0 -1407px; }
+
+/*# sourceMappingURL=editor.css.map */
diff --git a/addons/nkeditor/assets/themes/black/editor.css.map b/addons/nkeditor/assets/themes/black/editor.css.map
new file mode 100644
index 0000000..6d1b06d
--- /dev/null
+++ b/addons/nkeditor/assets/themes/black/editor.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../common/common.scss","editor.scss"],
+"names": [],
+"file": "editor.css"
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/black/editor.min.css b/addons/nkeditor/assets/themes/black/editor.min.css
new file mode 100644
index 0000000..f5d26e0
--- /dev/null
+++ b/addons/nkeditor/assets/themes/black/editor.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ke-clearfix{zoom:1;clear:both}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-dialog-lock{background-color:#fff;opacity:.5;z-index:811213;left:0;top:0;position:absolute}.ke-container{display:block;background-color:#fff;overflow:hidden;margin:0;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16)}.ke-container .ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-container .ke-dialog a,.ke-container .ke-dialog a:hover,.ke-container .ke-menu a,.ke-container .ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-container .ke-toolbar{text-align:left;overflow:hidden;zoom:1;padding:0 5px}.ke-container .ke-toolbar .ke-outline{padding:10px 5px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-container .ke-toolbar .ke-outline .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px}.ke-container .ke-toolbar .ke-on{background:#ebebeb}.ke-container .ke-toolbar .ke-selected{background-color:#ebebeb}.ke-container .ke-toolbar .ke-disabled{cursor:default}.ke-container .ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-container .ke-toolbar .ke-hr{clear:both;height:1px;width:calc(100% - (2 * 2px));background:#ebebeb}.ke-container .ke-edit{padding:0}.ke-container .ke-edit .ke-edit-iframe,.ke-container .ke-edit .ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-container .ke-edit .ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-container .ke-edit .ke-edit-textarea:focus{outline:0}.ke-container .ke-statusbar{position:relative;background-color:#f5f5f5;border-top:1px solid #e1e1e1;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize;display:none}.ke-container .ke-statusbar .ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px}.ke-container .ke-statusbar .ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;width:11px;height:11px}.ke-menu{border:1px solid #ccc;background-color:#f5f5f5;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu .ke-menu-item .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-inline-block .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu .ke-menu-item .ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu .ke-menu-item .ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #e1e1e1;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-menu .ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons{position:relative}.ke-menu .ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img{border:0;margin:0;padding:0}.ke-menu .ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell{margin:0;padding:1px;border:1px solid #f5f5f5;cursor:pointer}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-menu .ke-plugin-emoticons .ke-table .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker .ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f1f1f1;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-dialog{margin:0;padding:0;border:1px solid #ccc;zoom:1;box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden}.ke-dialog .ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom:1px solid #c6c6c6;background:transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.ke-dialog .ke-dialog-header .ke-dialog-icon-close{height:20px;width:20px;cursor:pointer;background:url(../common/icons-all.gif) 0 -59px;position:absolute;right:5px;top:4px}.ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover{background-position:0 -89px}.ke-dialog .ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border:1px solid #ccc}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus{border-color:#66afe9;outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto;border:1px solid #ccc;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number{width:50px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox{position:relative;top:6px}.ke-dialog .ke-dialog-content .ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus{outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text{display:inline-block!important;max-width:400px;height:30px;line-height:30px;border:1px solid #ccc;font-size:14px;margin:0;outline:0;padding:0 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus{border-color:#66afe9}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color{border:1px solid #e1e1e1;background-color:#fff;font-size:12px;width:60px;height:30px;line-height:30px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0;top:-1px;position:relative}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:62px;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common{top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button{padding:8px 15px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner{padding:10px 20px 0 20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row{border:1px solid #fff;margin-bottom:10px;overflow:hidden}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left{float:left;height:30px;line-height:30px;width:60px;text-align:right}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right{float:left;text-align:left}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button{position:relative;top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label{cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header{height:30px;line-height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text{height:22px;line-height:22px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button{padding:3px 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox{margin-left:10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #e1e1e1;margin-bottom:20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul{list-style:none outside none;margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected{background-color:#fff;border:1px solid #e1e1e1;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on{background-color:#fff;color:#000}.ke-dialog .ke-dialog-content .ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat center;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog .ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;height:40px}.ke-dialog .ke-dialog-footer .ke-dialog-yes{margin:5px}.ke-dialog .ke-dialog-footer .ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog .ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-dialog .ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:7px 10px;margin-top:-4px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-dialog .ke-button:hover{border:1px solid #e1e1e1;background-color:#e1e1e1}.ke-dialog .ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog .ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-container-black .ke-toolbar{border-top:5px solid #222;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);background-clip:padding-box;text-rendering:optimizelegibility}.ke-container-black .ke-toolbar .ke-toolbar-icon{background:url(images/nkeditor.svg) no-repeat}.ke-container-black .ke-toolbar .ke-icon-source{background-position:0 0}.ke-container-black .ke-toolbar .ke-icon-preview{background-position:0 -63px}.ke-container-black .ke-toolbar .ke-icon-print{background-position:0 -84px}.ke-container-black .ke-toolbar .ke-icon-undo{background-position:0 -21px}.ke-container-black .ke-toolbar .ke-icon-redo{background-position:0 -42px}.ke-container-black .ke-toolbar .ke-icon-template{background-position:0 -105px}.ke-container-black .ke-toolbar .ke-icon-cut{background-position:0 -147px}.ke-container-black .ke-toolbar .ke-icon-copy{background-position:0 -168px}.ke-container-black .ke-toolbar .ke-icon-paste{background-position:0 -189px}.ke-container-black .ke-toolbar .ke-icon-selectall{background-position:0 -483px}.ke-container-black .ke-toolbar .ke-icon-justifyleft{background-position:0 -252px}.ke-container-black .ke-toolbar .ke-icon-justifycenter{background-position:0 -273px}.ke-container-black .ke-toolbar .ke-icon-justifyright{background-position:0 -294px}.ke-container-black .ke-toolbar .ke-icon-justifyfull{background-position:0 -315px}.ke-container-black .ke-toolbar .ke-icon-insertorderedlist{background-position:0 -336px}.ke-container-black .ke-toolbar .ke-icon-insertunorderedlist{background-position:0 -357px}.ke-container-black .ke-toolbar .ke-icon-indent{background-position:0 -378px}.ke-container-black .ke-toolbar .ke-icon-outdent{background-position:0 -399px}.ke-container-black .ke-toolbar .ke-icon-subscript{background-position:0 -420px}.ke-container-black .ke-toolbar .ke-icon-superscript{background-position:0 -441px}.ke-container-black .ke-toolbar .ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-container-black .ke-toolbar .ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-container-black .ke-toolbar .ke-icon-formatblock{background-position:0 -546px}.ke-container-black .ke-toolbar .ke-icon-fontname{background-position:0 -567px}.ke-container-black .ke-toolbar .ke-icon-fontsize{background-position:0 -588px}.ke-container-black .ke-toolbar .ke-icon-forecolor{background-position:0 -609px}.ke-container-black .ke-toolbar .ke-icon-hilitecolor{background-position:0 -630px}.ke-container-black .ke-toolbar .ke-icon-bold{background-position:0 -651px}.ke-container-black .ke-toolbar .ke-icon-italic{background-position:0 -672px}.ke-container-black .ke-toolbar .ke-icon-underline{background-position:0 -693px}.ke-container-black .ke-toolbar .ke-icon-strikethrough{background-position:0 -714px}.ke-container-black .ke-toolbar .ke-icon-removeformat{background-position:0 -756px}.ke-container-black .ke-toolbar .ke-icon-image{background-position:0 -777px}.ke-container-black .ke-toolbar .ke-icon-flash{background-position:0 -840px}.ke-container-black .ke-toolbar .ke-icon-media{background-position:0 -861px}.ke-container-black .ke-toolbar .ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-hr{background-position:0 -924px}.ke-container-black .ke-toolbar .ke-icon-emoticons{background-position:0 -945px}.ke-container-black .ke-toolbar .ke-icon-link{background-position:0 -1008px}.ke-container-black .ke-toolbar .ke-icon-unlink{background-position:0 -1029px}.ke-container-black .ke-toolbar .ke-icon-fullscreen{background-position:0 -525px}.ke-container-black .ke-toolbar .ke-icon-about{background-position:0 -1092px}.ke-container-black .ke-toolbar .ke-icon-quote{background-position:0 -1114px}.ke-container-black .ke-toolbar .ke-icon-plainpaste{background-position:0 -210px}.ke-container-black .ke-toolbar .ke-icon-wordpaste{background-position:0 -231px}.ke-container-black .ke-toolbar .ke-icon-table{background-position:0 -903px;width:18px!important}.ke-container-black .ke-toolbar .ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-code{background-position:0 -126px}.ke-container-black .ke-toolbar .ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-baidumap{background-position:0 -1050px}.ke-container-black .ke-toolbar .ke-icon-lineheight{background-position:0 -735px}.ke-container-black .ke-toolbar .ke-icon-clearhtml{background-position:0 -462px}.ke-container-black .ke-toolbar .ke-icon-pagebreak{background-position:0 -966px}.ke-container-black .ke-toolbar .ke-icon-insertfile{background-position:0 -882px}.ke-container-black .ke-toolbar .ke-icon-quickformat{background-position:0 -504px}.ke-container-black .ke-toolbar .ke-icon-anchor{background-position:0 -987px}.ke-container-black .ke-toolbar .ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-multiimage{background-position:0 -798px}.ke-container-black .ke-toolbar .ke-icon-graft{background-position:0 -819px}.ke-menu-black .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px;background:url(images/nkeditor.svg) no-repeat}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert{background-position:0 -903px;width:18px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete{background-position:0 -1428px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft{background-position:0 -1176px;width:18px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright{background-position:0 -1323px;width:18px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove{background-position:0 -1302px;width:22px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow{background-position:0 -1155px;width:22px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete{background-position:0 -1239px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete{background-position:0 -1260px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop{background-position:0 -1218px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tableprop{background-position:0 -1134px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge{background-position:-1px -1197px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit{background-position:0 -1344px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge{background-position:-4px -1365px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit{background-position:0 -1344px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-image{background-position:0 -777px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-flash{background-position:0 -840px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-media{background-position:0 -861px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-link{background-position:0 -1008px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-checked{background-position:0 -1407px}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/black/editor.scss b/addons/nkeditor/assets/themes/black/editor.scss
new file mode 100644
index 0000000..3148e8c
--- /dev/null
+++ b/addons/nkeditor/assets/themes/black/editor.scss
@@ -0,0 +1,387 @@
+@import "../common/common";
+
+.ke-container-black {
+    .ke-toolbar {
+
+        border-top: 5px solid #222222;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+        background-clip: padding-box;
+        text-rendering: optimizelegibility;
+
+        .ke-toolbar-icon {
+            *background-image: url(images/nkeditor.png);
+            background: url(images/nkeditor.svg) no-repeat;
+        }
+
+        .ke-icon-source {
+            background-position: 0 0px;
+        }
+        .ke-icon-preview {
+            background-position: 0 -63px;
+        }
+        .ke-icon-print {
+            background-position: 0 -84px;
+        }
+        .ke-icon-undo {
+            background-position: 0 -21px;
+        }
+
+        .ke-icon-redo {
+            background-position: 0 -42px;
+        }
+
+        .ke-icon-template {
+            background-position: 0 -105px;
+        }
+
+        .ke-icon-cut {
+            background-position: 0 -147px;
+        }
+
+        .ke-icon-copy {
+            background-position: 0 -168px;
+        }
+
+        .ke-icon-paste {
+            background-position: 0 -189px;
+        }
+
+        .ke-icon-selectall {
+            background-position: 0 -483px;
+        }
+
+        .ke-icon-justifyleft {
+            background-position: 0 -252px;
+        }
+
+        .ke-icon-justifycenter {
+            background-position: 0 -273px;
+        }
+
+        .ke-icon-justifyright {
+            background-position: 0 -294px;
+        }
+
+        .ke-icon-justifyfull {
+            background-position: 0 -315px;
+        }
+
+        .ke-icon-insertorderedlist {
+            background-position: 0 -336px;
+        }
+
+        .ke-icon-insertunorderedlist {
+            background-position: 0 -357px;
+        }
+
+        .ke-icon-indent {
+            background-position: 0 -378px;
+        }
+
+        .ke-icon-outdent {
+            background-position: 0 -399px;
+        }
+
+        .ke-icon-subscript {
+            background-position: 0 -420px;
+        }
+
+        .ke-icon-superscript {
+            background-position: 0 -441px;
+        }
+
+        .ke-icon-date {
+            background-position: 0px -304px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-time {
+            background-position: 0px -320px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-formatblock {
+            background-position: 0 -546px;
+        }
+
+        .ke-icon-fontname {
+            background-position: 0 -567px;
+        }
+
+        .ke-icon-fontsize {
+            background-position: 0 -588px;
+        }
+
+        .ke-icon-forecolor {
+            background-position: 0 -609px;
+        }
+
+        .ke-icon-hilitecolor {
+            background-position: 0 -630px;
+        }
+
+        .ke-icon-bold {
+            background-position: 0 -651px;
+        }
+
+        .ke-icon-italic {
+            background-position: 0 -672px;
+        }
+
+        .ke-icon-underline {
+            background-position: 0 -693px;
+        }
+
+        .ke-icon-strikethrough {
+            background-position: 0 -714px;
+        }
+
+        .ke-icon-removeformat {
+            background-position: 0 -756px;
+        }
+
+        .ke-icon-image {
+            background-position: 0 -777px;
+        }
+
+        .ke-icon-flash {
+            background-position: 0 -840px;
+        }
+
+        .ke-icon-media {
+            background-position: 0 -861px;
+        }
+
+        .ke-icon-div {
+            background-position: 0px -544px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-formula {
+            background-position: 0px -576px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-hr {
+            background-position: 0 -924px;
+        }
+
+        .ke-icon-emoticons {
+            background-position: 0 -945px;
+        }
+
+        .ke-icon-link {
+            background-position: 0 -1008px;
+        }
+
+        .ke-icon-unlink {
+            background-position: 0 -1029px;
+        }
+
+        .ke-icon-fullscreen {
+            background-position: 0 -525px;
+        }
+
+        .ke-icon-about {
+            background-position: 0 -1092px;
+        }
+
+        .ke-icon-quote {
+            background-position: 0 -1114px;
+        }
+
+        .ke-icon-plainpaste {
+            background-position: 0 -210px;
+        }
+
+        .ke-icon-wordpaste {
+            background-position: 0 -231px;
+        }
+
+        .ke-icon-table {
+            background-position: 0px -903px;
+            width: 18px !important;
+        }
+
+        .ke-icon-tablemenu {
+            background-position: 0px -768px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-code {
+            background-position: 0 -126px;
+        }
+
+        .ke-icon-map {
+            background-position: 0px -976px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-baidumap {
+            background-position: 0 -1050px;
+        }
+
+        .ke-icon-lineheight {
+            background-position: 0 -735px;
+        }
+
+        .ke-icon-clearhtml {
+            background-position: 0 -462px;
+        }
+
+        .ke-icon-pagebreak {
+            background-position: 0 -966px;
+        }
+
+        .ke-icon-insertfile {
+            background-position: 0 -882px;
+        }
+
+        .ke-icon-quickformat {
+            background-position: 0 -504px;
+        }
+
+        .ke-icon-anchor {
+            background-position: 0 -987px;
+        }
+
+        .ke-icon-search {
+            background-position: 0px -1184px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-new {
+            background-position: 0px -1200px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-specialchar {
+            background-position: 0px -1216px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-multiimage {
+            background-position: 0 -798px;
+        }
+
+        .ke-icon-graft {
+            background-position: 0 -819px;
+        }
+    }
+}
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-black {
+
+    .ke-menu-item {
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+                *background-image: url(images/nkeditor.png);
+                background: url(images/nkeditor.svg) no-repeat;
+            }
+
+            .ke-icon-tableinsert {
+                background-position: 0 -903px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tabledelete {
+                background-position: 0 -1428px;
+            }
+
+            .ke-icon-tablecolinsertleft {
+                background-position: 0 -1176px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablecolinsertright {
+                background-position: 0 -1323px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablerowinsertabove {
+                background-position: 0 -1302px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablerowinsertbelow {
+                background-position: 0 -1155px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablecoldelete {
+                background-position: 0 -1239px;
+            }
+
+            .ke-icon-tablerowdelete {
+                background-position: 0 -1260px;
+            }
+
+            .ke-icon-tablecellprop {
+                background-position: 0 -1218px;
+            }
+
+            .ke-icon-tableprop {
+                background-position: 0 -1134px;
+            }
+            .ke-icon-tablecellsplit {
+                background-position: 0px -1088px;
+                width: 16px;
+                height: 16px;
+            }
+
+            .ke-icon-tablerowmerge {
+                background-position: -1px -1197px;
+            }
+
+            .ke-icon-tablerowsplit {
+                background-position: 0 -1344px;
+            }
+
+            .ke-icon-tablecolmerge {
+                background-position: -4px -1365px;
+            }
+
+            .ke-icon-tablecolsplit {
+                background-position: 0 -1344px;
+            }
+
+            //图片,视频右键菜单
+            .ke-icon-image {
+                background-position: 0 -777px;
+            }
+            .ke-icon-flash {
+                background-position: 0 -840px;
+            }
+            .ke-icon-media {
+                background-position: 0 -861px;
+            }
+            .ke-icon-link {
+                background-position: 0 -1008px;
+            }
+
+            .ke-icon-checked {
+                background-position: 0 -1407px;
+            }
+
+        }
+    }
+}
+//menu end
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/black/images/nkeditor.png b/addons/nkeditor/assets/themes/black/images/nkeditor.png
new file mode 100644
index 0000000..f3fbea2
Binary files /dev/null and b/addons/nkeditor/assets/themes/black/images/nkeditor.png differ
diff --git a/addons/nkeditor/assets/themes/black/images/nkeditor.svg b/addons/nkeditor/assets/themes/black/images/nkeditor.svg
new file mode 100644
index 0000000..56416dd
--- /dev/null
+++ b/addons/nkeditor/assets/themes/black/images/nkeditor.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="1549" viewBox="0 0 21 1549">
+<svg id="icon-source-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="0">
+<path fill="#333" d="M14.4 16h-12.8c-0.884 0-1.6-0.716-1.6-1.6v-12.8c0-0.884 0.716-1.6 1.6-1.6h12.8c0.884 0 1.6 0.716 1.6 1.6v12.8c0 0.884-0.716 1.6-1.6 1.6zM14.4 2.4h-12.8v12h12.8v-12zM6.4 5.6l-2.4 3.2 2.4 2.4-0.8 0.8-3.2-3.2 3.2-4 0.8 0.8zM9.6 4l-1.6 8.8h-1.6l1.6-8.8h1.6zM10.4 4.8l3.2 4-3.2 3.2-0.8-0.8 2.4-2.4-2.4-3.2 0.8-0.8z"></path>
+</svg>
+<svg id="icon-undo" width="16" height="16" viewBox="0 0 16 16" x="0" y="21">
+<path fill="#333" d="M12.161 16c1.777-3.219 2.076-8.13-4.904-7.966v3.966l-6-6 6-6v3.881c8.359-0.218 9.29 7.378 4.904 12.119z"></path>
+</svg>
+<svg id="icon-redo" width="16" height="16" viewBox="0 0 16 16" x="0" y="42">
+<path fill="#333" d="M9 3.881v-3.881l6 6-6 6v-3.966c-6.981-0.164-6.681 4.747-4.904 7.966-4.386-4.741-3.454-12.337 4.904-12.119z"></path>
+</svg>
+<svg id="icon-preview" width="16" height="16" viewBox="0 0 16 16" x="0" y="63">
+<path fill="#333" d="M11.566 10.552c1.261-1.733 1.095-4.134-0.425-5.645-0.827-0.827-1.922-1.275-3.089-1.275-1.166 0-2.261 0.456-3.089 1.275-0.811 0.827-1.269 1.922-1.269 3.086s0.456 2.259 1.277 3.086c0.827 0.827 1.922 1.275 3.089 1.275 0.922 0 1.805-0.291 2.561-0.85l2.269 2.259c0.127 0.127 0.292 0.197 0.473 0.197s0.347-0.070 0.473-0.197c0.259-0.259 0.259-0.684 0-0.945l-2.27-2.266zM5.916 10.134c-1.181-1.181-1.181-3.094 0-4.275 0.575-0.575 1.331-0.881 2.142-0.881s1.567 0.316 2.142 0.881c1.181 1.181 1.181 3.094 0 4.275-1.141 1.133-3.142 1.133-4.284 0z"></path>
+<path fill="#333" d="M11.431 1h-6.855c-1.969 0-3.577 1.598-3.577 3.575v6.85c0 1.969 1.6 3.575 3.577 3.575h3.719c0.37 0 0.67-0.298 0.67-0.669s-0.3-0.669-0.67-0.669h-3.719c-1.23 0-2.23-1-2.23-2.228v-6.852c0-1.228 1-2.228 2.23-2.228h6.855c1.23 0 2.23 1 2.23 2.228v3.645c0 0.37 0.3 0.669 0.67 0.669s0.67-0.298 0.67-0.669v-3.661c-0.002-1.969-1.602-3.567-3.57-3.567z"></path>
+</svg>
+<svg id="icon-print" width="16" height="16" viewBox="0 0 16 16" x="0" y="84">
+<path fill="#333" d="M4.98 14.938h5.967c0.548 0 0.975-0.461 0.975-1.011v-2.973h-7.922v2.973c0 0.55 0.431 1.011 0.98 1.011zM10.947 1.016h-5.967c-0.548 0-0.98 0.428-0.98 0.978v2.959h7.922v-2.959c0-0.55-0.427-0.978-0.975-0.978z"></path>
+<path fill="#333" d="M12.922 4.953v1.016h-9.922v-1.016h-1.003c-0.55 0-0.981 0.469-0.981 1.019v6.961c0 0.55 0.431 1.005 0.981 1.005h1.003v-3.984h9.922v3.984h1.008c0.548 0 1.008-0.455 1.008-1.005v-6.961c0-0.55-0.458-1.019-1.008-1.019h-1.008zM12.922 7.984h-2.969v-1.016h2.969v1.016z"></path>
+</svg>
+<svg id="icon-template" width="16" height="16" viewBox="0 0 16 16" x="0" y="105">
+<path fill="#333" d="M8.824 4.504h-8.504v8.536h8.504v-8.536zM6.632 10.84h-0.68v-3.056l-1.056 3.056h-0.608l-1.048-3.104v3.104h-0.68v-4.28h0.952l0.992 2.976c0.048 0.144 0.088 0.264 0.12 0.376 0.040-0.12 0.088-0.264 0.144-0.424l1-2.92h0.872v4.272zM14.88 2.84l-2.024-2.032c-0.44-0.44-1.312-0.808-1.936-0.808h-6.8c-0.624 0-1.136 0.512-1.136 1.136v2.296h0.904v-2.296c0-0.12 0.104-0.224 0.224-0.224h6.8c0.064 0 0.144 0.008 0.224 0.024v3.616h3.6c0.016 0.080 0.024 0.528 0.024 0.6v9.712c0 0.12-0.104 0.224-0.224 0.224h-10.432c-0.12 0-0.224-0.104-0.224-0.224v-0.76h-0.904v0.76c0 0.624 0.512 1.136 1.136 1.136h10.432c0.624 0 1.136-0.512 1.136-1.136v-9.712c0-0.624-0.36-1.872-0.8-2.312zM12.056 3.64v-2.328c0.064 0.040 0.112 0.088 0.16 0.136l2.024 2.032c0.048 0.048 0.088 0.096 0.136 0.16h-2.32zM9.864 9.6h3.72v-1.064h-3.72v1.064zM9.864 11.736h3.72v-1.064h-3.72v1.064zM13.584 6.4h-3.72v1.064h3.72v-1.064z"></path>
+</svg>
+<svg id="icon-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="126">
+<path fill="#333" d="M5.015 3.754l-0.708-0.585c-0.215-0.154-0.462-0.123-0.646 0.062l-3.569 4.492c-0.123 0.154-0.123 0.4 0 0.585l3.6 4.462c0.154 0.185 0.431 0.246 0.646 0.062l0.708-0.585c0.215-0.154 0.246-0.462 0.062-0.646l-2.892-3.6 2.923-3.6c0.123-0.185 0.092-0.462-0.123-0.646zM15.908 7.723l-3.6-4.462c-0.154-0.185-0.431-0.246-0.646-0.062l-0.708 0.585c-0.215 0.154-0.246 0.462-0.062 0.646l2.923 3.6-2.923 3.6c-0.154 0.185-0.123 0.492 0.062 0.646l0.708 0.585c0.215 0.154 0.462 0.123 0.646-0.062l3.6-4.492c0.123-0.215 0.123-0.431 0-0.585zM9.723 3.323l-0.923-0.215c-0.246-0.062-0.523 0.092-0.585 0.338l-2.277 8.738c-0.062 0.246 0.092 0.492 0.338 0.554l0.923 0.215c0.246 0.062 0.523-0.092 0.585-0.338l2.277-8.738c0.062-0.277-0.092-0.492-0.338-0.554z"></path>
+</svg>
+<svg id="icon-crop" width="16" height="16" viewBox="0 0 16 16" x="0" y="147">
+<path fill="#333" d="M13.585 0.288c1.548 1.972 0.581 3.752 0.581 3.752l-6.049 7.649s-4.161-4.761-5.855-7.12c-1.693-2.356 0.099-4.569 0.099-4.569l5.757 7.312 5.467-7.023zM8.074 10.223c0.469 0 0.846-0.378 0.846-0.842 0-0.224-0.090-0.439-0.249-0.597s-0.374-0.246-0.598-0.246c-0.467 0-0.848 0.377-0.848 0.842s0.381 0.842 0.848 0.842zM11.641 10.395c0.746-0.002 1.462 0.292 1.989 0.818s0.827 1.24 0.829 1.985c-0.002 0.746-0.3 1.459-0.829 1.985s-1.244 0.819-1.989 0.817c-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.3-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM11.641 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001zM4.575 10.395c0.746-0.002 1.461 0.292 1.989 0.818s0.826 1.24 0.829 1.985c-0.005 1.552-1.266 2.807-2.818 2.802-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.299-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM4.575 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001z"></path>
+</svg>
+<svg id="icon-copy" width="16" height="16" viewBox="0 0 16 16" x="0" y="168">
+<path fill="#333" d="M3 10h7v1h-7v-1z"></path>
+<path fill="#333" d="M3 8h7v1h-7v-1z"></path>
+<path fill="#333" d="M3 12h4v1h-4v-1z"></path>
+<path fill="#333" d="M14 0h-9c-1.1 0-2 0.9-2 2h1c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9c0 0.6-0.4 1-1 1v1c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2z"></path>
+<path fill="#333" d="M3 6h7v1h-7v-1z"></path>
+<path fill="#333" d="M11 3h-9c-1.1 0-2 0.9-2 2v9c0 1.1 0.9 2 2 2h9c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2zM12 14c0 0.6-0.4 1-1 1h-9c-0.6 0-1-0.4-1-1v-9c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9z"></path>
+</svg>
+<svg id="icon-paste" width="16" height="16" viewBox="0 0 16 16" x="0" y="189">
+<path fill="#333" d="M13.644 7h-5.288c-1.298 0-2.356 1.056-2.356 2.356v4.288c0 1.298 1.056 2.356 2.356 2.356h5.289c1.298 0 2.356-1.056 2.356-2.356v-4.289c-0.002-1.298-1.058-2.355-2.358-2.355zM15 13.644c0 0.747-0.608 1.356-1.356 1.356h-5.288c-0.747 0-1.356-0.608-1.356-1.356v-4.289c0-0.747 0.608-1.356 1.356-1.356h5.289c0.747 0 1.356 0.608 1.356 1.356v4.289h-0.002z"></path>
+<path fill="#333" d="M4.453 13h-2.434c-0.561 0-1.019-0.456-1.019-1.019v-9.963c0-0.561 0.456-1.019 1.019-1.019h8.962c0.561 0 1.019 0.456 1.019 1.019v3.497c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-3.497c0-1.112-0.906-2.019-2.019-2.019h-8.963c-1.112 0-2.019 0.905-2.019 2.019v9.962c0 1.113 0.906 2.019 2.019 2.019h2.434c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+<path fill="#333" d="M10.5 3h-8c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h8c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM5.5 6h-3c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h3c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM4.5 9h-2c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h2c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+</svg>
+<svg id="icon-paste-text" width="16" height="16" viewBox="0 0 16 16" x="0" y="210">
+<path fill="#333" d="M10.5 2h-2v-1c0-0.551-0.45-1-1-1h-2c-0.549 0-1 0.45-1 1v1h-2v2.278h7.999v-2.278zM7.5 2h-2v-0.998c0.001 0 0.001-0.001 0.002-0.001h1.996c0.001 0 0.001 0.001 0.002 0.001l-0.001 0.998zM8.17 9.529h1.972v3.834h1.005v-3.834h1.967v-1.005h-4.943z"></path>
+<path fill="#333" d="M12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.816h-0.012v1.928h-8.992v-1.743h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.651c0 0.275 0.225 0.5 0.5 0.5h4.772v1.347l9.727 0.001v-10.118h-3zM6.773 14.999v-8.118h7.726l0.003 8.117-7.729 0.001z"></path>
+</svg>
+<svg id="icon-paste-word" width="16" height="16" viewBox="0 0 16 16" x="0" y="231">
+<path fill="#333" d="M13.628 8.819v0.146c-0.195 0.017-0.34 0.154-0.437 0.413l-1.238 3.691h-0.17l-1.044-2.865h-0.024l-1.141 2.865h-0.17l-1.311-3.691c-0.081-0.259-0.227-0.396-0.437-0.413v-0.146h1.821v0.146c-0.275 0.017-0.405 0.105-0.389 0.267 0 0.081 0.016 0.154 0.049 0.219l0.59 1.788 0.718-1.799-0.046-0.257c-0.097-0.13-0.251-0.202-0.461-0.219v-0.146h1.942v0.146c-0.032 0.017-0.057 0.024-0.073 0.024-0.276 0-0.397 0.073-0.364 0.219 0 0.033 0.008 0.105 0.025 0.219 0.016 0.065 0.032 0.105 0.048 0.121l0.572 1.679 0.534-1.806c0.016-0.032 0.084-0.421-0.062-0.432-0.017-0.001-0.033-0.008-0.049-0.024v-0.146h1.117zM10.5 2h-2v-1c0-0.55-0.45-1-1-1h-2c-0.55 0-1 0.45-1 1v1h-2v2.278h8v-2.278zM7.5 2h-2v-0.998l0.002-0.002h1.997c0 0.001 0.002 0.001 0.002 0.002l-0 0.998zM12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.815h-0.011v1.928h-8.992v-1.744h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.652c0 0.275 0.225 0.5 0.5 0.5h4.773v1.348l9.727 0.001v-10.118h-3zM6.773 14.999v-8.117h7.727l0.003 8.117h-7.729z"></path>
+</svg>
+<svg id="icon-left-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="252">
+<path fill="#333" d="M1.148 0h13.704c0.624 0 1.123 0.499 1.123 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.679c-0.649-0.025-1.148-0.524-1.148-1.148 0-0.649 0.499-1.148 1.148-1.148zM1.148 4.568h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 9.136h13.704c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.704c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 13.704h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.649-0.025-1.148-0.524-1.148-1.173 0-0.624 0.499-1.123 1.148-1.123z"></path>
+</svg>
+<svg id="icon-center-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="273">
+<path fill="#333" d="M1.953 3.11q-0.407 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.281h11.719q0.406 0 0.688 0.281t0.281 0.688-0.281 0.696-0.688 0.289h-11.719zM11.719 5.063q0.406 0 0.688 0.282t0.281 0.688-0.281 0.696-0.688 0.289h-7.813q-0.406 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.282h7.813zM13.672 8.953q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-11.719q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h11.719zM11.719 12.86q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-7.813q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h7.813z"></path>
+</svg>
+<svg id="icon-right-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="294">
+<path fill="#333" d="M3.497 10.966c-0.249-0.002-0.529-0.062-0.737-0.19-0.382-0.234-0.488-0.667-0.349-1.095 0.142-0.437 0.484-0.671 1.071-0.672 3.574-0.006 7.149-0.006 10.723 0.005 0.236 0.001 0.5 0.070 0.701 0.19 0.374 0.222 0.5 0.672 0.371 1.090-0.132 0.428-0.468 0.674-0.974 0.676-1.822 0.006-3.643 0.002-5.465 0.002-1.78 0-3.561 0.008-5.341-0.008zM14.228 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.795-0 3.589-0.002 5.383 0.001zM9.344 6.983c-1.63 0-3.26 0.004-4.89-0.002-0.662-0.002-1.097-0.402-1.095-0.98 0.001-0.58 0.436-0.993 1.093-0.994 3.26-0.006 6.52-0.008 9.78 0.007 0.245 0.001 0.521 0.098 0.727 0.235 0.35 0.232 0.448 0.677 0.309 1.074-0.144 0.412-0.47 0.654-0.951 0.656-1.658 0.007-3.315 0.003-4.973 0.003v0.002zM14.279 13.022c0.627 0.003 1.053 0.418 1.049 0.983-0.004 0.563-0.437 0.98-1.058 0.981-3.287 0.005-5.935 0.007-9.222-0.008-0.231-0.001-0.492-0.098-0.685-0.23-0.343-0.234-0.441-0.681-0.305-1.078 0.137-0.4 0.477-0.646 0.958-0.648 1.657-0.007 2.675-0.003 4.332-0.003 1.644-0 3.287-0.006 4.931 0.002z"></path>
+</svg>
+<svg id="icon-both-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="315">
+<path fill="#333" d="M14.148 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 13.040c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 8.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.002 7.105-0.002 1.794-0 3.589-0.002 5.383 0.001zM14.148 4.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001z"></path>
+</svg>
+<svg id="icon-ol" width="16" height="16" viewBox="0 0 16 16" x="0" y="336">
+<path fill="#333" d="M7.111 1.778h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889z"></path>
+<path fill="#333" d="M15.111 4.711h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M15.111 9.511h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M15.111 14.222h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M2.578 0.533h-0.8l-1.689 0.889 0.267 0.889 1.244-0.711v3.733h-1.333v0.889h3.556v-0.889h-1.244z"></path>
+<path fill="#333" d="M2.222 13.956c0.178-0.178 0.444-0.444 0.622-0.622s0.356-0.356 0.444-0.533c0.089-0.178 0.178-0.356 0.267-0.533s0.089-0.356 0.089-0.622c0-0.267-0.089-0.622-0.178-0.8-0.089-0.267-0.267-0.356-0.356-0.533s-0.444-0.267-0.622-0.356c-0.178-0.089-0.444-0.089-0.711-0.089-0.356 0-0.711 0.089-0.978 0.178-0.267 0.178-0.622 0.356-0.8 0.622l0.444 0.622c0.178-0.178 0.356-0.267 0.533-0.444s0.444-0.178 0.622-0.178c0.178 0 0.356 0 0.444 0s0.267 0.089 0.267 0.267 0.178 0.178 0.178 0.356 0.089 0.267 0.089 0.356c0 0.178 0 0.267 0 0.444s-0.089 0.267-0.178 0.356-0.178 0.267-0.356 0.444-0.356 0.444-0.533 0.711l-1.511 1.244v0.889h3.733v-0.889h-2.4l0.889-0.889z"></path>
+</svg>
+<svg id="icon-ul" width="16" height="16" viewBox="0 0 16 16" x="0" y="357">
+<path fill="#333" d="M15.111 13.333h-8.889c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M6.222 2.667h8.889c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889z"></path>
+<path fill="#333" d="M15.111 7.111h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M0 1.778c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#333" d="M0 8c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#333" d="M0 14.222c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+</svg>
+<svg id="icon-right-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="378">
+<path fill="#333" d="M0 1.882h17.488v-1.882h-17.488zM7.511 5.412h9.977v-1.883h-9.977zM7.511 8.941h9.977v-1.883h-9.977zM7.511 12.471h9.977v-1.883h-9.977zM0 16h17.488v-1.882h-17.488zM0 11.572v-6.627l4.418 3.314z"></path>
+</svg>
+<svg id="icon-left-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="399">
+<path fill="#333" d="M0 1.883h17.488v-1.883h-17.488v1.883zM7.511 5.412h9.977v-1.883h-9.977v1.883zM7.511 8.941h9.977v-1.883h-9.977v1.883zM7.511 12.471h9.977v-1.883h-9.977v1.883zM0 16h17.488v-1.883h-17.488v1.883zM4.418 11.572v-6.627l-4.418 3.314 4.418 3.313z"></path>
+</svg>
+<svg id="icon-down-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="420">
+<path fill="#333" d="M13.331 13.511v1.089h2.669v1.4h-4.001v-3.189l2.664-1.309v-1.089h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-up-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="441">
+<path fill="#333" d="M13.331 4.492v1.095h2.669v1.394h-4.001v-3.183l2.664-1.309v-1.095h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-clear-format" width="16" height="16" viewBox="0 0 16 16" x="0" y="462">
+<path fill="#333" d="M11.163 3.197l3.005-1.734 1.43 1.763-2.248 2.491zM8.877 2.251c0.879 0.108 5.156 5.318 5.046 5.904s-2.497 2.206-2.497 2.206l-5.417-6.229c-0 0 1.989-1.988 2.868-1.88zM5.491 4.897l5.23 6.088-3.209 4.173-7.247-9.178s1.436-0.060 2.633-0.374c0.783-0.206 2.593-0.709 2.593-0.709z"></path>
+</svg>
+<svg id="icon-selectall" width="16" height="16" viewBox="0 0 16 16" x="0" y="483">
+<path fill="#333" d="M7.272 8.96c-0.216 0-0.416-0.080-0.568-0.232l-3.136-3.144c-0.112-0.112-0.176-0.264-0.176-0.416 0-0.16 0.064-0.304 0.176-0.416s0.264-0.176 0.416-0.176c0.16 0 0.304 0.064 0.416 0.176l2.872 2.872 6.104-6.104c0.112-0.112 0.264-0.176 0.416-0.176 0.16 0 0.304 0.064 0.416 0.176 0.232 0.232 0.232 0.608 0 0.84l-6.368 6.368c-0.152 0.152-0.352 0.232-0.568 0.232z"></path>
+<path fill="#333" d="M2 12.76c-0.256 0-0.496-0.104-0.68-0.28-0.184-0.184-0.28-0.424-0.28-0.68v-9.776c0-0.256 0.104-0.496 0.28-0.68 0.184-0.184 0.424-0.28 0.68-0.28h6.776c0.328 0 0.592 0.264 0.592 0.592s-0.264 0.592-0.592 0.592h-6.552v9.328h8.92v-4.304c0-0.328 0.272-0.6 0.6-0.6s0.6 0.272 0.6 0.6v4.528c0 0.256-0.104 0.496-0.28 0.68-0.184 0.184-0.424 0.28-0.68 0.28h-9.384z"></path>
+<path fill="#333" d="M5 15.016c-0.328 0-0.592-0.264-0.592-0.592s0.264-0.592 0.592-0.592l8.808-0.008v-7.68c0-0.328 0.264-0.592 0.592-0.592 0.16 0 0.312 0.064 0.424 0.176s0.176 0.264 0.176 0.424l-0.008 8.008c0 0.472-0.384 0.848-0.856 0.848l-9.136 0.008z"></path>
+</svg>
+<svg id="icon-paiban" width="16" height="16" viewBox="0 0 16 16" x="0" y="504">
+<path fill="#333" d="M15.176 12.792l-5.48-4.8c-0.304-0.264-0.76-0.232-1.024 0.072l-1.552 1.776c-0.264 0.304-0.232 0.76 0.064 1.024l2.16 1.888 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.776 0.68 0.36-0.416 0.424-0.48c0.088-0.104 0.24-0.112 0.344-0.024l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.424 0.48-0.36 0.416 0.776 0.68 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.616 0.544c0.304 0.264 0.76 0.232 1.024-0.072l1.56-1.776c0.264-0.32 0.232-0.776-0.072-1.040zM9.76 9.944c-0.176 0.2-0.488 0.208-0.704 0.024s-0.248-0.496-0.072-0.696c0.176-0.2 0.488-0.208 0.704-0.024s0.248 0.496 0.072 0.696z"></path>
+<path fill="#333" d="M5.784 10.824h-2.928c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.552 0.552-0.552h3.096l0.944-1.112h-4.040c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.56 0.552-0.56h4.984l0.472-0.56c0.344-0.4 0.952-0.456 1.352-0.112l2.632 2.232v-6.016l-0.072-0.072v-0.008l-2.88-2.88h-7.784c-0.816 0-1.48 0.664-1.48 1.48v10.744c0 0.816 0.664 1.48 1.48 1.48h7.6l-3.144-2.664c-0.096-0.080-0.176-0.184-0.232-0.296zM2.856 3.040h3.704c0.304 0 0.552 0.248 0.552 0.552s-0.248 0.552-0.552 0.552h-3.704c-0.304 0-0.552-0.248-0.552-0.552 0-0.296 0.248-0.552 0.552-0.552zM2.856 5.264h6.664c0.304 0 0.552 0.248 0.552 0.56 0 0.304-0.248 0.552-0.552 0.552h-6.664c-0.304 0-0.552-0.248-0.552-0.552 0-0.312 0.248-0.56 0.552-0.56z"></path>
+</svg>
+<svg id="icon-full-screen" width="16" height="16" viewBox="0 0 16 16" x="0" y="525">
+<path fill="#333" d="M14.872 1.258c-0.094-0.094-0.219-0.145-0.352-0.145h-0.002l-4.502 0.017c-0.275 0.002-0.497 0.223-0.497 0.5 0.002 0.273 0.223 0.497 0.498 0.497h0.002l3.175-0.013-3.423 3.45c-0.194 0.194-0.192 0.511 0.003 0.705 0.097 0.097 0.223 0.145 0.35 0.145 0.128 0 0.256-0.050 0.353-0.148l3.545-3.572v3.22c0 0.275 0.222 0.498 0.498 0.498 0.275 0 0.498-0.222 0.498-0.498v-4.303c-0.002-0.133-0.055-0.259-0.148-0.353zM1.239 1.238c0.094-0.094 0.219-0.145 0.352-0.145h0.002l4.502 0.019c0.275 0.002 0.497 0.225 0.497 0.5-0.002 0.273-0.223 0.497-0.498 0.497h-0.002l-3.177-0.014 3.425 3.45c0.194 0.194 0.192 0.511-0.003 0.705-0.097 0.097-0.223 0.145-0.35 0.145-0.128 0-0.256-0.050-0.353-0.148l-3.545-3.572v3.22c0 0.275-0.222 0.498-0.498 0.498s-0.498-0.222-0.498-0.498v-4.303c0.002-0.131 0.055-0.259 0.148-0.353zM14.872 14.881c-0.094 0.094-0.219 0.145-0.352 0.145h-0.002l-4.502-0.017c-0.275-0.002-0.497-0.225-0.497-0.5 0.002-0.273 0.223-0.497 0.498-0.497h0.002l3.175 0.012-3.423-3.448c-0.194-0.194-0.192-0.511 0.003-0.705 0.097-0.097 0.223-0.145 0.35-0.145 0.128 0 0.256 0.050 0.353 0.148l3.545 3.57v-3.22c0-0.275 0.222-0.498 0.498-0.498 0.275 0 0.498 0.222 0.498 0.498v4.303c-0.002 0.133-0.055 0.259-0.148 0.353zM1.223 14.886c0.094 0.094 0.219 0.145 0.352 0.145h0.002l4.502-0.017c0.275-0.002 0.497-0.225 0.497-0.5-0.002-0.273-0.223-0.497-0.498-0.497h-0.002l-3.175 0.012 3.425-3.45c0.194-0.194 0.192-0.511-0.003-0.705-0.097-0.097-0.223-0.145-0.35-0.145-0.128 0-0.256 0.050-0.353 0.148l-3.547 3.572v-3.22c0-0.275-0.222-0.498-0.498-0.498s-0.498 0.222-0.498 0.498v4.303c0.002 0.133 0.055 0.259 0.148 0.353z"></path>
+</svg>
+<svg id="icon-title" width="16" height="16" viewBox="0 0 16 16" x="0" y="546">
+<path fill="#333" d="M1.815 2.089v4.803h1.332v-4.803h1.815v-1.089h-4.962v1.089h1.815zM6.443 1.966v-0.966h-1.205v0.966h1.205zM5.239 2.626v4.267h1.205v-4.267h-1.205zM8.594 2.626v-1.279h-1.205v1.279h-0.73v0.784h0.73v2.517c0 0.215 0.037 0.388 0.11 0.52s0.174 0.234 0.301 0.305c0.127 0.072 0.274 0.12 0.441 0.144s0.344 0.037 0.53 0.037c0.119 0 0.24-0.003 0.365-0.008s0.238-0.016 0.339-0.033v-0.908c-0.057 0.011-0.116 0.019-0.178 0.025s-0.127 0.008-0.195 0.008c-0.204 0-0.339-0.033-0.407-0.099s-0.102-0.198-0.102-0.396v-2.113h0.882v-0.784h-0.882zM9.761 1v5.893h1.205v-5.893h-1.205zM14.541 4.301h-1.96c0.006-0.083 0.024-0.176 0.055-0.281s0.085-0.204 0.161-0.297c0.076-0.094 0.178-0.172 0.305-0.235s0.287-0.095 0.479-0.095c0.294 0 0.513 0.077 0.657 0.231s0.245 0.38 0.301 0.677v0zM12.581 5.044h3.164c0.023-0.33-0.006-0.646-0.085-0.949s-0.208-0.572-0.386-0.809c-0.178-0.237-0.406-0.425-0.683-0.565s-0.602-0.21-0.976-0.21c-0.334 0-0.638 0.058-0.912 0.173s-0.51 0.274-0.708 0.475c-0.198 0.201-0.351 0.439-0.458 0.714s-0.161 0.572-0.161 0.891c0 0.33 0.052 0.633 0.157 0.908s0.253 0.512 0.445 0.71c0.192 0.198 0.427 0.351 0.704 0.458s0.588 0.161 0.933 0.161c0.498 0 0.922-0.11 1.272-0.33s0.611-0.586 0.78-1.098h-1.060c-0.040 0.132-0.147 0.257-0.322 0.376s-0.385 0.177-0.628 0.177c-0.339 0-0.599-0.085-0.78-0.256s-0.28-0.446-0.297-0.825zM0 9h16v1h-16v-1zM0 12h16v1h-16v-1zM0 15h12v1h-12v-1z"></path>
+</svg>
+<svg id="icon-font" width="16" height="16" viewBox="0 0 16 16" x="0" y="567">
+<path fill="#333" d="M0.32 1.436v3.661h0.448c0.149-0.971 0.523-1.793 1.195-2.316 0.374-0.374 1.046-0.598 2.017-0.598h1.046v10.386c0 0.672-0.075 1.121-0.149 1.27-0.075 0.224-0.224 0.374-0.448 0.448-0.224 0.149-0.598 0.224-0.971 0.224h-0.448v0.374h7.472v-0.374h-0.448c-0.448 0-0.747-0.075-0.971-0.224s-0.374-0.299-0.448-0.448-0.149-0.598-0.149-1.27v-10.386h1.046c0.672 0 1.121 0.075 1.42 0.149 0.448 0.224 0.822 0.523 1.121 0.897s0.523 0.971 0.747 1.793h0.374v-3.586h-12.851z"></path>
+<path fill="#333" d="M8.533 6.286v2.341h0.254c0.085-0.621 0.296-1.146 0.676-1.481 0.211-0.239 0.592-0.382 1.141-0.382h0.592v6.64c0 0.43-0.042 0.716-0.085 0.812-0.042 0.143-0.127 0.239-0.254 0.287-0.127 0.095-0.338 0.143-0.549 0.143h-0.254v0.239h4.225v-0.239h-0.253c-0.254 0-0.423-0.048-0.549-0.143s-0.211-0.191-0.254-0.287c-0.042-0.095-0.084-0.382-0.084-0.812v-6.64h0.592c0.38 0 0.634 0.048 0.803 0.096 0.255 0.145 0.467 0.338 0.63 0.567l0.004 0.006c0.169 0.239 0.296 0.621 0.423 1.146h0.211v-2.293h-7.268z"></path>
+</svg>
+<svg id="icon-fontsize" width="16" height="16" viewBox="0 0 16 16" x="0" y="588">
+<path fill="#333" d="M10.75 12.432l2.663 3.141 2.674-3.141z"></path>
+<path fill="#333" d="M2.979 7.234l1.53-4.933 1.534 4.933h-3.064zM5.888 0.408h-2.332l-3.489 11.051h1.617l0.825-2.63h4.042l0.839 2.63h2.025l-3.527-11.051z"></path>
+<path fill="#333" d="M9.553 8.899l0.888-2.357 0.888 2.357h-1.776zM11.238 5.444h-1.351l-1.085 2.927 0.47 1.475 0.007-0.021h2.342l0.487 1.522h1.171l-2.041-5.903z"></path>
+</svg>
+<svg id="icon-fontcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="609">
+<path fill="#333" d="M1.051 12.486v2.105h9.121l2.105-2.105h-11.226zM11.575 14.591h3.508v-3.508l-3.508 3.508z"></path>
+<path fill="#333" d="M12.338 12.135h-1.766l-1.437-3.369h-4.42l-1.423 3.369h-1.802l4.631-10.705h1.66l4.558 10.705zM8.565 7.275l-1.625-3.615-1.639 3.615h3.264z"></path>
+</svg>
+<svg id="icon-font-bgcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="630">
+<path fill="#333" d="M4.068 9.652c-0.151 0.146-0.226 0.351-0.226 0.614 0 0.231 0.082 0.42 0.246 0.566s0.38 0.219 0.649 0.219c0.374 0 0.683-0.132 0.926-0.395s0.364-0.594 0.364-0.991v-0.465l-1.136 0.154c-0.398 0.053-0.672 0.152-0.823 0.298zM12.953 1.452h-9.984c-1.103 0-1.997 0.894-1.997 1.997v8.985c0 1.103 0.894 1.997 1.997 1.997h9.984c1.103 0 1.997-0.894 1.997-1.997v-8.985c0-1.103-0.894-1.997-1.997-1.997zM6.879 11.635h-0.851v-0.75h-0.022c-0.336 0.576-0.832 0.864-1.487 0.864-0.471 0-0.845-0.127-1.123-0.382s-0.417-0.598-0.417-1.031c0-0.907 0.537-1.435 1.61-1.584l1.439-0.202c0-0.793-0.328-1.189-0.983-1.189-0.582 0-1.113 0.196-1.593 0.588v-0.829c0.483-0.301 1.040-0.452 1.672-0.452 1.17 0 1.755 0.614 1.755 1.843v3.124zM12.26 11.023c-0.402 0.484-0.938 0.726-1.608 0.726-0.632 0-1.113-0.266-1.443-0.799h-0.018v0.684h-0.86v-7.182h0.86v3.168h0.018c0.38-0.635 0.936-0.952 1.667-0.952 0.608 0 1.092 0.214 1.45 0.643s0.538 1.014 0.538 1.757c0 0.819-0.201 1.47-0.603 1.955zM10.638 7.38c-0.421 0-0.769 0.151-1.042 0.452s-0.41 0.684-0.41 1.15v0.658c0 0.392 0.127 0.723 0.382 0.994s0.573 0.406 0.956 0.406c0.456 0 0.813-0.175 1.071-0.526s0.386-0.836 0.386-1.457c0-0.512-0.12-0.919-0.36-1.222s-0.567-0.454-0.983-0.454z"></path>
+</svg>
+<svg id="icon-b" width="16" height="16" viewBox="0 0 16 16" x="0" y="651">
+<path fill="#333" d="M12.615 5.846c0-1.846-1.477-3.385-3.231-3.385h-5.077c-0.338 0-0.615 0.277-0.615 0.615v10.154c0 0.338 0.277 0.615 0.615 0.615h5.077c1.754 0 3.231-1.538 3.231-3.385 0-0.892-0.338-1.692-0.892-2.308 0.554-0.615 0.892-1.415 0.892-2.308zM9.385 11.692h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231zM9.385 7.077h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231z"></path>
+</svg>
+<svg id="icon-italic" width="16" height="16" viewBox="0 0 16 16" x="0" y="672">
+<path fill="#333" d="M11.692 3.785v-0.4c0-0.338-0.277-0.615-0.615-0.615h-4.308c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615 0.523 0 0.923 0.492 0.8 0.985l-1.108 5.415c-0.092 0.4-0.431 0.677-0.8 0.677h-0.738c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615h4.308c0.338 0 0.615-0.277 0.615-0.615v-0.615c0-0.338-0.277-0.615-0.615-0.615-0.523 0-0.923-0.492-0.8-0.985l1.108-5.415c0.092-0.4 0.431-0.677 0.8-0.677h0.523c0.462 0 0.831-0.369 0.831-0.831z"></path>
+</svg>
+<svg id="icon-underline" width="16" height="16" viewBox="0 0 16 16" x="0" y="693">
+<path fill="#333" d="M13.692 12.923h-11.385c-0.246 0-0.462 0.215-0.462 0.462v0.923c0 0.246 0.215 0.462 0.462 0.462h11.385c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462zM7.785 11.692c-2.308-0.123-4.092-2.123-4.092-4.431v-4.185c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.215c0 1.323 0.985 2.462 2.308 2.554 1.446 0.092 2.615-1.046 2.615-2.462v-4.308c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.308c0 2.462-2.062 4.431-4.523 4.308z"></path>
+</svg>
+<svg id="icon-strickout" width="16" height="16" viewBox="0 0 16 16" x="0" y="714">
+<path fill="#333" d="M3.723 5.569c-0.062-0.308-0.092-0.677-0.092-1.046 0-0.4 0.092-0.862 0.277-1.292 0.185-0.462 0.462-0.892 0.862-1.262 0.369-0.369 0.892-0.708 1.477-0.954 0.615-0.246 1.323-0.4 2.185-0.4 0.769 0 1.508 0.092 2.215 0.308 0.554 0.185 1.077 0.492 1.538 0.923 0.185 0.185 0.185 0.492-0.031 0.677l-0.831 0.769c-0.185 0.154-0.462 0.185-0.646 0-0.215-0.215-0.462-0.4-0.738-0.554-0.431-0.215-0.923-0.338-1.508-0.338-0.523 0-0.985 0.062-1.323 0.215s-0.646 0.308-0.862 0.554-0.369 0.462-0.462 0.708-0.123 0.492-0.123 0.677c0 0.338 0.062 0.615 0.154 0.862 0.092 0.215-0.062 0.431-0.277 0.431h-1.508c-0.154 0-0.277-0.154-0.308-0.277zM12.277 10.154h-1.538c-0.215 0-0.369 0.215-0.277 0.4s0.123 0.431 0.123 0.677c0 0.369-0.092 0.708-0.246 1.015-0.185 0.308-0.4 0.523-0.677 0.738-0.277 0.185-0.585 0.338-0.923 0.431s-0.646 0.154-0.985 0.154c-0.585 0-1.138-0.123-1.662-0.369-0.4-0.185-0.738-0.431-1.046-0.769-0.154-0.185-0.462-0.215-0.646-0.062l-0.862 0.738c-0.185 0.154-0.215 0.462-0.031 0.646 0.431 0.492 0.985 0.862 1.631 1.108 0.8 0.308 1.662 0.462 2.585 0.462 0.677 0 1.323-0.092 1.908-0.308 0.585-0.185 1.108-0.492 1.569-0.862 0.431-0.369 0.8-0.831 1.046-1.385s0.4-1.138 0.4-1.815c0-0.246 0-0.4-0.031-0.615-0.062-0.062-0.185-0.185-0.338-0.185zM15.354 7.354c-0.062-0.185-0.246-0.277-0.431-0.277h-13.846c-0.215 0-0.369 0.092-0.431 0.277-0.031 0.062-0.031 0.092-0.031 0.154v0.923c0 0.246 0.215 0.492 0.462 0.492h13.846c0.246 0 0.462-0.246 0.462-0.492v-0.923c0-0.062 0-0.092-0.031-0.154z"></path>
+</svg>
+<svg id="icon-line-height" width="16" height="16" viewBox="0 0 16 16" x="0" y="735">
+<path fill="#333" d="M2.499 11.902v-7.682c-0.166 0-0.326 0.009-0.485-0.002-0.265-0.019-0.339-0.2-0.178-0.467 0.254-0.423 0.52-0.837 0.79-1.245 0.145-0.219 0.377-0.212 0.522 0.009 0.262 0.398 0.521 0.801 0.767 1.214 0.055 0.093 0.087 0.254 0.063 0.359-0.016 0.067-0.153 0.115-0.239 0.126-0.153 0.020-0.308 0.006-0.469 0.006v7.672c0.15 0 0.298-0.017 0.444 0.006 0.097 0.015 0.246 0.062 0.266 0.138 0.027 0.104-0.021 0.274-0.080 0.375-0.236 0.397-0.486 0.781-0.737 1.164-0.17 0.26-0.396 0.258-0.566-0.005-0.25-0.384-0.492-0.775-0.737-1.163-0.022-0.035-0.044-0.075-0.061-0.118l-0.002-0.005c-0.088-0.217-0.034-0.357 0.161-0.375 0.176-0.016 0.353-0.003 0.543-0.003z"></path>
+<path fill="#333" d="M14.841 0v1.166h-13.69v-1.166zM14.849 14.834v1.166h-13.69v-1.166zM10.056 2.956l4.172 10.602h-1.321l-1.129-2.97h-4.871l-1.128 2.97h-1.307l4.173-10.602zM11.392 9.563l-2.004-5.3h-0.059l-2.034 5.3z"></path>
+</svg>
+<svg id="icon-clear-html" width="16" height="16" viewBox="0 0 16 16" x="0" y="756">
+<path fill="#333" d="M10.175 3.11c-0.106-0.106-0.279-0.106-0.385 0l-8.625 8.625c-0.106 0.106-0.106 0.279 0 0.385l1.678 1.678c0.106 0.106 0.315 0.192 0.464 0.192h5.374c0.15 0 0.358-0.087 0.464-0.192l5.666-5.666c0.106-0.106 0.106-0.279 0-0.385l-4.636-4.636zM8.612 12.774c-0.106 0.106-0.315 0.192-0.464 0.192h-4.161c-0.15 0-0.358-0.087-0.464-0.192l-0.791-0.791c-0.106-0.106-0.106-0.279 0-0.385l3.162-3.162c0.106-0.106 0.279-0.106 0.385 0l3.143 3.143c0.106 0.106 0.106 0.279 0 0.385l-0.81 0.81z"></path>
+</svg>
+<svg id="icon-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="777">
+<path fill="#333" d="M15.385 3.077c0-0.677-0.554-1.231-1.231-1.231h-12.308c-0.677 0-1.231 0.554-1.231 1.231v9.846c0 0.677 0.554 1.231 1.231 1.231h12.308c0.677 0 1.231-0.554 1.231-1.231v-9.846zM12.185 11.692h-8.923c-0.369 0-0.585-0.4-0.4-0.708l2.708-4.708c0.123-0.215 0.4-0.215 0.523 0l1.631 2.8c0.123 0.185 0.4 0.215 0.523 0.031l1.323-1.908c0.123-0.185 0.4-0.185 0.523 0l2.431 3.877c0.185 0.277 0 0.615-0.338 0.615zM11.385 6.154c-0.677 0-1.231-0.554-1.231-1.231s0.554-1.231 1.231-1.231 1.231 0.554 1.231 1.231-0.554 1.231-1.231 1.231z"></path>
+</svg>
+<svg id="icon-multiple-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="798">
+<path fill="#333" d="M13 1v12.033h-12v-12.033h12zM13 0h-12c-0.567 0-1 0.433-1 1v12.033c0 0.567 0.433 1 1 1h12.033c0.567 0 1-0.433 1-1v-12.033c-0.033-0.567-0.467-1-1.033-1z"></path>
+<path fill="#333" d="M13 12.267c0.567-0.6 0.8-2.3 0.8-3.1 0-2.033-1.6-3.7-3.633-3.7-1.433 0-2.633 0.8-3.233 1.967-0.667 1.033-1.8 1.7-3.1 1.7-1.367 0-2.533-0.733-3.2-1.833-0.333 0.567-0.5 1.2-0.5 1.867 0 0.733 0.2 2.333 0.567 2.9v1.133h1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h2.1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h0.7v-0.933z"></path>
+<path fill="#333" d="M2.767 4.233c0 0 0 0 0 0 0 0.7 0.567 1.267 1.267 1.267s1.267-0.567 1.267-1.267c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.7-0.567-1.267-1.267-1.267s-1.267 0.567-1.267 1.267c0 0 0 0 0 0v0z"></path>
+<path fill="#333" d="M15.633 16h-9c-0.267 0-0.5-0.233-0.5-0.5s0.233-0.5 0.5-0.5h8.5v-8.5c0-0.267 0.233-0.5 0.5-0.5s0.5 0.233 0.5 0.5v9c0 0.267-0.233 0.5-0.5 0.5z"></path>
+</svg>
+<svg id="icon-graft" width="17" height="16" viewBox="0 0 17 16" x="0" y="819">
+<path fill="#333" d="M16.407 3.584c0.106-0.333 0.388-1.214-0.194-1.628-0.171-0.118-0.382-0.188-0.61-0.188-0.013 0-0.026 0-0.039 0.001l0.002-0c-0.449 0-1.133 0.267-1.914 0.713-0.030-0.060-0.067-0.112-0.111-0.157l0 0c-1.435-1.432-3.417-2.318-5.605-2.318-4.379 0-7.93 3.548-7.935 7.926v0c-0 0.009-0 0.020-0 0.031 0 2.264 0.957 4.305 2.489 5.739l0.004 0.004c0.107 0.101 0.251 0.163 0.41 0.163 0.001 0 0.001 0 0.002 0h0.044c-0.291 0.29-0.604 0.557-0.938 0.8l-0.023 0.016c-0.155 0.11-0.255 0.289-0.255 0.491 0 0.279 0.19 0.513 0.448 0.581l0.004 0.001c0.631 0.152 1.356 0.239 2.102 0.239 0.004 0 0.008 0 0.011 0h-0.001c1.236 0 2.256-0.259 3.042-0.777v0.047c0 0.332 0.269 0.601 0.601 0.601v0c4.38-0.005 7.929-3.555 7.935-7.934v-0c0-0.008 0.001-0.018 0.001-0.028 0-0.332-0.269-0.601-0.601-0.601s-0.601 0.269-0.601 0.601c0 0.010 0 0.020 0.001 0.029l-0-0.001c-0.005 3.687-2.969 6.679-6.644 6.731l-0.005 0c0.617-0.614 0.933-1.306 0.906-1.993-0.017-0.336-0.114-0.646-0.272-0.916l0.005 0.009c0.166 0.056 0.358 0.088 0.557 0.088 0.004 0 0.007-0 0.011-0h-0.001c2.749-0.001 6.495-6.143 7.175-8.27zM4.521 13.81c0.268-0.47 1.21-1.992 2.168-1.992 0.209 0.006 0.402 0.071 0.563 0.18l-0.004-0.002c0.265 0.15 0.447 0.419 0.476 0.732l0 0.004c0.021 0.427-0.3 0.928-0.881 1.375s-1.457 0.695-2.549 0.695c-0.181 0-0.369-0.006-0.56-0.021 0.298-0.283 0.558-0.602 0.774-0.952l0.012-0.020zM8.754 9.025c1.072-2.589 5.206-5.632 6.574-6.016-0.129 0.493-0.567 1.583-1.553 3.158-1.643 2.599-3.549 4.486-4.55 4.486-0.003 0-0.007 0-0.010 0-0.167 0-0.317-0.071-0.422-0.185l-0-0c-0.299-0.299-0.312-0.786-0.039-1.443zM1.2 7.933c0-0.002 0-0.004 0-0.006 0-3.717 3.014-6.731 6.731-6.731 1.835 0 3.499 0.734 4.713 1.925l-0.001-0.001c-1.977 1.364-4.207 3.536-4.998 5.444-0.422 1.019-0.327 1.744-0.071 2.246-0.26-0.121-0.564-0.192-0.885-0.193h-0c-1.486 0-2.63 1.588-3.193 2.559-0.021-0.136-0.086-0.254-0.18-0.343l-0-0c-1.303-1.221-2.115-2.952-2.115-4.874 0-0.009 0-0.019 0-0.028v0.001z"></path>
+<path fill="#333" d="M8.931 4.704c0.858 0 1.553-0.695 1.553-1.553s-0.695-1.553-1.553-1.553c-0.858 0-1.553 0.695-1.553 1.553v0c0 0.858 0.695 1.553 1.553 1.553v0zM8.931 3.504c-0.194 0-0.352-0.158-0.352-0.352s0.158-0.352 0.352-0.352c0.194 0 0.352 0.158 0.352 0.352v0c0 0.194-0.158 0.352-0.352 0.352v0zM5.394 9.012c0-0.858-0.695-1.553-1.553-1.553s-1.553 0.695-1.553 1.553c0 0.858 0.695 1.553 1.553 1.553v0c0.858 0 1.553-0.695 1.553-1.553v0zM3.841 8.659c0.002-0 0.004-0 0.006-0 0.194 0 0.352 0.158 0.352 0.352s-0.158 0.352-0.352 0.352c-0.194 0-0.352-0.158-0.352-0.352v0c0-0 0-0 0-0 0-0.193 0.155-0.349 0.347-0.352h0zM4.977 7.069c1.144 0 2.071-0.927 2.071-2.071s-0.927-2.071-2.071-2.071c-1.144 0-2.071 0.927-2.071 2.071v0c0 1.144 0.927 2.071 2.071 2.071v0zM4.977 4.123c0.482 0 0.872 0.391 0.872 0.872s-0.391 0.872-0.872 0.872c-0.482 0-0.872-0.391-0.872-0.872v0c0.001-0.481 0.391-0.87 0.872-0.871h0z"></path>
+</svg>
+<svg id="icon-flash" width="16" height="16" viewBox="0 0 16 16" x="0" y="840">
+<path fill="#333" d="M8 0.889c-3.911 0-7.111 3.2-7.111 7.111s3.2 7.111 7.111 7.111 7.111-3.2 7.111-7.111-3.2-7.111-7.111-7.111zM11.556 5.956c-1.244-0.089-1.956 1.244-1.956 1.244l1.422 0.089v1.6h-2.044c-1.067 3.911-3.644 3.2-3.644 3.2v-1.333s1.511 0 2.311-2.756c1.156-4.356 3.911-3.467 3.911-3.467v1.422z"></path>
+</svg>
+<svg id="icon-vedio" width="16" height="16" viewBox="0 0 16 16" x="0" y="861">
+<path fill="#333" d="M15.385 0.615h-0.615v1.231h-1.846v-1.231h-9.846v1.231h-1.846v-1.231h-0.615c-0.339 0-0.615 0.276-0.615 0.615v13.538c0 0.339 0.276 0.615 0.615 0.615h0.615v-0.615h1.846v0.615h9.846v-0.615h1.846v0.615h0.615c0.339 0 0.615-0.276 0.615-0.615v-13.538c0-0.339-0.276-0.615-0.615-0.615zM3.077 12.923h-1.846v-1.846h1.846v1.846zM3.077 9.231h-1.846v-1.846h1.846v1.846zM3.077 5.538h-1.846v-1.846h1.846v1.846zM10.823 8.404l-4.002 2.334c-0.065 0.033-0.137 0.048-0.207 0.048-0.085 0-0.167-0.023-0.242-0.067-0.135-0.082-0.218-0.228-0.218-0.385v-4.668c0-0.157 0.082-0.303 0.218-0.385 0.137-0.082 0.307-0.090 0.449-0.018l4.002 2.334c0.156 0.077 0.254 0.233 0.254 0.404s-0.098 0.327-0.254 0.404zM14.769 12.923h-1.846v-1.846h1.846v1.846zM14.769 9.231h-1.846v-1.846h1.846v1.846zM14.769 5.538h-1.846v-1.846h1.846v1.846z"></path>
+</svg>
+<svg id="icon-attach" width="16" height="16" viewBox="0 0 16 16" x="0" y="882">
+<path fill="#333" d="M5.415 11.292c0.185 0.185 0.462 0.154 0.646 0l3.077-3.077c0.215-0.215 0.585-0.246 0.862 0s0.246 0.677 0 0.923l-3.785 3.723c-0.831 0.831-2.215 0.831-3.046 0l-0.031-0.031c-0.831-0.831-0.831-2.215 0-3.046l6.677-6.677c0.831-0.831 2.215-0.831 3.046 0l0.031 0.031c0.831 0.831 0.831 2.215 0 3.046l-0.031 0.031c-0.154 0.154-0.185 0.369-0.062 0.554 0.185 0.338 0.338 0.708 0.431 1.077 0.062 0.246 0.338 0.308 0.523 0.154 0.246-0.246 0.462-0.492 0.462-0.492 1.569-1.569 1.569-4.123 0-5.692h-0.062c-1.569-1.569-4.123-1.569-5.692 0l-6.677 6.646c-1.569 1.569-1.569 4.123 0 5.692l0.062 0.062c1.569 1.569 4.092 1.569 5.662 0l3.815-3.785c0.985-0.985 0.954-2.585-0.062-3.569-0.985-0.954-2.585-0.892-3.538 0.092l-3.015 3.015c-0.185 0.185-0.185 0.492 0 0.677l0.708 0.646z"></path>
+</svg>
+<svg id="icon-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="903">
+<path fill="#333" d="M17.846 0h-17.231c-0.49 0-0.615 0.129-0.615 0.615v14.769c0 0.486 0.125 0.615 0.615 0.615h17.231c0.49 0 0.615-0.129 0.615-0.615v-14.769c0-0.486-0.125-0.615-0.615-0.615zM5.538 14.769l-4.328 0.051v-3.108l4.328-0.020v3.077zM5.538 10.462h-4.308v-3.077h4.308v3.077zM5.538 6.154h-4.308v-2.462h4.308v2.462zM11.692 14.769h-4.923v-3.077h4.923v3.077zM11.692 10.462h-4.923v-3.077h4.923v3.077zM11.692 6.154h-4.923v-2.462h4.923v2.462zM17.231 14.769h-4.308v-3.077h4.308v3.077zM17.231 10.462h-4.308v-3.077h4.308v3.077zM17.231 6.154h-4.308v-2.462h4.308v2.462z"></path>
+</svg>
+<svg id="icon-split" width="16" height="16" viewBox="0 0 16 16" x="0" y="924">
+<path fill="#333" d="M14.222 12.412l-1.811 1.811h-1.022l2.833-2.833v1.022zM14.222 13.742v0.48h-0.48l0.48-0.48zM14.222 10.059l-4.164 4.164h-1.022l4.444-4.444h0.741v0.281zM12.15 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM9.796 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM7.444 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM5.091 9.778l-3.313 3.313v-1.012l2.3-2.3h1.013zM2.748 9.778l-0.97 0.97v-0.97h0.97zM14.222 3.078l-2.255 2.255h-1.022l3.277-3.277v1.022zM14.222 4.409v0.924h-0.924l0.924-0.924zM13.17 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM10.817 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM8.462 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM6.11 1.778l-3.556 3.556h-0.777v-0.244l3.311-3.311h1.022zM3.757 1.778l-1.98 1.98v-1.012l0.967-0.967h1.013zM0 7.111h16v0.889h-16v-0.889z"></path>
+</svg>
+<svg id="icon-face" width="16" height="16" viewBox="0 0 16 16" x="0" y="945">
+<path fill="#333" d="M8 16c-4.417 0-8-3.58-8-7.993s3.583-8.007 8-8.007 8 3.594 8 8.007c0 4.413-3.583 7.993-8 7.993zM8 1c-3.865 0-7 3.145-7 7.006s3.135 6.994 7 6.994 7-3.132 7-6.994c0-3.861-3.135-7.006-7-7.006zM8 13c-2.419 0-4.436-1.718-4.899-4h1.041c0.446 1.722 1.997 3 3.859 3s3.412-1.278 3.858-3h1.041c-0.463 2.282-2.48 4-4.899 4zM11 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1zM5 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1z"></path>
+</svg>
+<svg id="icon-split-page" width="16" height="16" viewBox="0 0 16 16" x="0" y="966">
+<path fill="#333" d="M14.25 1v4h-12.5v-4h1.042v3h10.417v-3zM1.75 15v-4h12.5v4h-1.041v-3h-10.417v3zM1 7h14v2h-14z"></path>
+</svg>
+<svg id="icon-anchor" width="16" height="16" viewBox="0 0 16 16" x="0" y="987">
+<path fill="#333" d="M15.297 9.614l-1.117-1.117c-0.075-0.075-0.174-0.116-0.28-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l0.442-0.442c-0.107 1.281-0.667 2.486-1.579 3.399-0.925 0.925-2.149 1.487-3.45 1.583l-0-7.611 3.106-0c0.218 0 0.396-0.178 0.396-0.396s-0.178-0.396-0.396-0.396h-3.106v-4.407l2.781 2.781c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-3.434-3.434c-0.083-0.083-0.198-0.125-0.316-0.114-0.109-0.003-0.214 0.038-0.291 0.116l-3.434 3.434c-0.154 0.154-0.154 0.406 0 0.56 0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l2.781-2.781v4.405h-3.106c-0.218 0-0.396 0.178-0.396 0.396s0.178 0.396 0.396 0.396l3.106-0v7.613c-1.311-0.091-2.546-0.653-3.478-1.585-0.92-0.92-1.481-2.137-1.582-3.43l0.444 0.444c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-1.117-1.117c-0.075-0.075-0.174-0.116-0.279-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28 0.174 0.116 0.28 0.116c0.106 0 0.205-0.041 0.28-0.116l0.475-0.475c0.047 0.697 0.208 1.376 0.48 2.018 0.316 0.748 0.769 1.42 1.346 1.997s1.249 1.030 1.997 1.346c0.775 0.328 1.598 0.494 2.446 0.494s1.671-0.166 2.446-0.494c0.748-0.316 1.42-0.769 1.997-1.346s1.030-1.249 1.346-1.997c0.275-0.651 0.437-1.338 0.481-2.045l0.474 0.474c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116 0.116-0.174 0.116-0.28c0-0.106-0.041-0.205-0.116-0.28z"></path>
+</svg>
+<svg id="icon-link" width="16" height="16" viewBox="0 0 16 16" x="0" y="1008">
+<path fill="#333" d="M8.369 12.831l-0.646-0.092s-0.431-0.092-0.646-0.185c-0.123-0.031-0.277 0-0.369 0.092l-0.154 0.154c-0.892 0.892-2.338 0.985-3.262 0.185-1.046-0.892-1.077-2.492-0.123-3.446l2.338-2.338c0.308-0.308 0.677-0.492 1.046-0.615 0.492-0.123 1.015-0.092 1.477 0.092 0.277 0.123 0.554 0.277 0.8 0.523 0.123 0.123 0.215 0.246 0.308 0.4 0.123 0.215 0.4 0.246 0.554 0.062l0.862-0.862c0.123-0.123 0.123-0.308 0.031-0.462-0.123-0.185-0.277-0.338-0.431-0.492-0.215-0.215-0.462-0.431-0.738-0.585-0.431-0.277-0.923-0.462-1.446-0.554-0.954-0.185-2-0.031-2.862 0.431-0.338 0.185-0.677 0.431-0.954 0.708l-2.246 2.246c-1.631 1.631-1.754 4.277-0.185 5.938 1.631 1.785 4.4 1.815 6.092 0.123l0.769-0.769c0.215-0.154 0.062-0.523-0.215-0.554zM14.031 1.785c-1.692-1.569-4.338-1.446-5.938 0.185l-0.708 0.677c-0.215 0.215-0.062 0.585 0.215 0.615 0.431 0.031 0.862 0.123 1.292 0.246 0.123 0.031 0.277 0 0.369-0.092l0.154-0.154c0.892-0.892 2.338-0.985 3.262-0.185 1.046 0.892 1.077 2.492 0.123 3.446l-2.338 2.338c-0.308 0.308-0.677 0.492-1.046 0.615-0.492 0.123-1.015 0.092-1.477-0.092-0.277-0.123-0.554-0.277-0.8-0.523-0.123-0.123-0.215-0.246-0.308-0.4-0.123-0.215-0.4-0.246-0.554-0.062l-0.862 0.862c-0.123 0.123-0.123 0.308-0.031 0.462 0.123 0.185 0.277 0.338 0.431 0.492 0.215 0.215 0.492 0.431 0.738 0.585 0.431 0.277 0.923 0.462 1.415 0.554 0.954 0.185 2 0.031 2.862-0.431 0.338-0.185 0.677-0.431 0.954-0.708l2.338-2.338c1.723-1.692 1.662-4.462-0.092-6.092z"></path>
+</svg>
+<svg id="icon-unlink" width="16" height="16" viewBox="0 0 16 16" x="0" y="1029">
+<path fill="#333" d="M7.385 11.262c-0.185 0-0.369-0.031-0.554-0.092-0.185-0.031-0.4-0.092-0.585-0.154-0.123-0.031-0.246 0-0.308 0.062l-0.123 0.123c-0.769 0.769-2.031 0.862-2.862 0.154-0.892-0.8-0.954-2.185-0.092-3.015l2.031-2.031c0.277-0.277 0.585-0.431 0.923-0.523 0.431-0.123 0.892-0.092 1.292 0.092 0.246 0.092 0.492 0.246 0.677 0.462 0.092 0.092 0.185 0.215 0.277 0.369 0.092 0.185 0.338 0.215 0.492 0.062l0.769-0.769c0.123-0.123 0.123-0.277 0.031-0.4-0.123-0.154-0.246-0.277-0.369-0.431-0.185-0.185-0.431-0.369-0.646-0.523-0.4-0.246-0.8-0.4-1.262-0.492-0.831-0.154-1.723-0.031-2.523 0.4-0.308 0.154-0.585 0.369-0.831 0.615l-1.969 1.969c-1.415 1.415-1.538 3.723-0.154 5.2 1.446 1.538 3.877 1.6 5.354 0.092l0.677-0.677c0.154-0.154 0.031-0.462-0.246-0.492zM12.462 6.923c1.477-1.477 1.446-3.908-0.092-5.354-1.477-1.354-3.785-1.262-5.2 0.154l-0.615 0.615c-0.185 0.185-0.062 0.492 0.185 0.523 0.369 0.031 0.769 0.092 1.138 0.215 0.123 0.031 0.246 0 0.308-0.062l0.123-0.123c0.769-0.769 2.031-0.862 2.862-0.154 0.892 0.8 0.954 2.185 0.092 3.015l-2.031 2.031c-0.277 0.277-0.585 0.431-0.923 0.523-0.431 0.123-0.892 0.092-1.292-0.092-0.246-0.092-0.492-0.246-0.677-0.462-0.092-0.092-0.185-0.215-0.246-0.338-0.092-0.185-0.338-0.215-0.492-0.062l-0.738 0.738c-0.123 0.123-0.123 0.277-0.031 0.4 0.123 0.154 0.215 0.277 0.369 0.431 0.215 0.215 0.431 0.369 0.646 0.523 0.4 0.246 0.8 0.4 1.262 0.492 0.831 0.154 1.723 0.031 2.523-0.4 0.308-0.154 0.585-0.369 0.831-0.615l2-2zM13.877 12.615l1.415-1.415c0.123-0.123 0.123-0.308 0-0.431l-0.862-0.862c-0.123-0.123-0.308-0.123-0.431 0l-1.385 1.446-1.323-1.323c-0.123-0.123-0.308-0.123-0.431 0l-0.862 0.862c-0.123 0.123-0.123 0.308 0 0.431l1.323 1.323-1.292 1.292c-0.123 0.123-0.123 0.308 0 0.431l0.862 0.862c0.123 0.123 0.308 0.123 0.431 0l1.292-1.292 1.385 1.385c0.123 0.123 0.308 0.123 0.431 0l0.862-0.862c0.123-0.123 0.123-0.308 0-0.431l-1.415-1.415z"></path>
+</svg>
+<svg id="icon-baidu-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1050">
+<path fill="#333" d="M9.473 10.846c0.725-0.156 0.626-1.022 0.605-1.211-0.035-0.292-0.379-0.802-0.845-0.762-0.587 0.053-0.672 0.9-0.672 0.9-0.080 0.392 0.189 1.229 0.913 1.073zM10.243 12.353c-0.021 0.061-0.069 0.217-0.027 0.352 0.081 0.305 0.345 0.318 0.345 0.318h0.379v-0.928h-0.407c-0.183 0.055-0.271 0.197-0.291 0.258zM10.819 9.393c0.401 0 0.724-0.461 0.724-1.031s-0.323-1.030-0.724-1.030c-0.399 0-0.724 0.461-0.724 1.030s0.324 1.031 0.724 1.031zM12.543 9.461c0.535 0.069 0.879-0.501 0.947-0.935 0.070-0.432-0.275-0.935-0.654-1.021-0.379-0.087-0.853 0.521-0.897 0.917-0.052 0.485 0.069 0.969 0.603 1.038zM13.854 12.006s-0.828-0.641-1.311-1.333c-0.655-1.021-1.586-0.605-1.897-0.086-0.31 0.519-0.793 0.847-0.861 0.935-0.069 0.085-1 0.588-0.793 1.505s0.932 0.899 0.932 0.899 0.535 0.053 1.155-0.086c0.621-0.137 1.155 0.035 1.155 0.035s1.449 0.485 1.846-0.449c0.396-0.935-0.224-1.42-0.224-1.42zM11.374 13.397h-0.942c-0.407-0.081-0.569-0.359-0.589-0.406s-0.135-0.271-0.075-0.651c0.176-0.569 0.677-0.61 0.677-0.61h0.501v-0.617l0.427 0.007v2.277zM13.129 13.39h-1.084c-0.42-0.108-0.44-0.407-0.44-0.407v-1.199l0.44-0.007v1.078c0.027 0.115 0.169 0.136 0.169 0.136h0.447v-1.206h0.468v1.605zM14.664 10.189c0-0.207-0.172-0.831-0.81-0.831s-0.725 0.589-0.725 1.005c0 0.397 0.033 0.951 0.827 0.933s0.707-0.899 0.707-1.107zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l0.052-0.111c-0.201-0.083-0.385-0.213-0.533-0.393-0.345-0.423-0.433-0.979-0.368-1.358 0.062-0.522 0.394-1.388 1.275-1.467 0.032-0.003 0.069-0.005 0.106-0.005 0.001 0 0.002 0 0.003 0h-0c0.051 0 0.1 0.003 0.149 0.009 0.061-0.878 0.647-1.546 1.386-1.546 0.072 0 0.14 0.015 0.208 0.027l0.092-0.195c0.143-0.304 0.215-0.692 0.215-1.165 0-0.92-0.325-1.706-0.977-2.357s-1.437-0.977-2.357-0.977-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM8.734 14h-7.401l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h5.811c0.083 0.274 0.202 0.494 0.344 0.667z"></path>
+</svg>
+<svg id="icon-google-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1071">
+<path fill="#333" d="M10.813 8.519c0 0.622 0.208 1.071 0.618 1.335 0.335 0.216 0.725 0.249 0.927 0.249 0.049 0 0.089-0.002 0.116-0.004 0 0-0.064 0.418 0.246 0.832h-0.014c-0.537 0-2.289 0.112-2.289 1.553 0 1.465 1.609 1.54 1.932 1.54 0.025 0 0.040-0.001 0.040-0.001 0.003 0 0.027 0.001 0.066 0.001 0.207 0 0.743-0.026 1.24-0.268 0.645-0.313 0.972-0.858 0.972-1.619 0-0.735-0.499-1.173-0.863-1.493-0.222-0.195-0.414-0.363-0.414-0.527 0-0.167 0.14-0.292 0.317-0.451 0.287-0.257 0.557-0.622 0.557-1.313 0-0.607-0.079-1.015-0.564-1.273 0.051-0.026 0.229-0.045 0.318-0.057 0.263-0.036 0.647-0.077 0.647-0.291v-0.041h-1.916c-0.019-0.001-1.937 0.071-1.937 1.827zM13.906 12.274c0.037 0.586-0.465 1.019-1.217 1.073-0.765 0.056-1.394-0.288-1.431-0.873-0.018-0.281 0.106-0.557 0.348-0.777 0.245-0.223 0.583-0.359 0.949-0.387 0.043-0.003 0.086-0.005 0.129-0.005 0.707 0 1.187 0.416 1.221 0.968zM13.405 8.118c0.188 0.661-0.096 1.353-0.548 1.48-0.048 0.014-0.103 0.022-0.16 0.022-0 0-0 0-0 0h0c-0.415 0-0.825-0.419-0.977-0.997-0.085-0.325-0.078-0.608 0.019-0.881 0.096-0.268 0.268-0.449 0.485-0.511 0.048-0.014 0.103-0.022 0.16-0.022 0 0 0 0 0 0h-0c0.501 0 0.823 0.207 1.021 0.908zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l1.275-2.711c-0.009-0.099-0.017-0.199-0.017-0.308 0-1.052 0.509-1.742 1.153-2.151 0.109-0.284 0.174-0.621 0.174-1.034 0-0.92-0.325-1.706-0.977-2.357-0.651-0.652-1.437-0.977-2.357-0.977s-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM9.895 10.667l0.313-0.667h0.225c0.137 0.189 0.299 0.35 0.483 0.48l0.006 0.004c-0.115 0.055-0.221 0.116-0.322 0.182h-0.705zM10.184 14h-8.851l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h7.195c0.099 0.255 0.235 0.479 0.411 0.667z"></path>
+</svg>
+<svg id="icon-about" width="16" height="16" viewBox="0 0 16 16" x="0" y="1092">
+<path fill="#333" d="M8.011 0.991c-3.868 0-7.003 3.135-7.003 7.003s3.135 7.003 7.003 7.003 7.003-3.136 7.003-7.003c0-3.868-3.135-7.003-7.003-7.003zM7.984 11.487c-0.399 0-0.723-0.333-0.723-0.743s0.324-0.743 0.723-0.743c0.399 0 0.723 0.333 0.723 0.743s-0.324 0.743-0.723 0.743zM10.003 6.816c-0.1 0.192-0.218 0.357-0.355 0.496s-0.384 0.374-0.739 0.704c-0.098 0.093-0.177 0.174-0.236 0.245s-0.103 0.134-0.132 0.193c-0.026 0.050-0.049 0.108-0.066 0.168l-0.002 0.007c-0.016 0.059-0.040 0.161-0.072 0.308-0.055 0.312-0.227 0.467-0.516 0.467-0.15 0-0.277-0.051-0.379-0.153s-0.154-0.253-0.154-0.454c0-0.251 0.037-0.47 0.113-0.654s0.175-0.347 0.299-0.486c0.124-0.139 0.292-0.305 0.503-0.497 0.185-0.168 0.319-0.294 0.401-0.38 0.080-0.083 0.149-0.176 0.205-0.279l0.003-0.007c0.056-0.105 0.085-0.219 0.085-0.341 0-0.24-0.086-0.442-0.258-0.607s-0.394-0.247-0.666-0.247c-0.318 0-0.552 0.083-0.702 0.25s-0.277 0.411-0.382 0.735c-0.098 0.339-0.285 0.508-0.559 0.508-0.162 0-0.298-0.059-0.41-0.178s-0.167-0.247-0.167-0.384c0-0.285 0.088-0.573 0.264-0.866s0.434-0.534 0.772-0.726c0.338-0.192 0.733-0.288 1.183-0.288 0.419 0 0.789 0.080 1.11 0.24s0.569 0.378 0.743 0.654c0.175 0.276 0.262 0.576 0.262 0.899 0 0.255-0.050 0.478-0.15 0.67z"></path>
+</svg>
+<svg id="icon-blockquote" width="16" height="16" viewBox="0 0 16 16" x="0" y="1113">
+<path fill="#333" d="M13.631 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8zM6 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8z"></path>
+</svg>
+<svg id="icon-table-attr" width="16" height="16" viewBox="0 0 16 16" x="0" y="1134">
+<path fill="#333" d="M15.204 1.055h-14.364c-0.41 0-0.743 0.333-0.743 0.743v12.383c0 0.41 0.333 0.743 0.743 0.743h14.364c0.41 0 0.743-0.333 0.743-0.743v-12.383c0-0.41-0.333-0.743-0.743-0.743l-0-0zM15.204 4.027v2.903h-4.293v-2.903h4.293zM5.875 10.563v-2.889h4.293v2.889h-4.293zM10.168 11.306v2.875h-4.293v-2.875h4.293zM5.132 10.563h-4.293v-2.889h4.293v2.889zM10.168 4.027v2.903h-4.293v-2.903h4.293zM10.911 7.674h4.293v2.889h-4.293v-2.889zM6.040 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM3.811 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 4.027h3.55v2.903h-4.293l0-2.903h0.743zM0.839 11.306h4.293v2.875h-4.293v-2.875zM10.911 14.181v-2.875h4.293v2.875h-4.293z"></path>
+</svg>
+<svg id="icon-insert-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1155">
+<path fill="#333" d="M14 0h-2s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h2c0.552 0 1-0.448 1-1v-10c0-0.552-0.448-1-1-1zM14 11h-2v-3h2v3zM14 7h-2v-2h2v2zM14 4h-2v-3h2v3zM9 13l-2 3h5l-2-3h-1zM8 11v-10c0-0.552-0.448-1-1-1h-5s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h5c0.552 0 1-0.448 1-1zM7 7h-2v-2h2v2zM7 1v3h-2v-3h2zM4 11h-2v-3h2v3zM4 7h-2v-2h2v2zM4 4h-2v-3h2v3zM5 8h2v3h-2v-3z"></path>
+</svg>
+<svg id="icon-insert-row" width="18" height="16" viewBox="0 0 18 16" x="0" y="1176">
+<path fill="#333" d="M17.143 16h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143zM9.143 9.143h-3.429v2.286h3.429v-2.286zM9.143 12.571h-3.429v2.286h3.429v-2.286zM12.571 9.143h-2.286v2.286h2.286v-2.286zM12.571 12.571h-2.286v2.286h2.286v-2.286zM17.143 9.143h-3.429v2.286h3.429v-2.286zM13.714 12.571v2.286h3.429v-2.286h-3.429zM17.143 4.571h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143zM9.143 1.143h-3.429v2.286h3.429v-2.286zM12.571 1.143h-2.286v2.286h2.286v-2.286zM17.143 1.143h-3.429v2.286h3.429v-2.286zM0 3.429l3.429 2.286v1.143l-3.429 2.286v-5.714z"></path>
+</svg>
+<svg id="icon-merge-table" width="21" height="16" viewBox="0 0 21 16" x="0" y="1197">
+<path fill="#333" d="M1.484 2.296c0-0.615 0.242-1.198 0.682-1.63 0.43-0.432 1.005-0.666 1.62-0.666h0.016l10.845 0.059c0.615 0 1.198 0.242 1.63 0.682s0.666 1.021 0.666 1.637l-0.059 10.845c0 0.615-0.242 1.198-0.682 1.63-0.432 0.432-1.007 0.666-1.622 0.666h-0.016l-10.845-0.059c-0.615 0-1.198-0.242-1.63-0.682s-0.666-1.023-0.666-1.639l0.061-10.843zM6.199 1.048l-2.412-0.016c-0.333 0-0.65 0.134-0.897 0.374-0.242 0.242-0.374 0.556-0.374 0.897l-0.016 2.461h3.7v-3.716zM10.98 1.072l-3.742-0.024v3.718h3.742v-3.693zM12.020 14.463l2.552 0.016c0.341 0 0.658-0.124 0.897-0.365 0.242-0.242 0.374-0.556 0.374-0.897l0.016-2.579h-3.842v3.825zM12.020 9.598h3.844l0.016-3.793h-3.868v3.793h0.008zM12.020 4.765h3.868l0.016-2.396c0-0.333-0.124-0.658-0.365-0.897-0.242-0.242-0.556-0.374-0.897-0.374l-2.619-0.016v3.683z"></path>
+<path fill="#333" d="M5.005 1.478c0.008 0 0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-merge-td" width="16" height="16" viewBox="0 0 16 16" x="0" y="1218">
+<path fill="#333" d="M11.371 9.493h2.837v-2.987h-12.416v2.987h9.579zM0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333z"></path>
+</svg>
+<svg id="icon-remove-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1239">
+<path fill="#333" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM7 12h1v1h-1s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h5c0.552 0 1 0.448 1 1v7h-1v-3h-2v3h-1v-3h-2v3h1v1h-1v3zM10 4h2v-3h-2v3zM9 4v-3h-2v3h2zM1 13s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h2c0.552 0 1 0.448 1 1v12h-3zM3 1h-2v3h2v-3zM3 5h-2v3h2v-3zM3 9h-2v3h2v-3z"></path>
+</svg>
+<svg id="icon-remove-row" width="16" height="16" viewBox="0 0 16 16" x="0" y="1260">
+<path fill="#333" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM9 8h-4v2h1.667l0.333 1h-2v2h2.667l0.333 1h-7c-0.552 0-1-0.448-1-1v-5s0.448-1 1-1h12v1h-4zM4 8h-3v2h3v-2zM4 11h-3v2h3v-2zM1 4c-0.552 0-1-0.448-1-1v-2s0.448-1 1-1h11c0.552 0 1 0.448 1 1v3h-12zM4 1h-3v2h3v-2zM8 1h-3v2h3v-2zM12 1h-3v2h3v-2z"></path>
+</svg>
+<svg id="icon-remove-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="1281">
+<path fill="#333" d="M14.857 16v-3.429l3.429-2.286v3.429l-3.429 2.286zM8 11.429l4.571-3.429h5.714l-4.571 3.429h-5.714zM13.714 4.571h-3.429v3.429h-4.571v2.286h1.143v1.143h-5.714c-0.631 0-1.143-0.512-1.143-1.143v-9.143c0-0.631 0.512-1.143 1.143-1.143h12.571c0.631 0 1.143 0.512 1.143 1.143v5.714h-1.143v-2.286zM4.571 1.143h-3.429v2.286h3.429v-2.286zM4.571 4.571h-3.429v2.286h3.429v-2.286zM4.571 8h-3.429v2.286h3.429v-2.286zM9.143 1.143h-3.429v2.286h3.429v-2.286zM9.143 4.571h-3.429v2.286h3.429v-2.286zM13.714 1.143h-3.429v2.286h3.429v-2.286zM13.714 16h-5.714v-3.429h5.714v3.429z"></path>
+</svg>
+<svg id="icon-insert-col2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1302">
+<path fill="#333" d="M2 16h2s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v10c0 0.552 0.448 1 1 1zM2 5h2v3h-2v-3zM2 9h2v2h-2v-2zM2 12h2v3h-2v-3zM7 3l2-3h-5l2 3h1zM8 5v10c0 0.552 0.448 1 1 1h5s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-5c-0.552 0-1 0.448-1 1zM9 9h2v2h-2v-2zM9 15v-3h2v3h-2zM12 5h2v3h-2v-3zM12 9h2v2h-2v-2zM12 12h2v3h-2v-3zM11 8h-2v-3h2v3z"></path>
+</svg>
+<svg id="icon-insert-row2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1323">
+<path fill="#333" d="M1.154 0h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143zM9.154 6.857h3.429v-2.286h-3.429v2.286zM9.154 3.429h3.429v-2.286h-3.429v2.286zM5.725 6.857h2.286v-2.286h-2.286v2.286zM5.725 3.429h2.286v-2.286h-2.286v2.286zM1.154 6.857h3.429v-2.286h-3.429v2.286zM4.583 3.429v-2.286h-3.429v2.286h3.429zM1.154 11.429h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143zM9.154 14.857h3.429v-2.286h-3.429v2.286zM5.725 14.857h2.286v-2.286h-2.286v2.286zM1.154 14.857h3.429v-2.286h-3.429v2.286zM18.297 12.571l-3.429-2.286v-1.143l3.429-2.286v5.714z"></path>
+</svg>
+<svg id="icon-split-table" width="16" height="16" viewBox="0 0 16 16" x="0" y="1344">
+<path fill="#333" d="M0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333zM10.667 9.493v-2.987h-1.792v2.987h1.792zM14.208 9.493v-2.987h-1.792v2.987h1.792zM3.584 9.493v-2.987h-1.792v2.987h1.792zM7.125 9.493v-2.987h-1.792v2.987h1.792z"></path>
+</svg>
+<svg id="icon-merge-table2" width="21" height="16" viewBox="0 0 21 16" x="0" y="1365">
+<path fill="#333" d="M19.297 2.296c0-0.615-0.242-1.198-0.682-1.63-0.43-0.432-1.005-0.666-1.62-0.666h-0.016l-10.845 0.059c-0.615 0-1.198 0.242-1.63 0.682s-0.666 1.021-0.666 1.637l0.059 10.845c0 0.615 0.242 1.198 0.682 1.63 0.432 0.432 1.007 0.666 1.622 0.666h0.016l10.845-0.059c0.615 0 1.198-0.242 1.63-0.682s0.666-1.023 0.666-1.639l-0.061-10.843zM14.583 1.048l2.412-0.016c0.333 0 0.65 0.134 0.897 0.374 0.242 0.242 0.374 0.556 0.374 0.897l0.016 2.461h-3.7v-3.716zM9.801 1.072l3.742-0.024v3.718h-3.742v-3.693zM8.761 14.463l-2.552 0.016c-0.341 0-0.658-0.124-0.897-0.365-0.242-0.242-0.374-0.556-0.374-0.897l-0.016-2.579h3.842v3.825zM8.761 9.598h-3.844l-0.016-3.793h3.868v3.793h-0.008zM8.761 4.765h-3.868l-0.016-2.396c0-0.333 0.124-0.658 0.365-0.897 0.242-0.242 0.556-0.374 0.897-0.374l2.619-0.016v3.683z"></path>
+<path fill="#333" d="M15.777 1.478c-0.008 0-0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-remove2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1386">
+<path fill="#333" d="M6.214 13.804c0.401 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726zM15.299 1.464h-6.178v-0.726c0-0.401-0.325-0.726-0.727-0.726h-0.727c-0.401 0-0.727 0.325-0.727 0.726v0.726h-6.177c-0.008-0-0.017-0-0.026-0-0.401 0-0.726 0.325-0.726 0.726s0.325 0.726 0.726 0.726c0.009 0 0.018-0 0.027-0.001l-0.001 0h1.090v11.615c0.001 0.802 0.651 1.452 1.453 1.452 0 0 0.001 0 0.001 0h9.448c0 0 0.001 0 0.001 0 0.802 0 1.452-0.65 1.453-1.452v-11.615h1.090c0.008 0 0.017 0 0.026 0 0.401 0 0.726-0.325 0.726-0.726s-0.325-0.726-0.726-0.726c-0.009 0-0.018 0-0.027 0l0.001-0zM12.755 13.804c0 0.401-0.325 0.726-0.727 0.726h-7.994c-0.401 0-0.727-0.325-0.727-0.726v-10.889h9.448v10.889zM9.847 13.804c0.402 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726z"></path>
+</svg>
+<svg id="icon-ok" width="16" height="16" viewBox="0 0 16 16" x="0" y="1407">
+<path fill="#333" d="M8 16c-4.418 0-8-3.582-8-8s3.582-8 8-8c4.418 0 8 3.582 8 8s-3.582 8-8 8zM12.177 4.986l-4.894 4.894-3.364-3.365-0.918 0.918 4.282 4.283 5.811-5.812-0.917-0.918z"></path>
+</svg>
+<svg id="icon-remove" width="16" height="16" viewBox="0 0 16 16" x="0" y="1428">
+<path fill="#333" d="M8 1c-3.867 0-7 3.133-7 7s3.133 7 7 7 7-3.133 7-7c0-3.867-3.133-7-7-7zM11.167 10.7c0.133 0.133 0.133 0.333 0 0.467s-0.333 0.133-0.467 0l-2.7-2.7-2.7 2.7c-0.133 0.133-0.333 0.133-0.467 0s-0.133-0.333 0-0.467l2.7-2.7-2.7-2.7c-0.133-0.133-0.133-0.333 0-0.467s0.333-0.133 0.467 0l2.7 2.7 2.7-2.7c0.133-0.133 0.333-0.133 0.467 0s0.133 0.333 0 0.467l-2.7 2.7 2.7 2.7z"></path>
+</svg>
+<svg id="icon-graft2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1449">
+<path fill="#333" d="M11.658 0.504c0.216-0.218 0.516-0.354 0.848-0.354s0.631 0.135 0.847 0.354l1.664 1.664c0.217 0.217 0.351 0.517 0.351 0.848s-0.134 0.631-0.351 0.848l-9.336 9.336c-0.468 0.468-1.365 0.954-2.024 1.089l-3.048 0.625 0.625-3.048c0.133-0.65 0.62-1.557 1.088-2.025l9.336-9.336zM9.96 2.202l-0.848 0.849 3.358 3.359 0.849-0.849-3.359-3.359zM12.184 12.804c0.905-0.457 1.054-0.865 0.639-1.526-0.338-0.537-1.675-0.285-1.797 0.805-0.044 0.398 0.117 0.753 0.421 1.026 0.28-0.096 0.525-0.197 0.737-0.305zM13.063 13.682c-0.092 0.059-0.206 0.124-0.322 0.183l-0.025 0.012c-0.396 0.201-0.877 0.38-1.442 0.54-1.27 0.36-2.968 0.617-5.104 0.781-0.013 0.001-0.028 0.002-0.043 0.002-0.314 0-0.572-0.243-0.594-0.552l-0-0.002c-0.001-0.014-0.002-0.031-0.002-0.048 0-0.313 0.24-0.57 0.547-0.596l0.002-0c1.652-0.127 3.021-0.311 4.101-0.548 0.479-0.104 0.901-0.22 1.266-0.345 0.367 0.331 0.943 0.544 1.616 0.573 0.981 0.043 2.17-0.303 3.22-1.242 0.104-0.093 0.242-0.15 0.393-0.15 0.177 0 0.336 0.078 0.444 0.202l0.001 0.001c0.093 0.106 0.149 0.245 0.149 0.398 0 0.178-0.077 0.338-0.2 0.449l-0.001 0c-1.888 1.687-4.29 1.855-5.796 1.079-0.462-0.238-0.84-0.565-1.093-0.964-0.221-0.346-0.353-0.767-0.353-1.219 0-0.101 0.007-0.2 0.019-0.297l-0.001 0.011c0.25-2.25 3.058-2.78 3.979-1.315 0.752 1.197 0.45 2.291-0.762 3.048z"></path>
+</svg>
+<svg id="icon-func" width="17" height="16" viewBox="0 0 17 16" x="0" y="1470">
+<path fill="#333" d="M0.531 15.51v-2.065h4.213c-1.236-0.919-2.162-1.924-2.78-3.018-0.582-1.007-0.926-2.215-0.926-3.503 0-0.014 0-0.029 0-0.043l-0 0.002c0-1.992 0.695-3.612 2.086-4.861 1.39-1.25 3.193-1.874 5.406-1.874 2.215 0 4.017 0.625 5.408 1.874s2.086 2.869 2.086 4.86c0 1.263-0.309 2.441-0.927 3.535s-1.544 2.103-2.78 3.028h4.213v2.065h-6.854v-2.065c1.012-0.756 1.772-1.663 2.278-2.72 0.506-1.056 0.76-2.263 0.76-3.62 0-1.519-0.373-2.715-1.12-3.59-0.745-0.874-1.767-1.31-3.063-1.31s-2.317 0.438-3.063 1.316c-0.746 0.877-1.119 2.076-1.119 3.595 0 1.356 0.253 2.562 0.76 3.615s1.265 1.958 2.278 2.714v2.065h-6.857z"></path>
+</svg>
+<svg id="icon-find" width="16" height="16" viewBox="0 0 16 16" x="0" y="1491">
+<path fill="#333" d="M1 0h6v1h-6zM9 0h6v1h-6zM14.875 5h-0.875v-4h-4v4h-4v-4h-4v4h-0.875c-0.619 0-1.125 0.506-1.125 1.125v8.75c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-5.875h2v5.875c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-8.75c0-0.619-0.506-1.125-1.125-1.125zM5.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5zM8.5 8h-1c-0.275 0-0.5-0.225-0.5-0.5s0.225-0.5 0.5-0.5h1c0.275 0 0.5 0.225 0.5 0.5s-0.225 0.5-0.5 0.5zM14.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5z"></path>
+</svg>
+<svg id="icon-date" width="16" height="16" viewBox="0 0 16 16" x="0" y="1512">
+<path fill="#333" d="M13.597 2.081h-0.584v2.837c0 0.603-0.489 1.093-1.093 1.093s-1.092-0.49-1.092-1.093v-2.837h-5.64v2.83c0 0.604-0.49 1.094-1.094 1.094-0.603 0-1.092-0.49-1.092-1.094v-2.83h-0.6c-0.775 0-1.402 0.628-1.402 1.402v3.070h14v-3.070c0-0.774-0.627-1.402-1.403-1.402zM4.927 4.612c0 0.463-0.376 0.837-0.837 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.375-0.837 0.837-0.837v0c0.461 0 0.837 0.374 0.837 0.837v2.76zM12.78 4.612c0 0.463-0.374 0.837-0.838 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.374-0.837 0.837-0.837v0c0.464 0 0.838 0.374 0.838 0.837v2.76zM14.182 7.133v5.608c0 0.774-0.627 1.401-1.401 1.401h-9.573c-0.774 0-1.401-0.627-1.401-1.401v-5.608h-0.807v6.45c0 0.774 0.627 1.403 1.403 1.403h11.193c0.776 0 1.403-0.629 1.403-1.403v-6.45h-0.817zM8.393 11.198h1.101c0.109 0.504 0.389 0.649 0.662 0.649 0.405 0 0.651-0.262 0.651-0.723 0-0.26-0.097-0.626-0.651-0.64h-0.351v-0.69h0.159c0.554-0.014 0.687-0.241 0.687-0.66 0-0.271-0.201-0.468-0.526-0.477-0.426-0.011-0.491 0.185-0.598 0.443l-1.031 0.002c0.239-0.793 0.793-1.196 1.661-1.21 1.052 0.028 1.597 0.453 1.635 1.274 0 0.403-0.232 0.708-0.692 0.909 0.589 0.202 0.885 0.563 0.885 1.080-0.037 0.865-0.646 1.319-1.827 1.362-0.998 0.001-1.599-0.483-1.765-1.319zM7.633 11.479v0.975h-3.543v-0.629c0.386-0.605 0.771-1.059 1.492-1.52 0.663-0.433 0.894-0.763 0.894-1.080 0-0.070 0.003-0.433-0.531-0.433-0.372 0.014-0.645 0.182-0.645 0.565l-1.128 0.007c0.065-1.087 0.95-1.473 1.856-1.473 1.032 0.043 1.586 0.482 1.66 1.317 0.037 0.563-0.28 1.101-1.148 1.634-0.48 0.287-0.523 0.319-0.817 0.636h1.91z"></path>
+</svg>
+<svg id="icon-clock" width="16" height="16" viewBox="0 0 16 16" x="0" y="1533">
+<path fill="#333" d="M11.331 7.805h-2.732v-2.199c0-0.333-0.267-0.6-0.6-0.6s-0.6 0.267-0.6 0.6v2.932c0.067 0.267 0.267 0.466 0.533 0.466h3.398c0.333 0 0.6-0.267 0.6-0.6s-0.267-0.6-0.6-0.6zM13.53 3.074c-1.399-1.399-3.331-2.199-5.53-2.199-2.132 0-4.131 0.866-5.53 2.199-1.399 1.399-2.265 3.265-2.265 5.33s0.866 3.998 2.265 5.33c1.399 1.399 3.331 2.199 5.53 2.199 2.132 0 4.131-0.866 5.53-2.199 1.399-1.399 2.265-3.265 2.265-5.33s-0.866-3.998-2.265-5.33zM12.664 12.935c-1.199 1.133-2.865 1.866-4.664 1.866s-3.465-0.733-4.664-1.866c-1.199-1.133-1.932-2.732-1.932-4.531s0.733-3.398 1.932-4.531c1.199-1.133 2.865-1.866 4.664-1.866s3.465 0.733 4.664 1.866c1.199 1.133 1.932 2.798 1.932 4.531 0 1.799-0.733 3.398-1.932 4.531zM1.271 2.874l2.332-1.866c0.267-0.2 0.267-0.6 0.067-0.8-0.2-0.267-0.6-0.267-0.866-0.067l-2.332 1.866c-0.267 0.2-0.333 0.6-0.067 0.8 0.2 0.267 0.6 0.267 0.866 0.067zM14.729 2.874c0.267 0.2 0.666 0.133 0.866-0.067 0.2-0.267 0.133-0.6-0.067-0.8l-2.332-1.866c-0.267-0.2-0.666-0.133-0.866 0.067-0.2 0.267-0.2 0.6 0.067 0.8l2.332 1.866z"></path>
+</svg>
+</svg>
diff --git a/addons/nkeditor/assets/themes/blue/editor.css b/addons/nkeditor/assets/themes/blue/editor.css
new file mode 100644
index 0000000..7a14292
--- /dev/null
+++ b/addons/nkeditor/assets/themes/blue/editor.css
@@ -0,0 +1,822 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+.ke-container-blue .ke-toolbar {
+  border-top: 5px solid #1296db;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  background-clip: padding-box;
+  text-rendering: optimizelegibility; }
+  .ke-container-blue .ke-toolbar .ke-toolbar-icon {
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-container-blue .ke-toolbar .ke-icon-source {
+    background-position: 0 0px; }
+  .ke-container-blue .ke-toolbar .ke-icon-preview {
+    background-position: 0 -63px; }
+  .ke-container-blue .ke-toolbar .ke-icon-print {
+    background-position: 0 -84px; }
+  .ke-container-blue .ke-toolbar .ke-icon-undo {
+    background-position: 0 -21px; }
+  .ke-container-blue .ke-toolbar .ke-icon-redo {
+    background-position: 0 -42px; }
+  .ke-container-blue .ke-toolbar .ke-icon-template {
+    background-position: 0 -105px; }
+  .ke-container-blue .ke-toolbar .ke-icon-cut {
+    background-position: 0 -147px; }
+  .ke-container-blue .ke-toolbar .ke-icon-copy {
+    background-position: 0 -168px; }
+  .ke-container-blue .ke-toolbar .ke-icon-paste {
+    background-position: 0 -189px; }
+  .ke-container-blue .ke-toolbar .ke-icon-selectall {
+    background-position: 0 -483px; }
+  .ke-container-blue .ke-toolbar .ke-icon-justifyleft {
+    background-position: 0 -252px; }
+  .ke-container-blue .ke-toolbar .ke-icon-justifycenter {
+    background-position: 0 -273px; }
+  .ke-container-blue .ke-toolbar .ke-icon-justifyright {
+    background-position: 0 -294px; }
+  .ke-container-blue .ke-toolbar .ke-icon-justifyfull {
+    background-position: 0 -315px; }
+  .ke-container-blue .ke-toolbar .ke-icon-insertorderedlist {
+    background-position: 0 -336px; }
+  .ke-container-blue .ke-toolbar .ke-icon-insertunorderedlist {
+    background-position: 0 -357px; }
+  .ke-container-blue .ke-toolbar .ke-icon-indent {
+    background-position: 0 -378px; }
+  .ke-container-blue .ke-toolbar .ke-icon-outdent {
+    background-position: 0 -399px; }
+  .ke-container-blue .ke-toolbar .ke-icon-subscript {
+    background-position: 0 -420px; }
+  .ke-container-blue .ke-toolbar .ke-icon-superscript {
+    background-position: 0 -441px; }
+  .ke-container-blue .ke-toolbar .ke-icon-date {
+    background-position: 0px -304px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-time {
+    background-position: 0px -320px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-formatblock {
+    background-position: 0 -546px; }
+  .ke-container-blue .ke-toolbar .ke-icon-fontname {
+    background-position: 0 -567px; }
+  .ke-container-blue .ke-toolbar .ke-icon-fontsize {
+    background-position: 0 -588px; }
+  .ke-container-blue .ke-toolbar .ke-icon-forecolor {
+    background-position: 0 -609px; }
+  .ke-container-blue .ke-toolbar .ke-icon-hilitecolor {
+    background-position: 0 -630px; }
+  .ke-container-blue .ke-toolbar .ke-icon-bold {
+    background-position: 0 -651px; }
+  .ke-container-blue .ke-toolbar .ke-icon-italic {
+    background-position: 0 -672px; }
+  .ke-container-blue .ke-toolbar .ke-icon-underline {
+    background-position: 0 -693px; }
+  .ke-container-blue .ke-toolbar .ke-icon-strikethrough {
+    background-position: 0 -714px; }
+  .ke-container-blue .ke-toolbar .ke-icon-removeformat {
+    background-position: 0 -756px; }
+  .ke-container-blue .ke-toolbar .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-container-blue .ke-toolbar .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-container-blue .ke-toolbar .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-container-blue .ke-toolbar .ke-icon-div {
+    background-position: 0px -544px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-formula {
+    background-position: 0px -576px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-hr {
+    background-position: 0 -924px; }
+  .ke-container-blue .ke-toolbar .ke-icon-emoticons {
+    background-position: 0 -945px; }
+  .ke-container-blue .ke-toolbar .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-container-blue .ke-toolbar .ke-icon-unlink {
+    background-position: 0 -1029px; }
+  .ke-container-blue .ke-toolbar .ke-icon-fullscreen {
+    background-position: 0 -525px; }
+  .ke-container-blue .ke-toolbar .ke-icon-about {
+    background-position: 0 -1092px; }
+  .ke-container-blue .ke-toolbar .ke-icon-quote {
+    background-position: 0 -1114px; }
+  .ke-container-blue .ke-toolbar .ke-icon-plainpaste {
+    background-position: 0 -210px; }
+  .ke-container-blue .ke-toolbar .ke-icon-wordpaste {
+    background-position: 0 -231px; }
+  .ke-container-blue .ke-toolbar .ke-icon-table {
+    background-position: 0px -903px;
+    width: 18px !important; }
+  .ke-container-blue .ke-toolbar .ke-icon-tablemenu {
+    background-position: 0px -768px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-code {
+    background-position: 0 -126px; }
+  .ke-container-blue .ke-toolbar .ke-icon-map {
+    background-position: 0px -976px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-baidumap {
+    background-position: 0 -1050px; }
+  .ke-container-blue .ke-toolbar .ke-icon-lineheight {
+    background-position: 0 -735px; }
+  .ke-container-blue .ke-toolbar .ke-icon-clearhtml {
+    background-position: 0 -462px; }
+  .ke-container-blue .ke-toolbar .ke-icon-pagebreak {
+    background-position: 0 -966px; }
+  .ke-container-blue .ke-toolbar .ke-icon-insertfile {
+    background-position: 0 -882px; }
+  .ke-container-blue .ke-toolbar .ke-icon-quickformat {
+    background-position: 0 -504px; }
+  .ke-container-blue .ke-toolbar .ke-icon-anchor {
+    background-position: 0 -987px; }
+  .ke-container-blue .ke-toolbar .ke-icon-search {
+    background-position: 0px -1184px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-new {
+    background-position: 0px -1200px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-specialchar {
+    background-position: 0px -1216px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-multiimage {
+    background-position: 0 -798px; }
+  .ke-container-blue .ke-toolbar .ke-icon-graft {
+    background-position: 0 -819px; }
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-blue .ke-menu-item .ke-menu-item-left {
+  width: 27px;
+  text-align: center;
+  overflow: hidden; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert {
+    background-position: 0 -903px;
+    width: 18px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete {
+    background-position: 0 -1428px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft {
+    background-position: 0 -1176px;
+    width: 18px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright {
+    background-position: 0 -1323px;
+    width: 18px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove {
+    background-position: 0 -1302px;
+    width: 22px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow {
+    background-position: 0 -1155px;
+    width: 22px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete {
+    background-position: 0 -1239px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete {
+    background-position: 0 -1260px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop {
+    background-position: 0 -1218px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tableprop {
+    background-position: 0 -1134px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit {
+    background-position: 0px -1088px;
+    width: 16px;
+    height: 16px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge {
+    background-position: -1px -1197px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge {
+    background-position: -4px -1365px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-checked {
+    background-position: 0 -1407px; }
+
+/*# sourceMappingURL=editor.css.map */
diff --git a/addons/nkeditor/assets/themes/blue/editor.css.map b/addons/nkeditor/assets/themes/blue/editor.css.map
new file mode 100644
index 0000000..01a6d6f
--- /dev/null
+++ b/addons/nkeditor/assets/themes/blue/editor.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../common/common.scss","editor.scss"],
+"names": [],
+"file": "editor.css"
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/blue/editor.min.css b/addons/nkeditor/assets/themes/blue/editor.min.css
new file mode 100644
index 0000000..5297fab
--- /dev/null
+++ b/addons/nkeditor/assets/themes/blue/editor.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ke-clearfix{zoom:1;clear:both}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-dialog-lock{background-color:#fff;opacity:.5;z-index:811213;left:0;top:0;position:absolute}.ke-container{display:block;background-color:#fff;overflow:hidden;margin:0;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16)}.ke-container .ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-container .ke-dialog a,.ke-container .ke-dialog a:hover,.ke-container .ke-menu a,.ke-container .ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-container .ke-toolbar{text-align:left;overflow:hidden;zoom:1;padding:0 5px}.ke-container .ke-toolbar .ke-outline{padding:10px 5px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-container .ke-toolbar .ke-outline .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px}.ke-container .ke-toolbar .ke-on{background:#ebebeb}.ke-container .ke-toolbar .ke-selected{background-color:#ebebeb}.ke-container .ke-toolbar .ke-disabled{cursor:default}.ke-container .ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-container .ke-toolbar .ke-hr{clear:both;height:1px;width:calc(100% - (2 * 2px));background:#ebebeb}.ke-container .ke-edit{padding:0}.ke-container .ke-edit .ke-edit-iframe,.ke-container .ke-edit .ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-container .ke-edit .ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-container .ke-edit .ke-edit-textarea:focus{outline:0}.ke-container .ke-statusbar{position:relative;background-color:#f5f5f5;border-top:1px solid #e1e1e1;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize;display:none}.ke-container .ke-statusbar .ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px}.ke-container .ke-statusbar .ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;width:11px;height:11px}.ke-menu{border:1px solid #ccc;background-color:#f5f5f5;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu .ke-menu-item .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-inline-block .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu .ke-menu-item .ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu .ke-menu-item .ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #e1e1e1;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-menu .ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons{position:relative}.ke-menu .ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img{border:0;margin:0;padding:0}.ke-menu .ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell{margin:0;padding:1px;border:1px solid #f5f5f5;cursor:pointer}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-menu .ke-plugin-emoticons .ke-table .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker .ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f1f1f1;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-dialog{margin:0;padding:0;border:1px solid #ccc;zoom:1;box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden}.ke-dialog .ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom:1px solid #c6c6c6;background:transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.ke-dialog .ke-dialog-header .ke-dialog-icon-close{height:20px;width:20px;cursor:pointer;background:url(../common/icons-all.gif) 0 -59px;position:absolute;right:5px;top:4px}.ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover{background-position:0 -89px}.ke-dialog .ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border:1px solid #ccc}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus{border-color:#66afe9;outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto;border:1px solid #ccc;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number{width:50px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox{position:relative;top:6px}.ke-dialog .ke-dialog-content .ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus{outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text{display:inline-block!important;max-width:400px;height:30px;line-height:30px;border:1px solid #ccc;font-size:14px;margin:0;outline:0;padding:0 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus{border-color:#66afe9}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color{border:1px solid #e1e1e1;background-color:#fff;font-size:12px;width:60px;height:30px;line-height:30px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0;top:-1px;position:relative}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:62px;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common{top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button{padding:8px 15px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner{padding:10px 20px 0 20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row{border:1px solid #fff;margin-bottom:10px;overflow:hidden}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left{float:left;height:30px;line-height:30px;width:60px;text-align:right}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right{float:left;text-align:left}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button{position:relative;top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label{cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header{height:30px;line-height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text{height:22px;line-height:22px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button{padding:3px 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox{margin-left:10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #e1e1e1;margin-bottom:20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul{list-style:none outside none;margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected{background-color:#fff;border:1px solid #e1e1e1;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on{background-color:#fff;color:#000}.ke-dialog .ke-dialog-content .ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat center;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog .ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;height:40px}.ke-dialog .ke-dialog-footer .ke-dialog-yes{margin:5px}.ke-dialog .ke-dialog-footer .ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog .ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-dialog .ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:7px 10px;margin-top:-4px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-dialog .ke-button:hover{border:1px solid #e1e1e1;background-color:#e1e1e1}.ke-dialog .ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog .ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-container-blue .ke-toolbar{border-top:5px solid #1296db;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);background-clip:padding-box;text-rendering:optimizelegibility}.ke-container-blue .ke-toolbar .ke-toolbar-icon{background:url(images/nkeditor.svg) no-repeat}.ke-container-blue .ke-toolbar .ke-icon-source{background-position:0 0}.ke-container-blue .ke-toolbar .ke-icon-preview{background-position:0 -63px}.ke-container-blue .ke-toolbar .ke-icon-print{background-position:0 -84px}.ke-container-blue .ke-toolbar .ke-icon-undo{background-position:0 -21px}.ke-container-blue .ke-toolbar .ke-icon-redo{background-position:0 -42px}.ke-container-blue .ke-toolbar .ke-icon-template{background-position:0 -105px}.ke-container-blue .ke-toolbar .ke-icon-cut{background-position:0 -147px}.ke-container-blue .ke-toolbar .ke-icon-copy{background-position:0 -168px}.ke-container-blue .ke-toolbar .ke-icon-paste{background-position:0 -189px}.ke-container-blue .ke-toolbar .ke-icon-selectall{background-position:0 -483px}.ke-container-blue .ke-toolbar .ke-icon-justifyleft{background-position:0 -252px}.ke-container-blue .ke-toolbar .ke-icon-justifycenter{background-position:0 -273px}.ke-container-blue .ke-toolbar .ke-icon-justifyright{background-position:0 -294px}.ke-container-blue .ke-toolbar .ke-icon-justifyfull{background-position:0 -315px}.ke-container-blue .ke-toolbar .ke-icon-insertorderedlist{background-position:0 -336px}.ke-container-blue .ke-toolbar .ke-icon-insertunorderedlist{background-position:0 -357px}.ke-container-blue .ke-toolbar .ke-icon-indent{background-position:0 -378px}.ke-container-blue .ke-toolbar .ke-icon-outdent{background-position:0 -399px}.ke-container-blue .ke-toolbar .ke-icon-subscript{background-position:0 -420px}.ke-container-blue .ke-toolbar .ke-icon-superscript{background-position:0 -441px}.ke-container-blue .ke-toolbar .ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-formatblock{background-position:0 -546px}.ke-container-blue .ke-toolbar .ke-icon-fontname{background-position:0 -567px}.ke-container-blue .ke-toolbar .ke-icon-fontsize{background-position:0 -588px}.ke-container-blue .ke-toolbar .ke-icon-forecolor{background-position:0 -609px}.ke-container-blue .ke-toolbar .ke-icon-hilitecolor{background-position:0 -630px}.ke-container-blue .ke-toolbar .ke-icon-bold{background-position:0 -651px}.ke-container-blue .ke-toolbar .ke-icon-italic{background-position:0 -672px}.ke-container-blue .ke-toolbar .ke-icon-underline{background-position:0 -693px}.ke-container-blue .ke-toolbar .ke-icon-strikethrough{background-position:0 -714px}.ke-container-blue .ke-toolbar .ke-icon-removeformat{background-position:0 -756px}.ke-container-blue .ke-toolbar .ke-icon-image{background-position:0 -777px}.ke-container-blue .ke-toolbar .ke-icon-flash{background-position:0 -840px}.ke-container-blue .ke-toolbar .ke-icon-media{background-position:0 -861px}.ke-container-blue .ke-toolbar .ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-hr{background-position:0 -924px}.ke-container-blue .ke-toolbar .ke-icon-emoticons{background-position:0 -945px}.ke-container-blue .ke-toolbar .ke-icon-link{background-position:0 -1008px}.ke-container-blue .ke-toolbar .ke-icon-unlink{background-position:0 -1029px}.ke-container-blue .ke-toolbar .ke-icon-fullscreen{background-position:0 -525px}.ke-container-blue .ke-toolbar .ke-icon-about{background-position:0 -1092px}.ke-container-blue .ke-toolbar .ke-icon-quote{background-position:0 -1114px}.ke-container-blue .ke-toolbar .ke-icon-plainpaste{background-position:0 -210px}.ke-container-blue .ke-toolbar .ke-icon-wordpaste{background-position:0 -231px}.ke-container-blue .ke-toolbar .ke-icon-table{background-position:0 -903px;width:18px!important}.ke-container-blue .ke-toolbar .ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-code{background-position:0 -126px}.ke-container-blue .ke-toolbar .ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-baidumap{background-position:0 -1050px}.ke-container-blue .ke-toolbar .ke-icon-lineheight{background-position:0 -735px}.ke-container-blue .ke-toolbar .ke-icon-clearhtml{background-position:0 -462px}.ke-container-blue .ke-toolbar .ke-icon-pagebreak{background-position:0 -966px}.ke-container-blue .ke-toolbar .ke-icon-insertfile{background-position:0 -882px}.ke-container-blue .ke-toolbar .ke-icon-quickformat{background-position:0 -504px}.ke-container-blue .ke-toolbar .ke-icon-anchor{background-position:0 -987px}.ke-container-blue .ke-toolbar .ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-multiimage{background-position:0 -798px}.ke-container-blue .ke-toolbar .ke-icon-graft{background-position:0 -819px}.ke-menu-blue .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px;background:url(images/nkeditor.svg) no-repeat}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert{background-position:0 -903px;width:18px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete{background-position:0 -1428px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft{background-position:0 -1176px;width:18px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright{background-position:0 -1323px;width:18px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove{background-position:0 -1302px;width:22px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow{background-position:0 -1155px;width:22px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete{background-position:0 -1239px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete{background-position:0 -1260px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop{background-position:0 -1218px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tableprop{background-position:0 -1134px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge{background-position:-1px -1197px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit{background-position:0 -1344px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge{background-position:-4px -1365px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit{background-position:0 -1344px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-image{background-position:0 -777px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-flash{background-position:0 -840px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-media{background-position:0 -861px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-link{background-position:0 -1008px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-checked{background-position:0 -1407px}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/blue/editor.scss b/addons/nkeditor/assets/themes/blue/editor.scss
new file mode 100644
index 0000000..56739c1
--- /dev/null
+++ b/addons/nkeditor/assets/themes/blue/editor.scss
@@ -0,0 +1,387 @@
+@import "../common/common";
+
+.ke-container-blue {
+    .ke-toolbar {
+
+        border-top: 5px solid #1296db;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+        background-clip: padding-box;
+        text-rendering: optimizelegibility;
+
+        .ke-toolbar-icon {
+            *background-image: url(images/nkeditor.png);
+            background: url(images/nkeditor.svg) no-repeat;
+        }
+
+        .ke-icon-source {
+            background-position: 0 0px;
+        }
+        .ke-icon-preview {
+            background-position: 0 -63px;
+        }
+        .ke-icon-print {
+            background-position: 0 -84px;
+        }
+        .ke-icon-undo {
+            background-position: 0 -21px;
+        }
+
+        .ke-icon-redo {
+            background-position: 0 -42px;
+        }
+
+        .ke-icon-template {
+            background-position: 0 -105px;
+        }
+
+        .ke-icon-cut {
+            background-position: 0 -147px;
+        }
+
+        .ke-icon-copy {
+            background-position: 0 -168px;
+        }
+
+        .ke-icon-paste {
+            background-position: 0 -189px;
+        }
+
+        .ke-icon-selectall {
+            background-position: 0 -483px;
+        }
+
+        .ke-icon-justifyleft {
+            background-position: 0 -252px;
+        }
+
+        .ke-icon-justifycenter {
+            background-position: 0 -273px;
+        }
+
+        .ke-icon-justifyright {
+            background-position: 0 -294px;
+        }
+
+        .ke-icon-justifyfull {
+            background-position: 0 -315px;
+        }
+
+        .ke-icon-insertorderedlist {
+            background-position: 0 -336px;
+        }
+
+        .ke-icon-insertunorderedlist {
+            background-position: 0 -357px;
+        }
+
+        .ke-icon-indent {
+            background-position: 0 -378px;
+        }
+
+        .ke-icon-outdent {
+            background-position: 0 -399px;
+        }
+
+        .ke-icon-subscript {
+            background-position: 0 -420px;
+        }
+
+        .ke-icon-superscript {
+            background-position: 0 -441px;
+        }
+
+        .ke-icon-date {
+            background-position: 0px -304px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-time {
+            background-position: 0px -320px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-formatblock {
+            background-position: 0 -546px;
+        }
+
+        .ke-icon-fontname {
+            background-position: 0 -567px;
+        }
+
+        .ke-icon-fontsize {
+            background-position: 0 -588px;
+        }
+
+        .ke-icon-forecolor {
+            background-position: 0 -609px;
+        }
+
+        .ke-icon-hilitecolor {
+            background-position: 0 -630px;
+        }
+
+        .ke-icon-bold {
+            background-position: 0 -651px;
+        }
+
+        .ke-icon-italic {
+            background-position: 0 -672px;
+        }
+
+        .ke-icon-underline {
+            background-position: 0 -693px;
+        }
+
+        .ke-icon-strikethrough {
+            background-position: 0 -714px;
+        }
+
+        .ke-icon-removeformat {
+            background-position: 0 -756px;
+        }
+
+        .ke-icon-image {
+            background-position: 0 -777px;
+        }
+
+        .ke-icon-flash {
+            background-position: 0 -840px;
+        }
+
+        .ke-icon-media {
+            background-position: 0 -861px;
+        }
+
+        .ke-icon-div {
+            background-position: 0px -544px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-formula {
+            background-position: 0px -576px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-hr {
+            background-position: 0 -924px;
+        }
+
+        .ke-icon-emoticons {
+            background-position: 0 -945px;
+        }
+
+        .ke-icon-link {
+            background-position: 0 -1008px;
+        }
+
+        .ke-icon-unlink {
+            background-position: 0 -1029px;
+        }
+
+        .ke-icon-fullscreen {
+            background-position: 0 -525px;
+        }
+
+        .ke-icon-about {
+            background-position: 0 -1092px;
+        }
+
+        .ke-icon-quote {
+            background-position: 0 -1114px;
+        }
+
+        .ke-icon-plainpaste {
+            background-position: 0 -210px;
+        }
+
+        .ke-icon-wordpaste {
+            background-position: 0 -231px;
+        }
+
+        .ke-icon-table {
+            background-position: 0px -903px;
+            width: 18px !important;
+        }
+
+        .ke-icon-tablemenu {
+            background-position: 0px -768px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-code {
+            background-position: 0 -126px;
+        }
+
+        .ke-icon-map {
+            background-position: 0px -976px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-baidumap {
+            background-position: 0 -1050px;
+        }
+
+        .ke-icon-lineheight {
+            background-position: 0 -735px;
+        }
+
+        .ke-icon-clearhtml {
+            background-position: 0 -462px;
+        }
+
+        .ke-icon-pagebreak {
+            background-position: 0 -966px;
+        }
+
+        .ke-icon-insertfile {
+            background-position: 0 -882px;
+        }
+
+        .ke-icon-quickformat {
+            background-position: 0 -504px;
+        }
+
+        .ke-icon-anchor {
+            background-position: 0 -987px;
+        }
+
+        .ke-icon-search {
+            background-position: 0px -1184px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-new {
+            background-position: 0px -1200px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-specialchar {
+            background-position: 0px -1216px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-multiimage {
+            background-position: 0 -798px;
+        }
+
+        .ke-icon-graft {
+            background-position: 0 -819px;
+        }
+    }
+}
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-blue {
+
+    .ke-menu-item {
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+                *background-image: url(images/nkeditor.png);
+                background: url(images/nkeditor.svg) no-repeat;
+            }
+
+            .ke-icon-tableinsert {
+                background-position: 0 -903px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tabledelete {
+                background-position: 0 -1428px;
+            }
+
+            .ke-icon-tablecolinsertleft {
+                background-position: 0 -1176px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablecolinsertright {
+                background-position: 0 -1323px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablerowinsertabove {
+                background-position: 0 -1302px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablerowinsertbelow {
+                background-position: 0 -1155px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablecoldelete {
+                background-position: 0 -1239px;
+            }
+
+            .ke-icon-tablerowdelete {
+                background-position: 0 -1260px;
+            }
+
+            .ke-icon-tablecellprop {
+                background-position: 0 -1218px;
+            }
+
+            .ke-icon-tableprop {
+                background-position: 0 -1134px;
+            }
+            .ke-icon-tablecellsplit {
+                background-position: 0px -1088px;
+                width: 16px;
+                height: 16px;
+            }
+
+            .ke-icon-tablerowmerge {
+                background-position: -1px -1197px;
+            }
+
+            .ke-icon-tablerowsplit {
+                background-position: 0 -1344px;
+            }
+
+            .ke-icon-tablecolmerge {
+                background-position: -4px -1365px;
+            }
+
+            .ke-icon-tablecolsplit {
+                background-position: 0 -1344px;
+            }
+
+            //图片,视频右键菜单
+            .ke-icon-image {
+                background-position: 0 -777px;
+            }
+            .ke-icon-flash {
+                background-position: 0 -840px;
+            }
+            .ke-icon-media {
+                background-position: 0 -861px;
+            }
+            .ke-icon-link {
+                background-position: 0 -1008px;
+            }
+
+            .ke-icon-checked {
+                background-position: 0 -1407px;
+            }
+
+        }
+    }
+}
+//menu end
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/blue/images/nkeditor.png b/addons/nkeditor/assets/themes/blue/images/nkeditor.png
new file mode 100644
index 0000000..6cf968a
Binary files /dev/null and b/addons/nkeditor/assets/themes/blue/images/nkeditor.png differ
diff --git a/addons/nkeditor/assets/themes/blue/images/nkeditor.svg b/addons/nkeditor/assets/themes/blue/images/nkeditor.svg
new file mode 100644
index 0000000..5f12453
--- /dev/null
+++ b/addons/nkeditor/assets/themes/blue/images/nkeditor.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="1549" viewBox="0 0 21 1549">
+<svg id="icon-source-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="0">
+<path fill="#1296db" d="M14.4 16h-12.8c-0.884 0-1.6-0.716-1.6-1.6v-12.8c0-0.884 0.716-1.6 1.6-1.6h12.8c0.884 0 1.6 0.716 1.6 1.6v12.8c0 0.884-0.716 1.6-1.6 1.6zM14.4 2.4h-12.8v12h12.8v-12zM6.4 5.6l-2.4 3.2 2.4 2.4-0.8 0.8-3.2-3.2 3.2-4 0.8 0.8zM9.6 4l-1.6 8.8h-1.6l1.6-8.8h1.6zM10.4 4.8l3.2 4-3.2 3.2-0.8-0.8 2.4-2.4-2.4-3.2 0.8-0.8z"></path>
+</svg>
+<svg id="icon-undo" width="16" height="16" viewBox="0 0 16 16" x="0" y="21">
+<path fill="#1296db" d="M12.161 16c1.777-3.219 2.076-8.13-4.904-7.966v3.966l-6-6 6-6v3.881c8.359-0.218 9.29 7.378 4.904 12.119z"></path>
+</svg>
+<svg id="icon-redo" width="16" height="16" viewBox="0 0 16 16" x="0" y="42">
+<path fill="#1296db" d="M9 3.881v-3.881l6 6-6 6v-3.966c-6.981-0.164-6.681 4.747-4.904 7.966-4.386-4.741-3.454-12.337 4.904-12.119z"></path>
+</svg>
+<svg id="icon-preview" width="16" height="16" viewBox="0 0 16 16" x="0" y="63">
+<path fill="#1296db" d="M11.566 10.552c1.261-1.733 1.095-4.134-0.425-5.645-0.827-0.827-1.922-1.275-3.089-1.275-1.166 0-2.261 0.456-3.089 1.275-0.811 0.827-1.269 1.922-1.269 3.086s0.456 2.259 1.277 3.086c0.827 0.827 1.922 1.275 3.089 1.275 0.922 0 1.805-0.291 2.561-0.85l2.269 2.259c0.127 0.127 0.292 0.197 0.473 0.197s0.347-0.070 0.473-0.197c0.259-0.259 0.259-0.684 0-0.945l-2.27-2.266zM5.916 10.134c-1.181-1.181-1.181-3.094 0-4.275 0.575-0.575 1.331-0.881 2.142-0.881s1.567 0.316 2.142 0.881c1.181 1.181 1.181 3.094 0 4.275-1.141 1.133-3.142 1.133-4.284 0z"></path>
+<path fill="#1296db" d="M11.431 1h-6.855c-1.969 0-3.577 1.598-3.577 3.575v6.85c0 1.969 1.6 3.575 3.577 3.575h3.719c0.37 0 0.67-0.298 0.67-0.669s-0.3-0.669-0.67-0.669h-3.719c-1.23 0-2.23-1-2.23-2.228v-6.852c0-1.228 1-2.228 2.23-2.228h6.855c1.23 0 2.23 1 2.23 2.228v3.645c0 0.37 0.3 0.669 0.67 0.669s0.67-0.298 0.67-0.669v-3.661c-0.002-1.969-1.602-3.567-3.57-3.567z"></path>
+</svg>
+<svg id="icon-print" width="16" height="16" viewBox="0 0 16 16" x="0" y="84">
+<path fill="#1296db" d="M4.98 14.938h5.967c0.548 0 0.975-0.461 0.975-1.011v-2.973h-7.922v2.973c0 0.55 0.431 1.011 0.98 1.011zM10.947 1.016h-5.967c-0.548 0-0.98 0.428-0.98 0.978v2.959h7.922v-2.959c0-0.55-0.427-0.978-0.975-0.978z"></path>
+<path fill="#1296db" d="M12.922 4.953v1.016h-9.922v-1.016h-1.003c-0.55 0-0.981 0.469-0.981 1.019v6.961c0 0.55 0.431 1.005 0.981 1.005h1.003v-3.984h9.922v3.984h1.008c0.548 0 1.008-0.455 1.008-1.005v-6.961c0-0.55-0.458-1.019-1.008-1.019h-1.008zM12.922 7.984h-2.969v-1.016h2.969v1.016z"></path>
+</svg>
+<svg id="icon-template" width="16" height="16" viewBox="0 0 16 16" x="0" y="105">
+<path fill="#1296db" d="M8.824 4.504h-8.504v8.536h8.504v-8.536zM6.632 10.84h-0.68v-3.056l-1.056 3.056h-0.608l-1.048-3.104v3.104h-0.68v-4.28h0.952l0.992 2.976c0.048 0.144 0.088 0.264 0.12 0.376 0.040-0.12 0.088-0.264 0.144-0.424l1-2.92h0.872v4.272zM14.88 2.84l-2.024-2.032c-0.44-0.44-1.312-0.808-1.936-0.808h-6.8c-0.624 0-1.136 0.512-1.136 1.136v2.296h0.904v-2.296c0-0.12 0.104-0.224 0.224-0.224h6.8c0.064 0 0.144 0.008 0.224 0.024v3.616h3.6c0.016 0.080 0.024 0.528 0.024 0.6v9.712c0 0.12-0.104 0.224-0.224 0.224h-10.432c-0.12 0-0.224-0.104-0.224-0.224v-0.76h-0.904v0.76c0 0.624 0.512 1.136 1.136 1.136h10.432c0.624 0 1.136-0.512 1.136-1.136v-9.712c0-0.624-0.36-1.872-0.8-2.312zM12.056 3.64v-2.328c0.064 0.040 0.112 0.088 0.16 0.136l2.024 2.032c0.048 0.048 0.088 0.096 0.136 0.16h-2.32zM9.864 9.6h3.72v-1.064h-3.72v1.064zM9.864 11.736h3.72v-1.064h-3.72v1.064zM13.584 6.4h-3.72v1.064h3.72v-1.064z"></path>
+</svg>
+<svg id="icon-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="126">
+<path fill="#1296db" d="M5.015 3.754l-0.708-0.585c-0.215-0.154-0.462-0.123-0.646 0.062l-3.569 4.492c-0.123 0.154-0.123 0.4 0 0.585l3.6 4.462c0.154 0.185 0.431 0.246 0.646 0.062l0.708-0.585c0.215-0.154 0.246-0.462 0.062-0.646l-2.892-3.6 2.923-3.6c0.123-0.185 0.092-0.462-0.123-0.646zM15.908 7.723l-3.6-4.462c-0.154-0.185-0.431-0.246-0.646-0.062l-0.708 0.585c-0.215 0.154-0.246 0.462-0.062 0.646l2.923 3.6-2.923 3.6c-0.154 0.185-0.123 0.492 0.062 0.646l0.708 0.585c0.215 0.154 0.462 0.123 0.646-0.062l3.6-4.492c0.123-0.215 0.123-0.431 0-0.585zM9.723 3.323l-0.923-0.215c-0.246-0.062-0.523 0.092-0.585 0.338l-2.277 8.738c-0.062 0.246 0.092 0.492 0.338 0.554l0.923 0.215c0.246 0.062 0.523-0.092 0.585-0.338l2.277-8.738c0.062-0.277-0.092-0.492-0.338-0.554z"></path>
+</svg>
+<svg id="icon-crop" width="16" height="16" viewBox="0 0 16 16" x="0" y="147">
+<path fill="#1296db" d="M13.585 0.288c1.548 1.972 0.581 3.752 0.581 3.752l-6.049 7.649s-4.161-4.761-5.855-7.12c-1.693-2.356 0.099-4.569 0.099-4.569l5.757 7.312 5.467-7.023zM8.074 10.223c0.469 0 0.846-0.378 0.846-0.842 0-0.224-0.090-0.439-0.249-0.597s-0.374-0.246-0.598-0.246c-0.467 0-0.848 0.377-0.848 0.842s0.381 0.842 0.848 0.842zM11.641 10.395c0.746-0.002 1.462 0.292 1.989 0.818s0.827 1.24 0.829 1.985c-0.002 0.746-0.3 1.459-0.829 1.985s-1.244 0.819-1.989 0.817c-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.3-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM11.641 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001zM4.575 10.395c0.746-0.002 1.461 0.292 1.989 0.818s0.826 1.24 0.829 1.985c-0.005 1.552-1.266 2.807-2.818 2.802-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.299-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM4.575 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001z"></path>
+</svg>
+<svg id="icon-copy" width="16" height="16" viewBox="0 0 16 16" x="0" y="168">
+<path fill="#1296db" d="M3 10h7v1h-7v-1z"></path>
+<path fill="#1296db" d="M3 8h7v1h-7v-1z"></path>
+<path fill="#1296db" d="M3 12h4v1h-4v-1z"></path>
+<path fill="#1296db" d="M14 0h-9c-1.1 0-2 0.9-2 2h1c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9c0 0.6-0.4 1-1 1v1c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2z"></path>
+<path fill="#1296db" d="M3 6h7v1h-7v-1z"></path>
+<path fill="#1296db" d="M11 3h-9c-1.1 0-2 0.9-2 2v9c0 1.1 0.9 2 2 2h9c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2zM12 14c0 0.6-0.4 1-1 1h-9c-0.6 0-1-0.4-1-1v-9c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9z"></path>
+</svg>
+<svg id="icon-paste" width="16" height="16" viewBox="0 0 16 16" x="0" y="189">
+<path fill="#1296db" d="M13.644 7h-5.288c-1.298 0-2.356 1.056-2.356 2.356v4.288c0 1.298 1.056 2.356 2.356 2.356h5.289c1.298 0 2.356-1.056 2.356-2.356v-4.289c-0.002-1.298-1.058-2.355-2.358-2.355zM15 13.644c0 0.747-0.608 1.356-1.356 1.356h-5.288c-0.747 0-1.356-0.608-1.356-1.356v-4.289c0-0.747 0.608-1.356 1.356-1.356h5.289c0.747 0 1.356 0.608 1.356 1.356v4.289h-0.002z"></path>
+<path fill="#1296db" d="M4.453 13h-2.434c-0.561 0-1.019-0.456-1.019-1.019v-9.963c0-0.561 0.456-1.019 1.019-1.019h8.962c0.561 0 1.019 0.456 1.019 1.019v3.497c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-3.497c0-1.112-0.906-2.019-2.019-2.019h-8.963c-1.112 0-2.019 0.905-2.019 2.019v9.962c0 1.113 0.906 2.019 2.019 2.019h2.434c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+<path fill="#1296db" d="M10.5 3h-8c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h8c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM5.5 6h-3c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h3c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM4.5 9h-2c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h2c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+</svg>
+<svg id="icon-paste-text" width="16" height="16" viewBox="0 0 16 16" x="0" y="210">
+<path fill="#1296db" d="M10.5 2h-2v-1c0-0.551-0.45-1-1-1h-2c-0.549 0-1 0.45-1 1v1h-2v2.278h7.999v-2.278zM7.5 2h-2v-0.998c0.001 0 0.001-0.001 0.002-0.001h1.996c0.001 0 0.001 0.001 0.002 0.001l-0.001 0.998zM8.17 9.529h1.972v3.834h1.005v-3.834h1.967v-1.005h-4.943z"></path>
+<path fill="#1296db" d="M12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.816h-0.012v1.928h-8.992v-1.743h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.651c0 0.275 0.225 0.5 0.5 0.5h4.772v1.347l9.727 0.001v-10.118h-3zM6.773 14.999v-8.118h7.726l0.003 8.117-7.729 0.001z"></path>
+</svg>
+<svg id="icon-paste-word" width="16" height="16" viewBox="0 0 16 16" x="0" y="231">
+<path fill="#1296db" d="M13.628 8.819v0.146c-0.195 0.017-0.34 0.154-0.437 0.413l-1.238 3.691h-0.17l-1.044-2.865h-0.024l-1.141 2.865h-0.17l-1.311-3.691c-0.081-0.259-0.227-0.396-0.437-0.413v-0.146h1.821v0.146c-0.275 0.017-0.405 0.105-0.389 0.267 0 0.081 0.016 0.154 0.049 0.219l0.59 1.788 0.718-1.799-0.046-0.257c-0.097-0.13-0.251-0.202-0.461-0.219v-0.146h1.942v0.146c-0.032 0.017-0.057 0.024-0.073 0.024-0.276 0-0.397 0.073-0.364 0.219 0 0.033 0.008 0.105 0.025 0.219 0.016 0.065 0.032 0.105 0.048 0.121l0.572 1.679 0.534-1.806c0.016-0.032 0.084-0.421-0.062-0.432-0.017-0.001-0.033-0.008-0.049-0.024v-0.146h1.117zM10.5 2h-2v-1c0-0.55-0.45-1-1-1h-2c-0.55 0-1 0.45-1 1v1h-2v2.278h8v-2.278zM7.5 2h-2v-0.998l0.002-0.002h1.997c0 0.001 0.002 0.001 0.002 0.002l-0 0.998zM12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.815h-0.011v1.928h-8.992v-1.744h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.652c0 0.275 0.225 0.5 0.5 0.5h4.773v1.348l9.727 0.001v-10.118h-3zM6.773 14.999v-8.117h7.727l0.003 8.117h-7.729z"></path>
+</svg>
+<svg id="icon-left-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="252">
+<path fill="#1296db" d="M1.148 0h13.704c0.624 0 1.123 0.499 1.123 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.679c-0.649-0.025-1.148-0.524-1.148-1.148 0-0.649 0.499-1.148 1.148-1.148zM1.148 4.568h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 9.136h13.704c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.704c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 13.704h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.649-0.025-1.148-0.524-1.148-1.173 0-0.624 0.499-1.123 1.148-1.123z"></path>
+</svg>
+<svg id="icon-center-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="273">
+<path fill="#1296db" d="M1.953 3.11q-0.407 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.281h11.719q0.406 0 0.688 0.281t0.281 0.688-0.281 0.696-0.688 0.289h-11.719zM11.719 5.063q0.406 0 0.688 0.282t0.281 0.688-0.281 0.696-0.688 0.289h-7.813q-0.406 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.282h7.813zM13.672 8.953q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-11.719q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h11.719zM11.719 12.86q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-7.813q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h7.813z"></path>
+</svg>
+<svg id="icon-right-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="294">
+<path fill="#1296db" d="M3.497 10.966c-0.249-0.002-0.529-0.062-0.737-0.19-0.382-0.234-0.488-0.667-0.349-1.095 0.142-0.437 0.484-0.671 1.071-0.672 3.574-0.006 7.149-0.006 10.723 0.005 0.236 0.001 0.5 0.070 0.701 0.19 0.374 0.222 0.5 0.672 0.371 1.090-0.132 0.428-0.468 0.674-0.974 0.676-1.822 0.006-3.643 0.002-5.465 0.002-1.78 0-3.561 0.008-5.341-0.008zM14.228 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.795-0 3.589-0.002 5.383 0.001zM9.344 6.983c-1.63 0-3.26 0.004-4.89-0.002-0.662-0.002-1.097-0.402-1.095-0.98 0.001-0.58 0.436-0.993 1.093-0.994 3.26-0.006 6.52-0.008 9.78 0.007 0.245 0.001 0.521 0.098 0.727 0.235 0.35 0.232 0.448 0.677 0.309 1.074-0.144 0.412-0.47 0.654-0.951 0.656-1.658 0.007-3.315 0.003-4.973 0.003v0.002zM14.279 13.022c0.627 0.003 1.053 0.418 1.049 0.983-0.004 0.563-0.437 0.98-1.058 0.981-3.287 0.005-5.935 0.007-9.222-0.008-0.231-0.001-0.492-0.098-0.685-0.23-0.343-0.234-0.441-0.681-0.305-1.078 0.137-0.4 0.477-0.646 0.958-0.648 1.657-0.007 2.675-0.003 4.332-0.003 1.644-0 3.287-0.006 4.931 0.002z"></path>
+</svg>
+<svg id="icon-both-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="315">
+<path fill="#1296db" d="M14.148 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 13.040c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 8.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.002 7.105-0.002 1.794-0 3.589-0.002 5.383 0.001zM14.148 4.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001z"></path>
+</svg>
+<svg id="icon-ol" width="16" height="16" viewBox="0 0 16 16" x="0" y="336">
+<path fill="#1296db" d="M7.111 1.778h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889z"></path>
+<path fill="#1296db" d="M15.111 4.711h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M15.111 9.511h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M15.111 14.222h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M2.578 0.533h-0.8l-1.689 0.889 0.267 0.889 1.244-0.711v3.733h-1.333v0.889h3.556v-0.889h-1.244z"></path>
+<path fill="#1296db" d="M2.222 13.956c0.178-0.178 0.444-0.444 0.622-0.622s0.356-0.356 0.444-0.533c0.089-0.178 0.178-0.356 0.267-0.533s0.089-0.356 0.089-0.622c0-0.267-0.089-0.622-0.178-0.8-0.089-0.267-0.267-0.356-0.356-0.533s-0.444-0.267-0.622-0.356c-0.178-0.089-0.444-0.089-0.711-0.089-0.356 0-0.711 0.089-0.978 0.178-0.267 0.178-0.622 0.356-0.8 0.622l0.444 0.622c0.178-0.178 0.356-0.267 0.533-0.444s0.444-0.178 0.622-0.178c0.178 0 0.356 0 0.444 0s0.267 0.089 0.267 0.267 0.178 0.178 0.178 0.356 0.089 0.267 0.089 0.356c0 0.178 0 0.267 0 0.444s-0.089 0.267-0.178 0.356-0.178 0.267-0.356 0.444-0.356 0.444-0.533 0.711l-1.511 1.244v0.889h3.733v-0.889h-2.4l0.889-0.889z"></path>
+</svg>
+<svg id="icon-ul" width="16" height="16" viewBox="0 0 16 16" x="0" y="357">
+<path fill="#1296db" d="M15.111 13.333h-8.889c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M6.222 2.667h8.889c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889z"></path>
+<path fill="#1296db" d="M15.111 7.111h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M0 1.778c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#1296db" d="M0 8c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#1296db" d="M0 14.222c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+</svg>
+<svg id="icon-right-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="378">
+<path fill="#1296db" d="M0 1.882h17.488v-1.882h-17.488zM7.511 5.412h9.977v-1.883h-9.977zM7.511 8.941h9.977v-1.883h-9.977zM7.511 12.471h9.977v-1.883h-9.977zM0 16h17.488v-1.882h-17.488zM0 11.572v-6.627l4.418 3.314z"></path>
+</svg>
+<svg id="icon-left-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="399">
+<path fill="#1296db" d="M0 1.883h17.488v-1.883h-17.488v1.883zM7.511 5.412h9.977v-1.883h-9.977v1.883zM7.511 8.941h9.977v-1.883h-9.977v1.883zM7.511 12.471h9.977v-1.883h-9.977v1.883zM0 16h17.488v-1.883h-17.488v1.883zM4.418 11.572v-6.627l-4.418 3.314 4.418 3.313z"></path>
+</svg>
+<svg id="icon-down-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="420">
+<path fill="#1296db" d="M13.331 13.511v1.089h2.669v1.4h-4.001v-3.189l2.664-1.309v-1.089h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-up-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="441">
+<path fill="#1296db" d="M13.331 4.492v1.095h2.669v1.394h-4.001v-3.183l2.664-1.309v-1.095h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-clear-format" width="16" height="16" viewBox="0 0 16 16" x="0" y="462">
+<path fill="#1296db" d="M11.163 3.197l3.005-1.734 1.43 1.763-2.248 2.491zM8.877 2.251c0.879 0.108 5.156 5.318 5.046 5.904s-2.497 2.206-2.497 2.206l-5.417-6.229c-0 0 1.989-1.988 2.868-1.88zM5.491 4.897l5.23 6.088-3.209 4.173-7.247-9.178s1.436-0.060 2.633-0.374c0.783-0.206 2.593-0.709 2.593-0.709z"></path>
+</svg>
+<svg id="icon-selectall" width="16" height="16" viewBox="0 0 16 16" x="0" y="483">
+<path fill="#1296db" d="M7.272 8.96c-0.216 0-0.416-0.080-0.568-0.232l-3.136-3.144c-0.112-0.112-0.176-0.264-0.176-0.416 0-0.16 0.064-0.304 0.176-0.416s0.264-0.176 0.416-0.176c0.16 0 0.304 0.064 0.416 0.176l2.872 2.872 6.104-6.104c0.112-0.112 0.264-0.176 0.416-0.176 0.16 0 0.304 0.064 0.416 0.176 0.232 0.232 0.232 0.608 0 0.84l-6.368 6.368c-0.152 0.152-0.352 0.232-0.568 0.232z"></path>
+<path fill="#1296db" d="M2 12.76c-0.256 0-0.496-0.104-0.68-0.28-0.184-0.184-0.28-0.424-0.28-0.68v-9.776c0-0.256 0.104-0.496 0.28-0.68 0.184-0.184 0.424-0.28 0.68-0.28h6.776c0.328 0 0.592 0.264 0.592 0.592s-0.264 0.592-0.592 0.592h-6.552v9.328h8.92v-4.304c0-0.328 0.272-0.6 0.6-0.6s0.6 0.272 0.6 0.6v4.528c0 0.256-0.104 0.496-0.28 0.68-0.184 0.184-0.424 0.28-0.68 0.28h-9.384z"></path>
+<path fill="#1296db" d="M5 15.016c-0.328 0-0.592-0.264-0.592-0.592s0.264-0.592 0.592-0.592l8.808-0.008v-7.68c0-0.328 0.264-0.592 0.592-0.592 0.16 0 0.312 0.064 0.424 0.176s0.176 0.264 0.176 0.424l-0.008 8.008c0 0.472-0.384 0.848-0.856 0.848l-9.136 0.008z"></path>
+</svg>
+<svg id="icon-paiban" width="16" height="16" viewBox="0 0 16 16" x="0" y="504">
+<path fill="#1296db" d="M15.176 12.792l-5.48-4.8c-0.304-0.264-0.76-0.232-1.024 0.072l-1.552 1.776c-0.264 0.304-0.232 0.76 0.064 1.024l2.16 1.888 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.776 0.68 0.36-0.416 0.424-0.48c0.088-0.104 0.24-0.112 0.344-0.024l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.424 0.48-0.36 0.416 0.776 0.68 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.616 0.544c0.304 0.264 0.76 0.232 1.024-0.072l1.56-1.776c0.264-0.32 0.232-0.776-0.072-1.040zM9.76 9.944c-0.176 0.2-0.488 0.208-0.704 0.024s-0.248-0.496-0.072-0.696c0.176-0.2 0.488-0.208 0.704-0.024s0.248 0.496 0.072 0.696z"></path>
+<path fill="#1296db" d="M5.784 10.824h-2.928c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.552 0.552-0.552h3.096l0.944-1.112h-4.040c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.56 0.552-0.56h4.984l0.472-0.56c0.344-0.4 0.952-0.456 1.352-0.112l2.632 2.232v-6.016l-0.072-0.072v-0.008l-2.88-2.88h-7.784c-0.816 0-1.48 0.664-1.48 1.48v10.744c0 0.816 0.664 1.48 1.48 1.48h7.6l-3.144-2.664c-0.096-0.080-0.176-0.184-0.232-0.296zM2.856 3.040h3.704c0.304 0 0.552 0.248 0.552 0.552s-0.248 0.552-0.552 0.552h-3.704c-0.304 0-0.552-0.248-0.552-0.552 0-0.296 0.248-0.552 0.552-0.552zM2.856 5.264h6.664c0.304 0 0.552 0.248 0.552 0.56 0 0.304-0.248 0.552-0.552 0.552h-6.664c-0.304 0-0.552-0.248-0.552-0.552 0-0.312 0.248-0.56 0.552-0.56z"></path>
+</svg>
+<svg id="icon-full-screen" width="16" height="16" viewBox="0 0 16 16" x="0" y="525">
+<path fill="#1296db" d="M14.872 1.258c-0.094-0.094-0.219-0.145-0.352-0.145h-0.002l-4.502 0.017c-0.275 0.002-0.497 0.223-0.497 0.5 0.002 0.273 0.223 0.497 0.498 0.497h0.002l3.175-0.013-3.423 3.45c-0.194 0.194-0.192 0.511 0.003 0.705 0.097 0.097 0.223 0.145 0.35 0.145 0.128 0 0.256-0.050 0.353-0.148l3.545-3.572v3.22c0 0.275 0.222 0.498 0.498 0.498 0.275 0 0.498-0.222 0.498-0.498v-4.303c-0.002-0.133-0.055-0.259-0.148-0.353zM1.239 1.238c0.094-0.094 0.219-0.145 0.352-0.145h0.002l4.502 0.019c0.275 0.002 0.497 0.225 0.497 0.5-0.002 0.273-0.223 0.497-0.498 0.497h-0.002l-3.177-0.014 3.425 3.45c0.194 0.194 0.192 0.511-0.003 0.705-0.097 0.097-0.223 0.145-0.35 0.145-0.128 0-0.256-0.050-0.353-0.148l-3.545-3.572v3.22c0 0.275-0.222 0.498-0.498 0.498s-0.498-0.222-0.498-0.498v-4.303c0.002-0.131 0.055-0.259 0.148-0.353zM14.872 14.881c-0.094 0.094-0.219 0.145-0.352 0.145h-0.002l-4.502-0.017c-0.275-0.002-0.497-0.225-0.497-0.5 0.002-0.273 0.223-0.497 0.498-0.497h0.002l3.175 0.012-3.423-3.448c-0.194-0.194-0.192-0.511 0.003-0.705 0.097-0.097 0.223-0.145 0.35-0.145 0.128 0 0.256 0.050 0.353 0.148l3.545 3.57v-3.22c0-0.275 0.222-0.498 0.498-0.498 0.275 0 0.498 0.222 0.498 0.498v4.303c-0.002 0.133-0.055 0.259-0.148 0.353zM1.223 14.886c0.094 0.094 0.219 0.145 0.352 0.145h0.002l4.502-0.017c0.275-0.002 0.497-0.225 0.497-0.5-0.002-0.273-0.223-0.497-0.498-0.497h-0.002l-3.175 0.012 3.425-3.45c0.194-0.194 0.192-0.511-0.003-0.705-0.097-0.097-0.223-0.145-0.35-0.145-0.128 0-0.256 0.050-0.353 0.148l-3.547 3.572v-3.22c0-0.275-0.222-0.498-0.498-0.498s-0.498 0.222-0.498 0.498v4.303c0.002 0.133 0.055 0.259 0.148 0.353z"></path>
+</svg>
+<svg id="icon-title" width="16" height="16" viewBox="0 0 16 16" x="0" y="546">
+<path fill="#1296db" d="M1.815 2.089v4.803h1.332v-4.803h1.815v-1.089h-4.962v1.089h1.815zM6.443 1.966v-0.966h-1.205v0.966h1.205zM5.239 2.626v4.267h1.205v-4.267h-1.205zM8.594 2.626v-1.279h-1.205v1.279h-0.73v0.784h0.73v2.517c0 0.215 0.037 0.388 0.11 0.52s0.174 0.234 0.301 0.305c0.127 0.072 0.274 0.12 0.441 0.144s0.344 0.037 0.53 0.037c0.119 0 0.24-0.003 0.365-0.008s0.238-0.016 0.339-0.033v-0.908c-0.057 0.011-0.116 0.019-0.178 0.025s-0.127 0.008-0.195 0.008c-0.204 0-0.339-0.033-0.407-0.099s-0.102-0.198-0.102-0.396v-2.113h0.882v-0.784h-0.882zM9.761 1v5.893h1.205v-5.893h-1.205zM14.541 4.301h-1.96c0.006-0.083 0.024-0.176 0.055-0.281s0.085-0.204 0.161-0.297c0.076-0.094 0.178-0.172 0.305-0.235s0.287-0.095 0.479-0.095c0.294 0 0.513 0.077 0.657 0.231s0.245 0.38 0.301 0.677v0zM12.581 5.044h3.164c0.023-0.33-0.006-0.646-0.085-0.949s-0.208-0.572-0.386-0.809c-0.178-0.237-0.406-0.425-0.683-0.565s-0.602-0.21-0.976-0.21c-0.334 0-0.638 0.058-0.912 0.173s-0.51 0.274-0.708 0.475c-0.198 0.201-0.351 0.439-0.458 0.714s-0.161 0.572-0.161 0.891c0 0.33 0.052 0.633 0.157 0.908s0.253 0.512 0.445 0.71c0.192 0.198 0.427 0.351 0.704 0.458s0.588 0.161 0.933 0.161c0.498 0 0.922-0.11 1.272-0.33s0.611-0.586 0.78-1.098h-1.060c-0.040 0.132-0.147 0.257-0.322 0.376s-0.385 0.177-0.628 0.177c-0.339 0-0.599-0.085-0.78-0.256s-0.28-0.446-0.297-0.825zM0 9h16v1h-16v-1zM0 12h16v1h-16v-1zM0 15h12v1h-12v-1z"></path>
+</svg>
+<svg id="icon-font" width="16" height="16" viewBox="0 0 16 16" x="0" y="567">
+<path fill="#1296db" d="M0.32 1.436v3.661h0.448c0.149-0.971 0.523-1.793 1.195-2.316 0.374-0.374 1.046-0.598 2.017-0.598h1.046v10.386c0 0.672-0.075 1.121-0.149 1.27-0.075 0.224-0.224 0.374-0.448 0.448-0.224 0.149-0.598 0.224-0.971 0.224h-0.448v0.374h7.472v-0.374h-0.448c-0.448 0-0.747-0.075-0.971-0.224s-0.374-0.299-0.448-0.448-0.149-0.598-0.149-1.27v-10.386h1.046c0.672 0 1.121 0.075 1.42 0.149 0.448 0.224 0.822 0.523 1.121 0.897s0.523 0.971 0.747 1.793h0.374v-3.586h-12.851z"></path>
+<path fill="#1296db" d="M8.533 6.286v2.341h0.254c0.085-0.621 0.296-1.146 0.676-1.481 0.211-0.239 0.592-0.382 1.141-0.382h0.592v6.64c0 0.43-0.042 0.716-0.085 0.812-0.042 0.143-0.127 0.239-0.254 0.287-0.127 0.095-0.338 0.143-0.549 0.143h-0.254v0.239h4.225v-0.239h-0.253c-0.254 0-0.423-0.048-0.549-0.143s-0.211-0.191-0.254-0.287c-0.042-0.095-0.084-0.382-0.084-0.812v-6.64h0.592c0.38 0 0.634 0.048 0.803 0.096 0.255 0.145 0.467 0.338 0.63 0.567l0.004 0.006c0.169 0.239 0.296 0.621 0.423 1.146h0.211v-2.293h-7.268z"></path>
+</svg>
+<svg id="icon-fontsize" width="16" height="16" viewBox="0 0 16 16" x="0" y="588">
+<path fill="#1296db" d="M10.75 12.432l2.663 3.141 2.674-3.141z"></path>
+<path fill="#1296db" d="M2.979 7.234l1.53-4.933 1.534 4.933h-3.064zM5.888 0.408h-2.332l-3.489 11.051h1.617l0.825-2.63h4.042l0.839 2.63h2.025l-3.527-11.051z"></path>
+<path fill="#1296db" d="M9.553 8.899l0.888-2.357 0.888 2.357h-1.776zM11.238 5.444h-1.351l-1.085 2.927 0.47 1.475 0.007-0.021h2.342l0.487 1.522h1.171l-2.041-5.903z"></path>
+</svg>
+<svg id="icon-fontcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="609">
+<path fill="#1296db" d="M1.051 12.486v2.105h9.121l2.105-2.105h-11.226zM11.575 14.591h3.508v-3.508l-3.508 3.508z"></path>
+<path fill="#1296db" d="M12.338 12.135h-1.766l-1.437-3.369h-4.42l-1.423 3.369h-1.802l4.631-10.705h1.66l4.558 10.705zM8.565 7.275l-1.625-3.615-1.639 3.615h3.264z"></path>
+</svg>
+<svg id="icon-font-bgcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="630">
+<path fill="#1296db" d="M4.068 9.652c-0.151 0.146-0.226 0.351-0.226 0.614 0 0.231 0.082 0.42 0.246 0.566s0.38 0.219 0.649 0.219c0.374 0 0.683-0.132 0.926-0.395s0.364-0.594 0.364-0.991v-0.465l-1.136 0.154c-0.398 0.053-0.672 0.152-0.823 0.298zM12.953 1.452h-9.984c-1.103 0-1.997 0.894-1.997 1.997v8.985c0 1.103 0.894 1.997 1.997 1.997h9.984c1.103 0 1.997-0.894 1.997-1.997v-8.985c0-1.103-0.894-1.997-1.997-1.997zM6.879 11.635h-0.851v-0.75h-0.022c-0.336 0.576-0.832 0.864-1.487 0.864-0.471 0-0.845-0.127-1.123-0.382s-0.417-0.598-0.417-1.031c0-0.907 0.537-1.435 1.61-1.584l1.439-0.202c0-0.793-0.328-1.189-0.983-1.189-0.582 0-1.113 0.196-1.593 0.588v-0.829c0.483-0.301 1.040-0.452 1.672-0.452 1.17 0 1.755 0.614 1.755 1.843v3.124zM12.26 11.023c-0.402 0.484-0.938 0.726-1.608 0.726-0.632 0-1.113-0.266-1.443-0.799h-0.018v0.684h-0.86v-7.182h0.86v3.168h0.018c0.38-0.635 0.936-0.952 1.667-0.952 0.608 0 1.092 0.214 1.45 0.643s0.538 1.014 0.538 1.757c0 0.819-0.201 1.47-0.603 1.955zM10.638 7.38c-0.421 0-0.769 0.151-1.042 0.452s-0.41 0.684-0.41 1.15v0.658c0 0.392 0.127 0.723 0.382 0.994s0.573 0.406 0.956 0.406c0.456 0 0.813-0.175 1.071-0.526s0.386-0.836 0.386-1.457c0-0.512-0.12-0.919-0.36-1.222s-0.567-0.454-0.983-0.454z"></path>
+</svg>
+<svg id="icon-b" width="16" height="16" viewBox="0 0 16 16" x="0" y="651">
+<path fill="#1296db" d="M12.615 5.846c0-1.846-1.477-3.385-3.231-3.385h-5.077c-0.338 0-0.615 0.277-0.615 0.615v10.154c0 0.338 0.277 0.615 0.615 0.615h5.077c1.754 0 3.231-1.538 3.231-3.385 0-0.892-0.338-1.692-0.892-2.308 0.554-0.615 0.892-1.415 0.892-2.308zM9.385 11.692h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231zM9.385 7.077h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231z"></path>
+</svg>
+<svg id="icon-italic" width="16" height="16" viewBox="0 0 16 16" x="0" y="672">
+<path fill="#1296db" d="M11.692 3.785v-0.4c0-0.338-0.277-0.615-0.615-0.615h-4.308c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615 0.523 0 0.923 0.492 0.8 0.985l-1.108 5.415c-0.092 0.4-0.431 0.677-0.8 0.677h-0.738c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615h4.308c0.338 0 0.615-0.277 0.615-0.615v-0.615c0-0.338-0.277-0.615-0.615-0.615-0.523 0-0.923-0.492-0.8-0.985l1.108-5.415c0.092-0.4 0.431-0.677 0.8-0.677h0.523c0.462 0 0.831-0.369 0.831-0.831z"></path>
+</svg>
+<svg id="icon-underline" width="16" height="16" viewBox="0 0 16 16" x="0" y="693">
+<path fill="#1296db" d="M13.692 12.923h-11.385c-0.246 0-0.462 0.215-0.462 0.462v0.923c0 0.246 0.215 0.462 0.462 0.462h11.385c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462zM7.785 11.692c-2.308-0.123-4.092-2.123-4.092-4.431v-4.185c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.215c0 1.323 0.985 2.462 2.308 2.554 1.446 0.092 2.615-1.046 2.615-2.462v-4.308c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.308c0 2.462-2.062 4.431-4.523 4.308z"></path>
+</svg>
+<svg id="icon-strickout" width="16" height="16" viewBox="0 0 16 16" x="0" y="714">
+<path fill="#1296db" d="M3.723 5.569c-0.062-0.308-0.092-0.677-0.092-1.046 0-0.4 0.092-0.862 0.277-1.292 0.185-0.462 0.462-0.892 0.862-1.262 0.369-0.369 0.892-0.708 1.477-0.954 0.615-0.246 1.323-0.4 2.185-0.4 0.769 0 1.508 0.092 2.215 0.308 0.554 0.185 1.077 0.492 1.538 0.923 0.185 0.185 0.185 0.492-0.031 0.677l-0.831 0.769c-0.185 0.154-0.462 0.185-0.646 0-0.215-0.215-0.462-0.4-0.738-0.554-0.431-0.215-0.923-0.338-1.508-0.338-0.523 0-0.985 0.062-1.323 0.215s-0.646 0.308-0.862 0.554-0.369 0.462-0.462 0.708-0.123 0.492-0.123 0.677c0 0.338 0.062 0.615 0.154 0.862 0.092 0.215-0.062 0.431-0.277 0.431h-1.508c-0.154 0-0.277-0.154-0.308-0.277zM12.277 10.154h-1.538c-0.215 0-0.369 0.215-0.277 0.4s0.123 0.431 0.123 0.677c0 0.369-0.092 0.708-0.246 1.015-0.185 0.308-0.4 0.523-0.677 0.738-0.277 0.185-0.585 0.338-0.923 0.431s-0.646 0.154-0.985 0.154c-0.585 0-1.138-0.123-1.662-0.369-0.4-0.185-0.738-0.431-1.046-0.769-0.154-0.185-0.462-0.215-0.646-0.062l-0.862 0.738c-0.185 0.154-0.215 0.462-0.031 0.646 0.431 0.492 0.985 0.862 1.631 1.108 0.8 0.308 1.662 0.462 2.585 0.462 0.677 0 1.323-0.092 1.908-0.308 0.585-0.185 1.108-0.492 1.569-0.862 0.431-0.369 0.8-0.831 1.046-1.385s0.4-1.138 0.4-1.815c0-0.246 0-0.4-0.031-0.615-0.062-0.062-0.185-0.185-0.338-0.185zM15.354 7.354c-0.062-0.185-0.246-0.277-0.431-0.277h-13.846c-0.215 0-0.369 0.092-0.431 0.277-0.031 0.062-0.031 0.092-0.031 0.154v0.923c0 0.246 0.215 0.492 0.462 0.492h13.846c0.246 0 0.462-0.246 0.462-0.492v-0.923c0-0.062 0-0.092-0.031-0.154z"></path>
+</svg>
+<svg id="icon-line-height" width="16" height="16" viewBox="0 0 16 16" x="0" y="735">
+<path fill="#1296db" d="M2.499 11.902v-7.682c-0.166 0-0.326 0.009-0.485-0.002-0.265-0.019-0.339-0.2-0.178-0.467 0.254-0.423 0.52-0.837 0.79-1.245 0.145-0.219 0.377-0.212 0.522 0.009 0.262 0.398 0.521 0.801 0.767 1.214 0.055 0.093 0.087 0.254 0.063 0.359-0.016 0.067-0.153 0.115-0.239 0.126-0.153 0.020-0.308 0.006-0.469 0.006v7.672c0.15 0 0.298-0.017 0.444 0.006 0.097 0.015 0.246 0.062 0.266 0.138 0.027 0.104-0.021 0.274-0.080 0.375-0.236 0.397-0.486 0.781-0.737 1.164-0.17 0.26-0.396 0.258-0.566-0.005-0.25-0.384-0.492-0.775-0.737-1.163-0.022-0.035-0.044-0.075-0.061-0.118l-0.002-0.005c-0.088-0.217-0.034-0.357 0.161-0.375 0.176-0.016 0.353-0.003 0.543-0.003z"></path>
+<path fill="#1296db" d="M14.841 0v1.166h-13.69v-1.166zM14.849 14.834v1.166h-13.69v-1.166zM10.056 2.956l4.172 10.602h-1.321l-1.129-2.97h-4.871l-1.128 2.97h-1.307l4.173-10.602zM11.392 9.563l-2.004-5.3h-0.059l-2.034 5.3z"></path>
+</svg>
+<svg id="icon-clear-html" width="16" height="16" viewBox="0 0 16 16" x="0" y="756">
+<path fill="#1296db" d="M10.175 3.11c-0.106-0.106-0.279-0.106-0.385 0l-8.625 8.625c-0.106 0.106-0.106 0.279 0 0.385l1.678 1.678c0.106 0.106 0.315 0.192 0.464 0.192h5.374c0.15 0 0.358-0.087 0.464-0.192l5.666-5.666c0.106-0.106 0.106-0.279 0-0.385l-4.636-4.636zM8.612 12.774c-0.106 0.106-0.315 0.192-0.464 0.192h-4.161c-0.15 0-0.358-0.087-0.464-0.192l-0.791-0.791c-0.106-0.106-0.106-0.279 0-0.385l3.162-3.162c0.106-0.106 0.279-0.106 0.385 0l3.143 3.143c0.106 0.106 0.106 0.279 0 0.385l-0.81 0.81z"></path>
+</svg>
+<svg id="icon-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="777">
+<path fill="#1296db" d="M15.385 3.077c0-0.677-0.554-1.231-1.231-1.231h-12.308c-0.677 0-1.231 0.554-1.231 1.231v9.846c0 0.677 0.554 1.231 1.231 1.231h12.308c0.677 0 1.231-0.554 1.231-1.231v-9.846zM12.185 11.692h-8.923c-0.369 0-0.585-0.4-0.4-0.708l2.708-4.708c0.123-0.215 0.4-0.215 0.523 0l1.631 2.8c0.123 0.185 0.4 0.215 0.523 0.031l1.323-1.908c0.123-0.185 0.4-0.185 0.523 0l2.431 3.877c0.185 0.277 0 0.615-0.338 0.615zM11.385 6.154c-0.677 0-1.231-0.554-1.231-1.231s0.554-1.231 1.231-1.231 1.231 0.554 1.231 1.231-0.554 1.231-1.231 1.231z"></path>
+</svg>
+<svg id="icon-multiple-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="798">
+<path fill="#1296db" d="M13 1v12.033h-12v-12.033h12zM13 0h-12c-0.567 0-1 0.433-1 1v12.033c0 0.567 0.433 1 1 1h12.033c0.567 0 1-0.433 1-1v-12.033c-0.033-0.567-0.467-1-1.033-1z"></path>
+<path fill="#1296db" d="M13 12.267c0.567-0.6 0.8-2.3 0.8-3.1 0-2.033-1.6-3.7-3.633-3.7-1.433 0-2.633 0.8-3.233 1.967-0.667 1.033-1.8 1.7-3.1 1.7-1.367 0-2.533-0.733-3.2-1.833-0.333 0.567-0.5 1.2-0.5 1.867 0 0.733 0.2 2.333 0.567 2.9v1.133h1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h2.1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h0.7v-0.933z"></path>
+<path fill="#1296db" d="M2.767 4.233c0 0 0 0 0 0 0 0.7 0.567 1.267 1.267 1.267s1.267-0.567 1.267-1.267c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.7-0.567-1.267-1.267-1.267s-1.267 0.567-1.267 1.267c0 0 0 0 0 0v0z"></path>
+<path fill="#1296db" d="M15.633 16h-9c-0.267 0-0.5-0.233-0.5-0.5s0.233-0.5 0.5-0.5h8.5v-8.5c0-0.267 0.233-0.5 0.5-0.5s0.5 0.233 0.5 0.5v9c0 0.267-0.233 0.5-0.5 0.5z"></path>
+</svg>
+<svg id="icon-graft" width="17" height="16" viewBox="0 0 17 16" x="0" y="819">
+<path fill="#1296db" d="M16.407 3.584c0.106-0.333 0.388-1.214-0.194-1.628-0.171-0.118-0.382-0.188-0.61-0.188-0.013 0-0.026 0-0.039 0.001l0.002-0c-0.449 0-1.133 0.267-1.914 0.713-0.030-0.060-0.067-0.112-0.111-0.157l0 0c-1.435-1.432-3.417-2.318-5.605-2.318-4.379 0-7.93 3.548-7.935 7.926v0c-0 0.009-0 0.020-0 0.031 0 2.264 0.957 4.305 2.489 5.739l0.004 0.004c0.107 0.101 0.251 0.163 0.41 0.163 0.001 0 0.001 0 0.002 0h0.044c-0.291 0.29-0.604 0.557-0.938 0.8l-0.023 0.016c-0.155 0.11-0.255 0.289-0.255 0.491 0 0.279 0.19 0.513 0.448 0.581l0.004 0.001c0.631 0.152 1.356 0.239 2.102 0.239 0.004 0 0.008 0 0.011 0h-0.001c1.236 0 2.256-0.259 3.042-0.777v0.047c0 0.332 0.269 0.601 0.601 0.601v0c4.38-0.005 7.929-3.555 7.935-7.934v-0c0-0.008 0.001-0.018 0.001-0.028 0-0.332-0.269-0.601-0.601-0.601s-0.601 0.269-0.601 0.601c0 0.010 0 0.020 0.001 0.029l-0-0.001c-0.005 3.687-2.969 6.679-6.644 6.731l-0.005 0c0.617-0.614 0.933-1.306 0.906-1.993-0.017-0.336-0.114-0.646-0.272-0.916l0.005 0.009c0.166 0.056 0.358 0.088 0.557 0.088 0.004 0 0.007-0 0.011-0h-0.001c2.749-0.001 6.495-6.143 7.175-8.27zM4.521 13.81c0.268-0.47 1.21-1.992 2.168-1.992 0.209 0.006 0.402 0.071 0.563 0.18l-0.004-0.002c0.265 0.15 0.447 0.419 0.476 0.732l0 0.004c0.021 0.427-0.3 0.928-0.881 1.375s-1.457 0.695-2.549 0.695c-0.181 0-0.369-0.006-0.56-0.021 0.298-0.283 0.558-0.602 0.774-0.952l0.012-0.020zM8.754 9.025c1.072-2.589 5.206-5.632 6.574-6.016-0.129 0.493-0.567 1.583-1.553 3.158-1.643 2.599-3.549 4.486-4.55 4.486-0.003 0-0.007 0-0.010 0-0.167 0-0.317-0.071-0.422-0.185l-0-0c-0.299-0.299-0.312-0.786-0.039-1.443zM1.2 7.933c0-0.002 0-0.004 0-0.006 0-3.717 3.014-6.731 6.731-6.731 1.835 0 3.499 0.734 4.713 1.925l-0.001-0.001c-1.977 1.364-4.207 3.536-4.998 5.444-0.422 1.019-0.327 1.744-0.071 2.246-0.26-0.121-0.564-0.192-0.885-0.193h-0c-1.486 0-2.63 1.588-3.193 2.559-0.021-0.136-0.086-0.254-0.18-0.343l-0-0c-1.303-1.221-2.115-2.952-2.115-4.874 0-0.009 0-0.019 0-0.028v0.001z"></path>
+<path fill="#1296db" d="M8.931 4.704c0.858 0 1.553-0.695 1.553-1.553s-0.695-1.553-1.553-1.553c-0.858 0-1.553 0.695-1.553 1.553v0c0 0.858 0.695 1.553 1.553 1.553v0zM8.931 3.504c-0.194 0-0.352-0.158-0.352-0.352s0.158-0.352 0.352-0.352c0.194 0 0.352 0.158 0.352 0.352v0c0 0.194-0.158 0.352-0.352 0.352v0zM5.394 9.012c0-0.858-0.695-1.553-1.553-1.553s-1.553 0.695-1.553 1.553c0 0.858 0.695 1.553 1.553 1.553v0c0.858 0 1.553-0.695 1.553-1.553v0zM3.841 8.659c0.002-0 0.004-0 0.006-0 0.194 0 0.352 0.158 0.352 0.352s-0.158 0.352-0.352 0.352c-0.194 0-0.352-0.158-0.352-0.352v0c0-0 0-0 0-0 0-0.193 0.155-0.349 0.347-0.352h0zM4.977 7.069c1.144 0 2.071-0.927 2.071-2.071s-0.927-2.071-2.071-2.071c-1.144 0-2.071 0.927-2.071 2.071v0c0 1.144 0.927 2.071 2.071 2.071v0zM4.977 4.123c0.482 0 0.872 0.391 0.872 0.872s-0.391 0.872-0.872 0.872c-0.482 0-0.872-0.391-0.872-0.872v0c0.001-0.481 0.391-0.87 0.872-0.871h0z"></path>
+</svg>
+<svg id="icon-flash" width="16" height="16" viewBox="0 0 16 16" x="0" y="840">
+<path fill="#1296db" d="M8 0.889c-3.911 0-7.111 3.2-7.111 7.111s3.2 7.111 7.111 7.111 7.111-3.2 7.111-7.111-3.2-7.111-7.111-7.111zM11.556 5.956c-1.244-0.089-1.956 1.244-1.956 1.244l1.422 0.089v1.6h-2.044c-1.067 3.911-3.644 3.2-3.644 3.2v-1.333s1.511 0 2.311-2.756c1.156-4.356 3.911-3.467 3.911-3.467v1.422z"></path>
+</svg>
+<svg id="icon-vedio" width="16" height="16" viewBox="0 0 16 16" x="0" y="861">
+<path fill="#1296db" d="M15.385 0.615h-0.615v1.231h-1.846v-1.231h-9.846v1.231h-1.846v-1.231h-0.615c-0.339 0-0.615 0.276-0.615 0.615v13.538c0 0.339 0.276 0.615 0.615 0.615h0.615v-0.615h1.846v0.615h9.846v-0.615h1.846v0.615h0.615c0.339 0 0.615-0.276 0.615-0.615v-13.538c0-0.339-0.276-0.615-0.615-0.615zM3.077 12.923h-1.846v-1.846h1.846v1.846zM3.077 9.231h-1.846v-1.846h1.846v1.846zM3.077 5.538h-1.846v-1.846h1.846v1.846zM10.823 8.404l-4.002 2.334c-0.065 0.033-0.137 0.048-0.207 0.048-0.085 0-0.167-0.023-0.242-0.067-0.135-0.082-0.218-0.228-0.218-0.385v-4.668c0-0.157 0.082-0.303 0.218-0.385 0.137-0.082 0.307-0.090 0.449-0.018l4.002 2.334c0.156 0.077 0.254 0.233 0.254 0.404s-0.098 0.327-0.254 0.404zM14.769 12.923h-1.846v-1.846h1.846v1.846zM14.769 9.231h-1.846v-1.846h1.846v1.846zM14.769 5.538h-1.846v-1.846h1.846v1.846z"></path>
+</svg>
+<svg id="icon-attach" width="16" height="16" viewBox="0 0 16 16" x="0" y="882">
+<path fill="#1296db" d="M5.415 11.292c0.185 0.185 0.462 0.154 0.646 0l3.077-3.077c0.215-0.215 0.585-0.246 0.862 0s0.246 0.677 0 0.923l-3.785 3.723c-0.831 0.831-2.215 0.831-3.046 0l-0.031-0.031c-0.831-0.831-0.831-2.215 0-3.046l6.677-6.677c0.831-0.831 2.215-0.831 3.046 0l0.031 0.031c0.831 0.831 0.831 2.215 0 3.046l-0.031 0.031c-0.154 0.154-0.185 0.369-0.062 0.554 0.185 0.338 0.338 0.708 0.431 1.077 0.062 0.246 0.338 0.308 0.523 0.154 0.246-0.246 0.462-0.492 0.462-0.492 1.569-1.569 1.569-4.123 0-5.692h-0.062c-1.569-1.569-4.123-1.569-5.692 0l-6.677 6.646c-1.569 1.569-1.569 4.123 0 5.692l0.062 0.062c1.569 1.569 4.092 1.569 5.662 0l3.815-3.785c0.985-0.985 0.954-2.585-0.062-3.569-0.985-0.954-2.585-0.892-3.538 0.092l-3.015 3.015c-0.185 0.185-0.185 0.492 0 0.677l0.708 0.646z"></path>
+</svg>
+<svg id="icon-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="903">
+<path fill="#1296db" d="M17.846 0h-17.231c-0.49 0-0.615 0.129-0.615 0.615v14.769c0 0.486 0.125 0.615 0.615 0.615h17.231c0.49 0 0.615-0.129 0.615-0.615v-14.769c0-0.486-0.125-0.615-0.615-0.615zM5.538 14.769l-4.328 0.051v-3.108l4.328-0.020v3.077zM5.538 10.462h-4.308v-3.077h4.308v3.077zM5.538 6.154h-4.308v-2.462h4.308v2.462zM11.692 14.769h-4.923v-3.077h4.923v3.077zM11.692 10.462h-4.923v-3.077h4.923v3.077zM11.692 6.154h-4.923v-2.462h4.923v2.462zM17.231 14.769h-4.308v-3.077h4.308v3.077zM17.231 10.462h-4.308v-3.077h4.308v3.077zM17.231 6.154h-4.308v-2.462h4.308v2.462z"></path>
+</svg>
+<svg id="icon-split" width="16" height="16" viewBox="0 0 16 16" x="0" y="924">
+<path fill="#1296db" d="M14.222 12.412l-1.811 1.811h-1.022l2.833-2.833v1.022zM14.222 13.742v0.48h-0.48l0.48-0.48zM14.222 10.059l-4.164 4.164h-1.022l4.444-4.444h0.741v0.281zM12.15 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM9.796 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM7.444 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM5.091 9.778l-3.313 3.313v-1.012l2.3-2.3h1.013zM2.748 9.778l-0.97 0.97v-0.97h0.97zM14.222 3.078l-2.255 2.255h-1.022l3.277-3.277v1.022zM14.222 4.409v0.924h-0.924l0.924-0.924zM13.17 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM10.817 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM8.462 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM6.11 1.778l-3.556 3.556h-0.777v-0.244l3.311-3.311h1.022zM3.757 1.778l-1.98 1.98v-1.012l0.967-0.967h1.013zM0 7.111h16v0.889h-16v-0.889z"></path>
+</svg>
+<svg id="icon-face" width="16" height="16" viewBox="0 0 16 16" x="0" y="945">
+<path fill="#1296db" d="M8 16c-4.417 0-8-3.58-8-7.993s3.583-8.007 8-8.007 8 3.594 8 8.007c0 4.413-3.583 7.993-8 7.993zM8 1c-3.865 0-7 3.145-7 7.006s3.135 6.994 7 6.994 7-3.132 7-6.994c0-3.861-3.135-7.006-7-7.006zM8 13c-2.419 0-4.436-1.718-4.899-4h1.041c0.446 1.722 1.997 3 3.859 3s3.412-1.278 3.858-3h1.041c-0.463 2.282-2.48 4-4.899 4zM11 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1zM5 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1z"></path>
+</svg>
+<svg id="icon-split-page" width="16" height="16" viewBox="0 0 16 16" x="0" y="966">
+<path fill="#1296db" d="M14.25 1v4h-12.5v-4h1.042v3h10.417v-3zM1.75 15v-4h12.5v4h-1.041v-3h-10.417v3zM1 7h14v2h-14z"></path>
+</svg>
+<svg id="icon-anchor" width="16" height="16" viewBox="0 0 16 16" x="0" y="987">
+<path fill="#1296db" d="M15.297 9.614l-1.117-1.117c-0.075-0.075-0.174-0.116-0.28-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l0.442-0.442c-0.107 1.281-0.667 2.486-1.579 3.399-0.925 0.925-2.149 1.487-3.45 1.583l-0-7.611 3.106-0c0.218 0 0.396-0.178 0.396-0.396s-0.178-0.396-0.396-0.396h-3.106v-4.407l2.781 2.781c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-3.434-3.434c-0.083-0.083-0.198-0.125-0.316-0.114-0.109-0.003-0.214 0.038-0.291 0.116l-3.434 3.434c-0.154 0.154-0.154 0.406 0 0.56 0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l2.781-2.781v4.405h-3.106c-0.218 0-0.396 0.178-0.396 0.396s0.178 0.396 0.396 0.396l3.106-0v7.613c-1.311-0.091-2.546-0.653-3.478-1.585-0.92-0.92-1.481-2.137-1.582-3.43l0.444 0.444c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-1.117-1.117c-0.075-0.075-0.174-0.116-0.279-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28 0.174 0.116 0.28 0.116c0.106 0 0.205-0.041 0.28-0.116l0.475-0.475c0.047 0.697 0.208 1.376 0.48 2.018 0.316 0.748 0.769 1.42 1.346 1.997s1.249 1.030 1.997 1.346c0.775 0.328 1.598 0.494 2.446 0.494s1.671-0.166 2.446-0.494c0.748-0.316 1.42-0.769 1.997-1.346s1.030-1.249 1.346-1.997c0.275-0.651 0.437-1.338 0.481-2.045l0.474 0.474c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116 0.116-0.174 0.116-0.28c0-0.106-0.041-0.205-0.116-0.28z"></path>
+</svg>
+<svg id="icon-link" width="16" height="16" viewBox="0 0 16 16" x="0" y="1008">
+<path fill="#1296db" d="M8.369 12.831l-0.646-0.092s-0.431-0.092-0.646-0.185c-0.123-0.031-0.277 0-0.369 0.092l-0.154 0.154c-0.892 0.892-2.338 0.985-3.262 0.185-1.046-0.892-1.077-2.492-0.123-3.446l2.338-2.338c0.308-0.308 0.677-0.492 1.046-0.615 0.492-0.123 1.015-0.092 1.477 0.092 0.277 0.123 0.554 0.277 0.8 0.523 0.123 0.123 0.215 0.246 0.308 0.4 0.123 0.215 0.4 0.246 0.554 0.062l0.862-0.862c0.123-0.123 0.123-0.308 0.031-0.462-0.123-0.185-0.277-0.338-0.431-0.492-0.215-0.215-0.462-0.431-0.738-0.585-0.431-0.277-0.923-0.462-1.446-0.554-0.954-0.185-2-0.031-2.862 0.431-0.338 0.185-0.677 0.431-0.954 0.708l-2.246 2.246c-1.631 1.631-1.754 4.277-0.185 5.938 1.631 1.785 4.4 1.815 6.092 0.123l0.769-0.769c0.215-0.154 0.062-0.523-0.215-0.554zM14.031 1.785c-1.692-1.569-4.338-1.446-5.938 0.185l-0.708 0.677c-0.215 0.215-0.062 0.585 0.215 0.615 0.431 0.031 0.862 0.123 1.292 0.246 0.123 0.031 0.277 0 0.369-0.092l0.154-0.154c0.892-0.892 2.338-0.985 3.262-0.185 1.046 0.892 1.077 2.492 0.123 3.446l-2.338 2.338c-0.308 0.308-0.677 0.492-1.046 0.615-0.492 0.123-1.015 0.092-1.477-0.092-0.277-0.123-0.554-0.277-0.8-0.523-0.123-0.123-0.215-0.246-0.308-0.4-0.123-0.215-0.4-0.246-0.554-0.062l-0.862 0.862c-0.123 0.123-0.123 0.308-0.031 0.462 0.123 0.185 0.277 0.338 0.431 0.492 0.215 0.215 0.492 0.431 0.738 0.585 0.431 0.277 0.923 0.462 1.415 0.554 0.954 0.185 2 0.031 2.862-0.431 0.338-0.185 0.677-0.431 0.954-0.708l2.338-2.338c1.723-1.692 1.662-4.462-0.092-6.092z"></path>
+</svg>
+<svg id="icon-unlink" width="16" height="16" viewBox="0 0 16 16" x="0" y="1029">
+<path fill="#1296db" d="M7.385 11.262c-0.185 0-0.369-0.031-0.554-0.092-0.185-0.031-0.4-0.092-0.585-0.154-0.123-0.031-0.246 0-0.308 0.062l-0.123 0.123c-0.769 0.769-2.031 0.862-2.862 0.154-0.892-0.8-0.954-2.185-0.092-3.015l2.031-2.031c0.277-0.277 0.585-0.431 0.923-0.523 0.431-0.123 0.892-0.092 1.292 0.092 0.246 0.092 0.492 0.246 0.677 0.462 0.092 0.092 0.185 0.215 0.277 0.369 0.092 0.185 0.338 0.215 0.492 0.062l0.769-0.769c0.123-0.123 0.123-0.277 0.031-0.4-0.123-0.154-0.246-0.277-0.369-0.431-0.185-0.185-0.431-0.369-0.646-0.523-0.4-0.246-0.8-0.4-1.262-0.492-0.831-0.154-1.723-0.031-2.523 0.4-0.308 0.154-0.585 0.369-0.831 0.615l-1.969 1.969c-1.415 1.415-1.538 3.723-0.154 5.2 1.446 1.538 3.877 1.6 5.354 0.092l0.677-0.677c0.154-0.154 0.031-0.462-0.246-0.492zM12.462 6.923c1.477-1.477 1.446-3.908-0.092-5.354-1.477-1.354-3.785-1.262-5.2 0.154l-0.615 0.615c-0.185 0.185-0.062 0.492 0.185 0.523 0.369 0.031 0.769 0.092 1.138 0.215 0.123 0.031 0.246 0 0.308-0.062l0.123-0.123c0.769-0.769 2.031-0.862 2.862-0.154 0.892 0.8 0.954 2.185 0.092 3.015l-2.031 2.031c-0.277 0.277-0.585 0.431-0.923 0.523-0.431 0.123-0.892 0.092-1.292-0.092-0.246-0.092-0.492-0.246-0.677-0.462-0.092-0.092-0.185-0.215-0.246-0.338-0.092-0.185-0.338-0.215-0.492-0.062l-0.738 0.738c-0.123 0.123-0.123 0.277-0.031 0.4 0.123 0.154 0.215 0.277 0.369 0.431 0.215 0.215 0.431 0.369 0.646 0.523 0.4 0.246 0.8 0.4 1.262 0.492 0.831 0.154 1.723 0.031 2.523-0.4 0.308-0.154 0.585-0.369 0.831-0.615l2-2zM13.877 12.615l1.415-1.415c0.123-0.123 0.123-0.308 0-0.431l-0.862-0.862c-0.123-0.123-0.308-0.123-0.431 0l-1.385 1.446-1.323-1.323c-0.123-0.123-0.308-0.123-0.431 0l-0.862 0.862c-0.123 0.123-0.123 0.308 0 0.431l1.323 1.323-1.292 1.292c-0.123 0.123-0.123 0.308 0 0.431l0.862 0.862c0.123 0.123 0.308 0.123 0.431 0l1.292-1.292 1.385 1.385c0.123 0.123 0.308 0.123 0.431 0l0.862-0.862c0.123-0.123 0.123-0.308 0-0.431l-1.415-1.415z"></path>
+</svg>
+<svg id="icon-baidu-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1050">
+<path fill="#1296db" d="M9.473 10.846c0.725-0.156 0.626-1.022 0.605-1.211-0.035-0.292-0.379-0.802-0.845-0.762-0.587 0.053-0.672 0.9-0.672 0.9-0.080 0.392 0.189 1.229 0.913 1.073zM10.243 12.353c-0.021 0.061-0.069 0.217-0.027 0.352 0.081 0.305 0.345 0.318 0.345 0.318h0.379v-0.928h-0.407c-0.183 0.055-0.271 0.197-0.291 0.258zM10.819 9.393c0.401 0 0.724-0.461 0.724-1.031s-0.323-1.030-0.724-1.030c-0.399 0-0.724 0.461-0.724 1.030s0.324 1.031 0.724 1.031zM12.543 9.461c0.535 0.069 0.879-0.501 0.947-0.935 0.070-0.432-0.275-0.935-0.654-1.021-0.379-0.087-0.853 0.521-0.897 0.917-0.052 0.485 0.069 0.969 0.603 1.038zM13.854 12.006s-0.828-0.641-1.311-1.333c-0.655-1.021-1.586-0.605-1.897-0.086-0.31 0.519-0.793 0.847-0.861 0.935-0.069 0.085-1 0.588-0.793 1.505s0.932 0.899 0.932 0.899 0.535 0.053 1.155-0.086c0.621-0.137 1.155 0.035 1.155 0.035s1.449 0.485 1.846-0.449c0.396-0.935-0.224-1.42-0.224-1.42zM11.374 13.397h-0.942c-0.407-0.081-0.569-0.359-0.589-0.406s-0.135-0.271-0.075-0.651c0.176-0.569 0.677-0.61 0.677-0.61h0.501v-0.617l0.427 0.007v2.277zM13.129 13.39h-1.084c-0.42-0.108-0.44-0.407-0.44-0.407v-1.199l0.44-0.007v1.078c0.027 0.115 0.169 0.136 0.169 0.136h0.447v-1.206h0.468v1.605zM14.664 10.189c0-0.207-0.172-0.831-0.81-0.831s-0.725 0.589-0.725 1.005c0 0.397 0.033 0.951 0.827 0.933s0.707-0.899 0.707-1.107zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l0.052-0.111c-0.201-0.083-0.385-0.213-0.533-0.393-0.345-0.423-0.433-0.979-0.368-1.358 0.062-0.522 0.394-1.388 1.275-1.467 0.032-0.003 0.069-0.005 0.106-0.005 0.001 0 0.002 0 0.003 0h-0c0.051 0 0.1 0.003 0.149 0.009 0.061-0.878 0.647-1.546 1.386-1.546 0.072 0 0.14 0.015 0.208 0.027l0.092-0.195c0.143-0.304 0.215-0.692 0.215-1.165 0-0.92-0.325-1.706-0.977-2.357s-1.437-0.977-2.357-0.977-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM8.734 14h-7.401l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h5.811c0.083 0.274 0.202 0.494 0.344 0.667z"></path>
+</svg>
+<svg id="icon-google-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1071">
+<path fill="#1296db" d="M10.813 8.519c0 0.622 0.208 1.071 0.618 1.335 0.335 0.216 0.725 0.249 0.927 0.249 0.049 0 0.089-0.002 0.116-0.004 0 0-0.064 0.418 0.246 0.832h-0.014c-0.537 0-2.289 0.112-2.289 1.553 0 1.465 1.609 1.54 1.932 1.54 0.025 0 0.040-0.001 0.040-0.001 0.003 0 0.027 0.001 0.066 0.001 0.207 0 0.743-0.026 1.24-0.268 0.645-0.313 0.972-0.858 0.972-1.619 0-0.735-0.499-1.173-0.863-1.493-0.222-0.195-0.414-0.363-0.414-0.527 0-0.167 0.14-0.292 0.317-0.451 0.287-0.257 0.557-0.622 0.557-1.313 0-0.607-0.079-1.015-0.564-1.273 0.051-0.026 0.229-0.045 0.318-0.057 0.263-0.036 0.647-0.077 0.647-0.291v-0.041h-1.916c-0.019-0.001-1.937 0.071-1.937 1.827zM13.906 12.274c0.037 0.586-0.465 1.019-1.217 1.073-0.765 0.056-1.394-0.288-1.431-0.873-0.018-0.281 0.106-0.557 0.348-0.777 0.245-0.223 0.583-0.359 0.949-0.387 0.043-0.003 0.086-0.005 0.129-0.005 0.707 0 1.187 0.416 1.221 0.968zM13.405 8.118c0.188 0.661-0.096 1.353-0.548 1.48-0.048 0.014-0.103 0.022-0.16 0.022-0 0-0 0-0 0h0c-0.415 0-0.825-0.419-0.977-0.997-0.085-0.325-0.078-0.608 0.019-0.881 0.096-0.268 0.268-0.449 0.485-0.511 0.048-0.014 0.103-0.022 0.16-0.022 0 0 0 0 0 0h-0c0.501 0 0.823 0.207 1.021 0.908zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l1.275-2.711c-0.009-0.099-0.017-0.199-0.017-0.308 0-1.052 0.509-1.742 1.153-2.151 0.109-0.284 0.174-0.621 0.174-1.034 0-0.92-0.325-1.706-0.977-2.357-0.651-0.652-1.437-0.977-2.357-0.977s-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM9.895 10.667l0.313-0.667h0.225c0.137 0.189 0.299 0.35 0.483 0.48l0.006 0.004c-0.115 0.055-0.221 0.116-0.322 0.182h-0.705zM10.184 14h-8.851l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h7.195c0.099 0.255 0.235 0.479 0.411 0.667z"></path>
+</svg>
+<svg id="icon-about" width="16" height="16" viewBox="0 0 16 16" x="0" y="1092">
+<path fill="#1296db" d="M8.011 0.991c-3.868 0-7.003 3.135-7.003 7.003s3.135 7.003 7.003 7.003 7.003-3.136 7.003-7.003c0-3.868-3.135-7.003-7.003-7.003zM7.984 11.487c-0.399 0-0.723-0.333-0.723-0.743s0.324-0.743 0.723-0.743c0.399 0 0.723 0.333 0.723 0.743s-0.324 0.743-0.723 0.743zM10.003 6.816c-0.1 0.192-0.218 0.357-0.355 0.496s-0.384 0.374-0.739 0.704c-0.098 0.093-0.177 0.174-0.236 0.245s-0.103 0.134-0.132 0.193c-0.026 0.050-0.049 0.108-0.066 0.168l-0.002 0.007c-0.016 0.059-0.040 0.161-0.072 0.308-0.055 0.312-0.227 0.467-0.516 0.467-0.15 0-0.277-0.051-0.379-0.153s-0.154-0.253-0.154-0.454c0-0.251 0.037-0.47 0.113-0.654s0.175-0.347 0.299-0.486c0.124-0.139 0.292-0.305 0.503-0.497 0.185-0.168 0.319-0.294 0.401-0.38 0.080-0.083 0.149-0.176 0.205-0.279l0.003-0.007c0.056-0.105 0.085-0.219 0.085-0.341 0-0.24-0.086-0.442-0.258-0.607s-0.394-0.247-0.666-0.247c-0.318 0-0.552 0.083-0.702 0.25s-0.277 0.411-0.382 0.735c-0.098 0.339-0.285 0.508-0.559 0.508-0.162 0-0.298-0.059-0.41-0.178s-0.167-0.247-0.167-0.384c0-0.285 0.088-0.573 0.264-0.866s0.434-0.534 0.772-0.726c0.338-0.192 0.733-0.288 1.183-0.288 0.419 0 0.789 0.080 1.11 0.24s0.569 0.378 0.743 0.654c0.175 0.276 0.262 0.576 0.262 0.899 0 0.255-0.050 0.478-0.15 0.67z"></path>
+</svg>
+<svg id="icon-blockquote" width="16" height="16" viewBox="0 0 16 16" x="0" y="1113">
+<path fill="#1296db" d="M13.631 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8zM6 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8z"></path>
+</svg>
+<svg id="icon-table-attr" width="16" height="16" viewBox="0 0 16 16" x="0" y="1134">
+<path fill="#1296db" d="M15.204 1.055h-14.364c-0.41 0-0.743 0.333-0.743 0.743v12.383c0 0.41 0.333 0.743 0.743 0.743h14.364c0.41 0 0.743-0.333 0.743-0.743v-12.383c0-0.41-0.333-0.743-0.743-0.743l-0-0zM15.204 4.027v2.903h-4.293v-2.903h4.293zM5.875 10.563v-2.889h4.293v2.889h-4.293zM10.168 11.306v2.875h-4.293v-2.875h4.293zM5.132 10.563h-4.293v-2.889h4.293v2.889zM10.168 4.027v2.903h-4.293v-2.903h4.293zM10.911 7.674h4.293v2.889h-4.293v-2.889zM6.040 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM3.811 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 4.027h3.55v2.903h-4.293l0-2.903h0.743zM0.839 11.306h4.293v2.875h-4.293v-2.875zM10.911 14.181v-2.875h4.293v2.875h-4.293z"></path>
+</svg>
+<svg id="icon-insert-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1155">
+<path fill="#1296db" d="M14 0h-2s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h2c0.552 0 1-0.448 1-1v-10c0-0.552-0.448-1-1-1zM14 11h-2v-3h2v3zM14 7h-2v-2h2v2zM14 4h-2v-3h2v3zM9 13l-2 3h5l-2-3h-1zM8 11v-10c0-0.552-0.448-1-1-1h-5s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h5c0.552 0 1-0.448 1-1zM7 7h-2v-2h2v2zM7 1v3h-2v-3h2zM4 11h-2v-3h2v3zM4 7h-2v-2h2v2zM4 4h-2v-3h2v3zM5 8h2v3h-2v-3z"></path>
+</svg>
+<svg id="icon-insert-row" width="18" height="16" viewBox="0 0 18 16" x="0" y="1176">
+<path fill="#1296db" d="M17.143 16h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143zM9.143 9.143h-3.429v2.286h3.429v-2.286zM9.143 12.571h-3.429v2.286h3.429v-2.286zM12.571 9.143h-2.286v2.286h2.286v-2.286zM12.571 12.571h-2.286v2.286h2.286v-2.286zM17.143 9.143h-3.429v2.286h3.429v-2.286zM13.714 12.571v2.286h3.429v-2.286h-3.429zM17.143 4.571h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143zM9.143 1.143h-3.429v2.286h3.429v-2.286zM12.571 1.143h-2.286v2.286h2.286v-2.286zM17.143 1.143h-3.429v2.286h3.429v-2.286zM0 3.429l3.429 2.286v1.143l-3.429 2.286v-5.714z"></path>
+</svg>
+<svg id="icon-merge-table" width="21" height="16" viewBox="0 0 21 16" x="0" y="1197">
+<path fill="#1296db" d="M1.484 2.296c0-0.615 0.242-1.198 0.682-1.63 0.43-0.432 1.005-0.666 1.62-0.666h0.016l10.845 0.059c0.615 0 1.198 0.242 1.63 0.682s0.666 1.021 0.666 1.637l-0.059 10.845c0 0.615-0.242 1.198-0.682 1.63-0.432 0.432-1.007 0.666-1.622 0.666h-0.016l-10.845-0.059c-0.615 0-1.198-0.242-1.63-0.682s-0.666-1.023-0.666-1.639l0.061-10.843zM6.199 1.048l-2.412-0.016c-0.333 0-0.65 0.134-0.897 0.374-0.242 0.242-0.374 0.556-0.374 0.897l-0.016 2.461h3.7v-3.716zM10.98 1.072l-3.742-0.024v3.718h3.742v-3.693zM12.020 14.463l2.552 0.016c0.341 0 0.658-0.124 0.897-0.365 0.242-0.242 0.374-0.556 0.374-0.897l0.016-2.579h-3.842v3.825zM12.020 9.598h3.844l0.016-3.793h-3.868v3.793h0.008zM12.020 4.765h3.868l0.016-2.396c0-0.333-0.124-0.658-0.365-0.897-0.242-0.242-0.556-0.374-0.897-0.374l-2.619-0.016v3.683z"></path>
+<path fill="#1296db" d="M5.005 1.478c0.008 0 0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-merge-td" width="16" height="16" viewBox="0 0 16 16" x="0" y="1218">
+<path fill="#1296db" d="M11.371 9.493h2.837v-2.987h-12.416v2.987h9.579zM0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333z"></path>
+</svg>
+<svg id="icon-remove-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1239">
+<path fill="#1296db" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM7 12h1v1h-1s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h5c0.552 0 1 0.448 1 1v7h-1v-3h-2v3h-1v-3h-2v3h1v1h-1v3zM10 4h2v-3h-2v3zM9 4v-3h-2v3h2zM1 13s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h2c0.552 0 1 0.448 1 1v12h-3zM3 1h-2v3h2v-3zM3 5h-2v3h2v-3zM3 9h-2v3h2v-3z"></path>
+</svg>
+<svg id="icon-remove-row" width="16" height="16" viewBox="0 0 16 16" x="0" y="1260">
+<path fill="#1296db" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM9 8h-4v2h1.667l0.333 1h-2v2h2.667l0.333 1h-7c-0.552 0-1-0.448-1-1v-5s0.448-1 1-1h12v1h-4zM4 8h-3v2h3v-2zM4 11h-3v2h3v-2zM1 4c-0.552 0-1-0.448-1-1v-2s0.448-1 1-1h11c0.552 0 1 0.448 1 1v3h-12zM4 1h-3v2h3v-2zM8 1h-3v2h3v-2zM12 1h-3v2h3v-2z"></path>
+</svg>
+<svg id="icon-remove-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="1281">
+<path fill="#1296db" d="M14.857 16v-3.429l3.429-2.286v3.429l-3.429 2.286zM8 11.429l4.571-3.429h5.714l-4.571 3.429h-5.714zM13.714 4.571h-3.429v3.429h-4.571v2.286h1.143v1.143h-5.714c-0.631 0-1.143-0.512-1.143-1.143v-9.143c0-0.631 0.512-1.143 1.143-1.143h12.571c0.631 0 1.143 0.512 1.143 1.143v5.714h-1.143v-2.286zM4.571 1.143h-3.429v2.286h3.429v-2.286zM4.571 4.571h-3.429v2.286h3.429v-2.286zM4.571 8h-3.429v2.286h3.429v-2.286zM9.143 1.143h-3.429v2.286h3.429v-2.286zM9.143 4.571h-3.429v2.286h3.429v-2.286zM13.714 1.143h-3.429v2.286h3.429v-2.286zM13.714 16h-5.714v-3.429h5.714v3.429z"></path>
+</svg>
+<svg id="icon-insert-col2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1302">
+<path fill="#1296db" d="M2 16h2s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v10c0 0.552 0.448 1 1 1zM2 5h2v3h-2v-3zM2 9h2v2h-2v-2zM2 12h2v3h-2v-3zM7 3l2-3h-5l2 3h1zM8 5v10c0 0.552 0.448 1 1 1h5s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-5c-0.552 0-1 0.448-1 1zM9 9h2v2h-2v-2zM9 15v-3h2v3h-2zM12 5h2v3h-2v-3zM12 9h2v2h-2v-2zM12 12h2v3h-2v-3zM11 8h-2v-3h2v3z"></path>
+</svg>
+<svg id="icon-insert-row2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1323">
+<path fill="#1296db" d="M1.154 0h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143zM9.154 6.857h3.429v-2.286h-3.429v2.286zM9.154 3.429h3.429v-2.286h-3.429v2.286zM5.725 6.857h2.286v-2.286h-2.286v2.286zM5.725 3.429h2.286v-2.286h-2.286v2.286zM1.154 6.857h3.429v-2.286h-3.429v2.286zM4.583 3.429v-2.286h-3.429v2.286h3.429zM1.154 11.429h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143zM9.154 14.857h3.429v-2.286h-3.429v2.286zM5.725 14.857h2.286v-2.286h-2.286v2.286zM1.154 14.857h3.429v-2.286h-3.429v2.286zM18.297 12.571l-3.429-2.286v-1.143l3.429-2.286v5.714z"></path>
+</svg>
+<svg id="icon-split-table" width="16" height="16" viewBox="0 0 16 16" x="0" y="1344">
+<path fill="#1296db" d="M0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333zM10.667 9.493v-2.987h-1.792v2.987h1.792zM14.208 9.493v-2.987h-1.792v2.987h1.792zM3.584 9.493v-2.987h-1.792v2.987h1.792zM7.125 9.493v-2.987h-1.792v2.987h1.792z"></path>
+</svg>
+<svg id="icon-merge-table2" width="21" height="16" viewBox="0 0 21 16" x="0" y="1365">
+<path fill="#1296db" d="M19.297 2.296c0-0.615-0.242-1.198-0.682-1.63-0.43-0.432-1.005-0.666-1.62-0.666h-0.016l-10.845 0.059c-0.615 0-1.198 0.242-1.63 0.682s-0.666 1.021-0.666 1.637l0.059 10.845c0 0.615 0.242 1.198 0.682 1.63 0.432 0.432 1.007 0.666 1.622 0.666h0.016l10.845-0.059c0.615 0 1.198-0.242 1.63-0.682s0.666-1.023 0.666-1.639l-0.061-10.843zM14.583 1.048l2.412-0.016c0.333 0 0.65 0.134 0.897 0.374 0.242 0.242 0.374 0.556 0.374 0.897l0.016 2.461h-3.7v-3.716zM9.801 1.072l3.742-0.024v3.718h-3.742v-3.693zM8.761 14.463l-2.552 0.016c-0.341 0-0.658-0.124-0.897-0.365-0.242-0.242-0.374-0.556-0.374-0.897l-0.016-2.579h3.842v3.825zM8.761 9.598h-3.844l-0.016-3.793h3.868v3.793h-0.008zM8.761 4.765h-3.868l-0.016-2.396c0-0.333 0.124-0.658 0.365-0.897 0.242-0.242 0.556-0.374 0.897-0.374l2.619-0.016v3.683z"></path>
+<path fill="#1296db" d="M15.777 1.478c-0.008 0-0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-remove2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1386">
+<path fill="#1296db" d="M6.214 13.804c0.401 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726zM15.299 1.464h-6.178v-0.726c0-0.401-0.325-0.726-0.727-0.726h-0.727c-0.401 0-0.727 0.325-0.727 0.726v0.726h-6.177c-0.008-0-0.017-0-0.026-0-0.401 0-0.726 0.325-0.726 0.726s0.325 0.726 0.726 0.726c0.009 0 0.018-0 0.027-0.001l-0.001 0h1.090v11.615c0.001 0.802 0.651 1.452 1.453 1.452 0 0 0.001 0 0.001 0h9.448c0 0 0.001 0 0.001 0 0.802 0 1.452-0.65 1.453-1.452v-11.615h1.090c0.008 0 0.017 0 0.026 0 0.401 0 0.726-0.325 0.726-0.726s-0.325-0.726-0.726-0.726c-0.009 0-0.018 0-0.027 0l0.001-0zM12.755 13.804c0 0.401-0.325 0.726-0.727 0.726h-7.994c-0.401 0-0.727-0.325-0.727-0.726v-10.889h9.448v10.889zM9.847 13.804c0.402 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726z"></path>
+</svg>
+<svg id="icon-ok" width="16" height="16" viewBox="0 0 16 16" x="0" y="1407">
+<path fill="#1296db" d="M8 16c-4.418 0-8-3.582-8-8s3.582-8 8-8c4.418 0 8 3.582 8 8s-3.582 8-8 8zM12.177 4.986l-4.894 4.894-3.364-3.365-0.918 0.918 4.282 4.283 5.811-5.812-0.917-0.918z"></path>
+</svg>
+<svg id="icon-remove" width="16" height="16" viewBox="0 0 16 16" x="0" y="1428">
+<path fill="#1296db" d="M8 1c-3.867 0-7 3.133-7 7s3.133 7 7 7 7-3.133 7-7c0-3.867-3.133-7-7-7zM11.167 10.7c0.133 0.133 0.133 0.333 0 0.467s-0.333 0.133-0.467 0l-2.7-2.7-2.7 2.7c-0.133 0.133-0.333 0.133-0.467 0s-0.133-0.333 0-0.467l2.7-2.7-2.7-2.7c-0.133-0.133-0.133-0.333 0-0.467s0.333-0.133 0.467 0l2.7 2.7 2.7-2.7c0.133-0.133 0.333-0.133 0.467 0s0.133 0.333 0 0.467l-2.7 2.7 2.7 2.7z"></path>
+</svg>
+<svg id="icon-graft2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1449">
+<path fill="#1296db" d="M11.658 0.504c0.216-0.218 0.516-0.354 0.848-0.354s0.631 0.135 0.847 0.354l1.664 1.664c0.217 0.217 0.351 0.517 0.351 0.848s-0.134 0.631-0.351 0.848l-9.336 9.336c-0.468 0.468-1.365 0.954-2.024 1.089l-3.048 0.625 0.625-3.048c0.133-0.65 0.62-1.557 1.088-2.025l9.336-9.336zM9.96 2.202l-0.848 0.849 3.358 3.359 0.849-0.849-3.359-3.359zM12.184 12.804c0.905-0.457 1.054-0.865 0.639-1.526-0.338-0.537-1.675-0.285-1.797 0.805-0.044 0.398 0.117 0.753 0.421 1.026 0.28-0.096 0.525-0.197 0.737-0.305zM13.063 13.682c-0.092 0.059-0.206 0.124-0.322 0.183l-0.025 0.012c-0.396 0.201-0.877 0.38-1.442 0.54-1.27 0.36-2.968 0.617-5.104 0.781-0.013 0.001-0.028 0.002-0.043 0.002-0.314 0-0.572-0.243-0.594-0.552l-0-0.002c-0.001-0.014-0.002-0.031-0.002-0.048 0-0.313 0.24-0.57 0.547-0.596l0.002-0c1.652-0.127 3.021-0.311 4.101-0.548 0.479-0.104 0.901-0.22 1.266-0.345 0.367 0.331 0.943 0.544 1.616 0.573 0.981 0.043 2.17-0.303 3.22-1.242 0.104-0.093 0.242-0.15 0.393-0.15 0.177 0 0.336 0.078 0.444 0.202l0.001 0.001c0.093 0.106 0.149 0.245 0.149 0.398 0 0.178-0.077 0.338-0.2 0.449l-0.001 0c-1.888 1.687-4.29 1.855-5.796 1.079-0.462-0.238-0.84-0.565-1.093-0.964-0.221-0.346-0.353-0.767-0.353-1.219 0-0.101 0.007-0.2 0.019-0.297l-0.001 0.011c0.25-2.25 3.058-2.78 3.979-1.315 0.752 1.197 0.45 2.291-0.762 3.048z"></path>
+</svg>
+<svg id="icon-func" width="17" height="16" viewBox="0 0 17 16" x="0" y="1470">
+<path fill="#1296db" d="M0.531 15.51v-2.065h4.213c-1.236-0.919-2.162-1.924-2.78-3.018-0.582-1.007-0.926-2.215-0.926-3.503 0-0.014 0-0.029 0-0.043l-0 0.002c0-1.992 0.695-3.612 2.086-4.861 1.39-1.25 3.193-1.874 5.406-1.874 2.215 0 4.017 0.625 5.408 1.874s2.086 2.869 2.086 4.86c0 1.263-0.309 2.441-0.927 3.535s-1.544 2.103-2.78 3.028h4.213v2.065h-6.854v-2.065c1.012-0.756 1.772-1.663 2.278-2.72 0.506-1.056 0.76-2.263 0.76-3.62 0-1.519-0.373-2.715-1.12-3.59-0.745-0.874-1.767-1.31-3.063-1.31s-2.317 0.438-3.063 1.316c-0.746 0.877-1.119 2.076-1.119 3.595 0 1.356 0.253 2.562 0.76 3.615s1.265 1.958 2.278 2.714v2.065h-6.857z"></path>
+</svg>
+<svg id="icon-find" width="16" height="16" viewBox="0 0 16 16" x="0" y="1491">
+<path fill="#1296db" d="M1 0h6v1h-6zM9 0h6v1h-6zM14.875 5h-0.875v-4h-4v4h-4v-4h-4v4h-0.875c-0.619 0-1.125 0.506-1.125 1.125v8.75c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-5.875h2v5.875c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-8.75c0-0.619-0.506-1.125-1.125-1.125zM5.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5zM8.5 8h-1c-0.275 0-0.5-0.225-0.5-0.5s0.225-0.5 0.5-0.5h1c0.275 0 0.5 0.225 0.5 0.5s-0.225 0.5-0.5 0.5zM14.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5z"></path>
+</svg>
+<svg id="icon-date" width="16" height="16" viewBox="0 0 16 16" x="0" y="1512">
+<path fill="#1296db" d="M13.597 2.081h-0.584v2.837c0 0.603-0.489 1.093-1.093 1.093s-1.092-0.49-1.092-1.093v-2.837h-5.64v2.83c0 0.604-0.49 1.094-1.094 1.094-0.603 0-1.092-0.49-1.092-1.094v-2.83h-0.6c-0.775 0-1.402 0.628-1.402 1.402v3.070h14v-3.070c0-0.774-0.627-1.402-1.403-1.402zM4.927 4.612c0 0.463-0.376 0.837-0.837 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.375-0.837 0.837-0.837v0c0.461 0 0.837 0.374 0.837 0.837v2.76zM12.78 4.612c0 0.463-0.374 0.837-0.838 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.374-0.837 0.837-0.837v0c0.464 0 0.838 0.374 0.838 0.837v2.76zM14.182 7.133v5.608c0 0.774-0.627 1.401-1.401 1.401h-9.573c-0.774 0-1.401-0.627-1.401-1.401v-5.608h-0.807v6.45c0 0.774 0.627 1.403 1.403 1.403h11.193c0.776 0 1.403-0.629 1.403-1.403v-6.45h-0.817zM8.393 11.198h1.101c0.109 0.504 0.389 0.649 0.662 0.649 0.405 0 0.651-0.262 0.651-0.723 0-0.26-0.097-0.626-0.651-0.64h-0.351v-0.69h0.159c0.554-0.014 0.687-0.241 0.687-0.66 0-0.271-0.201-0.468-0.526-0.477-0.426-0.011-0.491 0.185-0.598 0.443l-1.031 0.002c0.239-0.793 0.793-1.196 1.661-1.21 1.052 0.028 1.597 0.453 1.635 1.274 0 0.403-0.232 0.708-0.692 0.909 0.589 0.202 0.885 0.563 0.885 1.080-0.037 0.865-0.646 1.319-1.827 1.362-0.998 0.001-1.599-0.483-1.765-1.319zM7.633 11.479v0.975h-3.543v-0.629c0.386-0.605 0.771-1.059 1.492-1.52 0.663-0.433 0.894-0.763 0.894-1.080 0-0.070 0.003-0.433-0.531-0.433-0.372 0.014-0.645 0.182-0.645 0.565l-1.128 0.007c0.065-1.087 0.95-1.473 1.856-1.473 1.032 0.043 1.586 0.482 1.66 1.317 0.037 0.563-0.28 1.101-1.148 1.634-0.48 0.287-0.523 0.319-0.817 0.636h1.91z"></path>
+</svg>
+<svg id="icon-clock" width="16" height="16" viewBox="0 0 16 16" x="0" y="1533">
+<path fill="#1296db" d="M11.331 7.805h-2.732v-2.199c0-0.333-0.267-0.6-0.6-0.6s-0.6 0.267-0.6 0.6v2.932c0.067 0.267 0.267 0.466 0.533 0.466h3.398c0.333 0 0.6-0.267 0.6-0.6s-0.267-0.6-0.6-0.6zM13.53 3.074c-1.399-1.399-3.331-2.199-5.53-2.199-2.132 0-4.131 0.866-5.53 2.199-1.399 1.399-2.265 3.265-2.265 5.33s0.866 3.998 2.265 5.33c1.399 1.399 3.331 2.199 5.53 2.199 2.132 0 4.131-0.866 5.53-2.199 1.399-1.399 2.265-3.265 2.265-5.33s-0.866-3.998-2.265-5.33zM12.664 12.935c-1.199 1.133-2.865 1.866-4.664 1.866s-3.465-0.733-4.664-1.866c-1.199-1.133-1.932-2.732-1.932-4.531s0.733-3.398 1.932-4.531c1.199-1.133 2.865-1.866 4.664-1.866s3.465 0.733 4.664 1.866c1.199 1.133 1.932 2.798 1.932 4.531 0 1.799-0.733 3.398-1.932 4.531zM1.271 2.874l2.332-1.866c0.267-0.2 0.267-0.6 0.067-0.8-0.2-0.267-0.6-0.267-0.866-0.067l-2.332 1.866c-0.267 0.2-0.333 0.6-0.067 0.8 0.2 0.267 0.6 0.267 0.866 0.067zM14.729 2.874c0.267 0.2 0.666 0.133 0.866-0.067 0.2-0.267 0.133-0.6-0.067-0.8l-2.332-1.866c-0.267-0.2-0.666-0.133-0.866 0.067-0.2 0.267-0.2 0.6 0.067 0.8l2.332 1.866z"></path>
+</svg>
+</svg>
diff --git a/addons/nkeditor/assets/themes/common/anchor.gif b/addons/nkeditor/assets/themes/common/anchor.gif
new file mode 100644
index 0000000..61145ea
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/anchor.gif differ
diff --git a/addons/nkeditor/assets/themes/common/blank.gif b/addons/nkeditor/assets/themes/common/blank.gif
new file mode 100644
index 0000000..5bfd67a
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/blank.gif differ
diff --git a/addons/nkeditor/assets/themes/common/common.css b/addons/nkeditor/assets/themes/common/common.css
new file mode 100644
index 0000000..a92c5de
--- /dev/null
+++ b/addons/nkeditor/assets/themes/common/common.css
@@ -0,0 +1,605 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+/*# sourceMappingURL=common.css.map */
diff --git a/addons/nkeditor/assets/themes/common/common.css.map b/addons/nkeditor/assets/themes/common/common.css.map
new file mode 100644
index 0000000..0844fe0
--- /dev/null
+++ b/addons/nkeditor/assets/themes/common/common.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": ";AAgCA;;EAEE;AAEF,YAAa;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;;AAEf,kBAAmB;EACf,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,CAAC;EACZ,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,CAAC;EACd,UAAU,EAAE,MAAM;;AAGtB,YAAa;EACT,SAAS,EAAE,MAAM;EACjB,kBAAkB,EAAE,IAAI;EACxB,mBAAmB,EAAE,IAAI;;AAE7B,iBAQC;EAPG,IAAK;IACD,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,sBAAsB;EAErC,GAAI;IACA,OAAO,EAAE,CAAC;AAKlB,eAAgB;EACZ,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,iBAAiB;EACzB,OAAO,EAAE,GAAG;;AAEhB,eAAgB;EACZ,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,iBAAiB;EACzB,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,MAAM;EACf,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,CAAC;EACN,QAAQ,EAAE,QAAQ;;AAGtB;;GAEG;AACH,aAAc;EAEV,OAAO,EAAE,KAAK;EAEd,gBAAgB,EAAE,IAAI;EACtB,QAAQ,EAAE,MAAM;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,gEAA0D;EAEtE;;KAEG;EAcH;;KAEG;EA0DH;;KAEG;EAwBH;;KAEG;EArGH,wBAAW;IAvEX,UAAU,EAAE,mBAAmB;IAC/B,eAAe,EAAE,mBAAmB;IACpC,kBAAkB,EAAE,mBAAmB;IACvC,MAAM,EAAE,oFAAoF;IAsExF,gBAAgB,EAAE,OAAO;EAG7B;;;kCAGmB;IACf,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,IAAI;EAMzB,yBAAY;IAER,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,OAAO;IAEhB,qCAAY;MAER,OAAO,EAAE,QAAQ;MACjB,SAAS,EAAE,CAAC;MACZ,WAAW,EAAE,CAAC;MACd,MAAM,EAAE,OAAO;MACf,OAAO,EAAE,KAAK;MACd,KAAK,EAAE,IAAI;MAEX;;SAEG;MACH,sDAAiB;QApHzB,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,OAAO;IAoHX,gCAAO;MACH,UAAU,EAAE,OAAO;IAEvB,sCAAa;MACT,gBAAgB,EAAE,OAAO;IAE7B,sCAAa;MACT,MAAM,EAAE,OAAO;IAEnB,uCAAc;MACV,MAAM,EAAE,IAAI;MACZ,MAAM,EAAE,OAAO;MACf,WAAW,EAAE,iBAAiB;MAC9B,YAAY,EAAE,iBAAiB;MAC/B,UAAU,EAAE,CAAC;MACb,aAAa,EAAE,CAAC;MAChB,KAAK,EAAE,CAAC;MACR,SAAS,EAAE,CAAC;MACZ,WAAW,EAAE,CAAC;MACd,QAAQ,EAAE,MAAM;MAChB,OAAO,EAAE,KAAK;MACd,KAAK,EAAE,IAAI;IAEf,gCAAO;MACH,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,GAAG;MACX,KAAK,EAAE,sBAAsB;MAC7B,UAAU,EAAE,OAAO;EAQ3B,sBAAS;IACL,OAAO,EAAE,CAAC;IAEV;4CACkB;MACd,MAAM,EAAE,CAAC;MACT,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,CAAC;MACV,QAAQ,EAAE,IAAI;IAElB,wCAAkB;MACd,IAAI,EAAE,4FAA4F;MAClG,KAAK,EAAE,IAAI;MACX,QAAQ,EAAE,IAAI;MACd,MAAM,EAAE,IAAI;MAEZ,8CAAQ;QACJ,OAAO,EAAE,IAAI;EASzB,2BAAc;IACV,QAAQ,EAAE,QAAQ;IAClB,gBAAgB,EAAE,OAAO;IACzB,UAAU,EAvMG,iBAAiB;IAwM9B,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,IAAI;IAEb,qDAA0B;MACtB,mBAAmB,EAAE,WAAW;MAChC,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,IAAI;IAGhB,oDAAyB;MACrB,QAAQ,EAAE,QAAQ;MAClB,KAAK,EAAE,CAAC;MACR,MAAM,EAAE,CAAC;MACT,MAAM,EAAE,SAAS;MACjB,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,IAAI;;AAMxB;;OAEO;AACP,QAAS;EACL,MAAM,EArOW,iBAAiB;EAsOlC,gBAAgB,EArOL,OAAO;EAsOlB,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,GAAG;EACZ,WAAW,EAAE,wCAAwC;EACrD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,MAAM;EAgEhB;;KAEG;EAhEH,sBAAc;IACV,MAAM,EAAE,iBAAiB;IACzB,gBAAgB,EAAE,OAAO;IACzB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,OAAO;IAEf,uCAAiB;MAlPrB,OAAO,EAAE,iBAAiB;MAC1B,OAAO,EAAE,YAAY;MACrB,cAAc,EAAE,MAAM;MACtB,IAAI,EAAE,CAAC;MACP,QAAQ,EAAE,MAAM;MAiPR,wDAAiB;QArPzB,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,MAAM;QACtB,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,MAAM;IAsPZ,yCAAmB;MACf,KAAK,EAAE,IAAI;MACX,UAAU,EAAE,MAAM;MAClB,QAAQ,EAAE,MAAM;IAKpB,2CAAqB;MACjB,KAAK,EAAE,CAAC;MACR,MAAM,EAAE,IAAI;MACZ,WAAW,EAAE,iBAAiB;MAC9B,YAAY,EAAE,iBAAiB;MAC/B,UAAU,EAAE,CAAC;MACb,aAAa,EAAE,CAAC;IAGpB,8CAAwB;MACpB,WAAW,EAAE,iBAAiB;MAC9B,YAAY,EAAE,iBAAiB;IAGnC,0CAAoB;MAChB,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,SAAS;MAClB,WAAW,EAAE,IAAI;MACjB,UAAU,EAAE,IAAI;MAChB,QAAQ,EAAE,MAAM;IAGpB,yCAAmB;MACf,MAAM,EAAE,KAAK;MACb,MAAM,EAAE,CAAC;MACT,QAAQ,EAAE,MAAM;MAChB,UAAU,EAjSD,iBAAiB;MAkS1B,aAAa,EAAE,iBAAiB;MAChC,WAAW,EAAE,CAAC;MACd,YAAY,EAAE,CAAC;EAIvB,yBAAiB;IACb,MAAM,EAAE,iBAAiB;IACzB,gBAAgB,EAAE,OAAO;EAM7B,6BAAqB;IACjB,QAAQ,EAAE,QAAQ;IAElB,yCAAY;MACR,QAAQ,EAAE,QAAQ;MAClB,UAAU,EAAE,MAAM;MAClB,MAAM,EAAE,GAAG;MACX,OAAO,EAAE,IAAI;MACb,GAAG,EAAE,CAAC;MACN,MAAM,EAAE,iBAAiB;MACzB,gBAAgB,EAAE,OAAO;MACzB,OAAO,EAAE,IAAI;MAEb,yDAAgB;QACZ,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IAIlB,uCAAU;MACN,MAAM,EAAE,CAAC;MACT,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,CAAC;MACV,eAAe,EAAE,QAAQ;MAEzB,gDAAS;QACL,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,GAAG;QACZ,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,OAAO;QAEf,wDAAQ;UACJ,OAAO,EAAE,KAAK;UACd,iBAAiB,EAAE,SAAS;UAC5B,QAAQ,EAAE,MAAM;UAChB,MAAM,EAAE,GAAG;UACX,KAAK,EAAE,IAAI;UACX,MAAM,EAAE,IAAI;UACZ,MAAM,EAAE,CAAC;UACT,OAAO,EAAE,CAAC;UACV,MAAM,EAAE,CAAC;MAGjB,8CAAO;QACH,MAAM,EAAE,iBAAiB;QACzB,gBAAgB,EAAE,OAAO;IAIjC,sCAAS;MACL,UAAU,EAAE,KAAK;MACjB,MAAM,EAAE,GAAG;MACX,OAAO,EAAE,CAAC;MACV,MAAM,EAAE,CAAC;MACT,IAAI,EAAE,+CAA+C;MACrD,KAAK,EAAE,IAAI;MACX,eAAe,EAAE,IAAI;;AAOjC;;GAEG;AACH,eAAgB;EACZ,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,GAAG;EAEZ,qCAAsB;IAClB,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,eAAe,EAAE,QAAQ;IAEzB,0DAAqB;MACjB,SAAS,EAAE,CAAC;MACZ,WAAW,EAAE,CAAC;MACd,MAAM,EAAE,iBAAiB;MACzB,MAAM,EAAE,OAAO;MACf,MAAM,EAAE,GAAG;MACX,OAAO,EAAE,CAAC;MAEV,qFAA2B;QACvB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;IAGjB,8DAAyB;MACrB,WAAW,EAAE,wCAAwC;MACrD,SAAS,EAAE,IAAI;MACf,WAAW,EAAE,IAAI;MACjB,MAAM,EAAE,iBAAiB;MACzB,MAAM,EAAE,OAAO;MACf,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,CAAC;MACV,UAAU,EAAE,MAAM;IAEtB,6DAAwB;MACpB,MAAM,EAAE,iBAAiB;IAE7B,mEAA8B;MAC1B,MAAM,EAAE,iBAAiB;;AAMrC;;GAEG;AACH,UAAW;EACP,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,MAAM,EAxaW,iBAAiB;EAyalC,IAAI,EAAE,CAAC;EAnZP,UAAU,EAAE,mBAAmB;EAC/B,eAAe,EAAE,mBAAmB;EACpC,kBAAkB,EAAE,mBAAmB;EACvC,MAAM,EAAE,oFAAoF;EAkZ5F,aAAa,EAAE,GAAG;EAClB,kBAAkB,EAAE,GAAG;EACvB,qBAAqB,EAAE,GAAG;EAC1B,QAAQ,EAAE,MAAM;EAGhB,4BAAkB;IACd,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,sBAAsB,EAAE,GAAG;IAC3B,uBAAuB,EAAE,GAAG;IAC5B,aAAa,EAAE,iBAAiB;IAChC,UAAU,EAAE,kEAAkE;IAC9E,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,IAAI;IAEZ,kDAAsB;MAClB,MAAM,EAAE,IAAI;MACZ,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,OAAO;MACf,UAAU,EAAE,sCAAsC;MAClD,QAAQ,EAAE,QAAQ;MAClB,KAAK,EAAE,GAAG;MACV,GAAG,EAAE,GAAG;MAER,wDAAQ;QACJ,mBAAmB,EAAE,SAAS;EAO1C,6BAAmB;IAEf,gBAAgB,EAAE,IAAI;IACtB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IAGP,6CAAgB;MACZ,IAAI,EAAE,iDAAiD;MACvD,UAAU,EAAE,IAAI;MAChB,QAAQ,EAAE,MAAM;MAChB,KAAK,EAAE,IAAI;MAEX,0DAAa;QACT,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,wCAAwC;QACrD,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,iBAA2B;QAEnC,gEAAQ;UACJ,YAAY,EAhfP,OAAO;UAifZ,OAAO,EAAE,IAAI;MAIrB,wDAAW;QACP,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,MAAM;QACtB,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,iBAA2B;QACnC,MAAM,EA5fP,IAAI;MA8fP,sDAAS;QACL,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;MAGd,8DAAiB;QACb,KAAK,EAAE,IAAI;MAGf,gEAAmB;QACf,QAAQ,EAAE,QAAQ;QAClB,GAAG,EAAC,GAAG;MAGX,sDAAS;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,IAAI;QAEZ,4DAAQ;UACJ,OAAO,EAAE,IAAI;MAIrB,4DAAe;QACX,OAAO,EAAE,uBAAuB;QAChC,SAAS,EAAE,KAAK;QAChB,MAAM,EA1hBP,IAAI;QA2hBH,WAAW,EA3hBZ,IAAI;QA4hBH,MAAM,EAAC,iBAA2B;QAClC,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,MAAM;QAEhB,kEAAQ;UACJ,YAAY,EAriBP,OAAO;MAyiBpB,6DAAgB;QACZ,MAAM,EAxiBD,iBAAiB;QAyiBtB,gBAAgB,EAAE,OAAO;QACzB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,GAAG;QACjB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,MAAM;QACtB,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,MAAM;MAGpB,6DAAgB;QACZ,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,GAAG,EAAC,IAAI;QACR,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,IAAI;QAEb,6EAAgB;UACZ,QAAQ,EAAE,QAAQ;UAClB,SAAS,EAAE,IAAI;UACf,GAAG,EAAE,CAAC;UACN,KAAK,EAAE,CAAC;UACR,OAAO,EAAE,CAAC;UACV,MAAM,EAAE,CAAC;UACT,OAAO,EAAE,MAAM;UACf,MAAM,EAAE,MAAM;UACd,OAAO,EAAE,CAAC;UACV,MAAM,EAAE,OAAO;UACf,KAAK,EAAE,IAAI;UACX,MAAM,EAAE,IAAI;UACZ,MAAM,EAAE,gBAAgB;QAI5B,+EAAkB;UACd,GAAG,EAAE,IAAI;QAEb,wEAAW;UACP,OAAO,EAAE,QAAQ;MAIzB,sEAAyB;QACrB,OAAO,EAAE,kBAAkB;QAkE3B;;WAEG;QAlEH,qFAAe;UACX,MAAM,EAAC,iBAAiB;UACxB,aAAa,EAAE,IAAI;UACnB,QAAQ,EAAE,MAAM;UAEhB,+FAAU;YACN,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,KAAK;UAErB,gGAAW;YACP,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,IAAI;YAEhB,iHAAiB;cAxmBrC,OAAO,EAAE,iBAAiB;cAC1B,OAAO,EAAE,YAAY;cACrB,cAAc,EAAE,MAAM;cACtB,IAAI,EAAE,CAAC;cACP,QAAQ,EAAE,MAAM;cAumBQ,mIAAkB;gBACd,QAAQ,EAAE,QAAQ;gBAClB,GAAG,EAAE,IAAI;YAIjB,sGAAM;cACF,MAAM,EAAE,OAAO;cACf,OAAO,EAAE,iBAAiB;cAC1B,OAAO,EAAE,YAAY;cACrB,cAAc,EAAE,MAAM;cACtB,UAAU,EAAE,KAAK;cACjB,IAAI,EAAE,CAAC;cACP,QAAQ,EAAE,MAAM;cAEhB,0GAAI;gBACA,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,YAAY;gBACrB,cAAc,EAAE,MAAM;gBACtB,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,MAAM;QAShC,iFAAW;UACP,MAAM,EAAE,IAAI;UACZ,WAAW,EAAE,IAAI;UAEjB,gGAAe;YACX,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,IAAI;UAErB,4FAAW;YACP,OAAO,EAAE,QAAQ;UAErB,2FAAU;YACN,WAAW,EAAC,IAAI;QAOxB,+EAAS;UACL,IAAI,EAAE,+CAA+C;UACrD,aAAa,EAlqBZ,iBAAiB;UAmqBlB,aAAa,EAAE,IAAI;UAEnB,2FAAY;YACR,UAAU,EAAE,iBAAiB;YAC7B,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;YAEV,uGAAY;cACR,QAAQ,EAAE,QAAQ;cAClB,MAAM,EAAE,YAAY;cACpB,OAAO,EAAE,MAAM;cACf,KAAK,EAAE,IAAI;cACX,WAAW,EAAE,IAAI;cACjB,UAAU,EAAE,MAAM;cAClB,KAAK,EAAE,OAAO;cACd,MAAM,EAAE,OAAO;YAEnB,gHAAqB;cACjB,gBAAgB,EAAE,IAAI;cACtB,MAAM,EAtrBb,iBAAiB;cAurBV,aAAa,EAAE,cAAc;cAC7B,KAAK,EAAE,OAAO;cACd,MAAM,EAAE,OAAO;cACf,sBAAsB,EAAE,GAAG;cAC3B,uBAAuB,EAAE,GAAG;YAGhC,0GAAe;cACX,gBAAgB,EAAE,IAAI;cACtB,KAAK,EAAE,IAAI;IAU/B,gDAAmB;MACf,QAAQ,EAAE,QAAQ;MAClB,GAAG,EAAE,CAAC;MACN,IAAI,EAAE,GAAG;MACT,OAAO,EAAE,CAAC;MACV,UAAU,EAAE,MAAM;MAElB,2EAA2B;QACvB,UAAU,EAAE,6CAA6C;QACzD,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;EAM9B,4BAAkB;IACd,IAAI,EAAE,+CAA+C;IACrD,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,YAAY;IACrB,gBAAgB,EAAE,IAAI;IACtB,MAAM,EAAE,IAAI;IAEZ,2CAAe;MACX,MAAM,EAAE,GAAG;IAGf,0CAAc;MACV,MAAM,EAAE,gBAAgB;EAIhC,4BAAkB;IACd,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,OAAO;EAGnB,2BAAiB;IACb,mBAAmB,EAAE,OAAO;IAC5B,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,iBAAiB;IAC1B,OAAO,EAAE,YAAY;IACrB,cAAc,EAAE,MAAM;IACtB,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,MAAM;EAGpB,qBAAW;IACP,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,iBAAiB;IACzB,gBAAgB,EAAE,OAAO;IACzB,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,wDAAwD;IAEpE,2BAAQ;MACJ,MAAM,EA7wBG,iBAAiB;MA8wB1B,gBAAgB,EAAE,OAAO;EAIjC,yBAAe;IACX,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,GAAG;IACX,UAAU,EAAE,OAAO;IACnB,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,YAAY;IACrB,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,OAAO;IACf,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,YAAY;IAExB,+BAAQ;MACJ,MAAM,EAAE,iBAAiB;MACzB,UAAU,EAAE,IAAI;MAChB,UAAU,EAAE,IAAI;MAChB,OAAO,EAAE,EAAE",
+"sources": ["common.scss"],
+"names": [],
+"file": "common.css"
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/common/common.scss b/addons/nkeditor/assets/themes/common/common.scss
new file mode 100644
index 0000000..5e8549b
--- /dev/null
+++ b/addons/nkeditor/assets/themes/common/common.scss
@@ -0,0 +1,830 @@
+$inputBorderColor : #cccccc;
+$inputFocusBorderColor : #66afe9;
+$inputHeight : 30px;
+$editorBorderStyle : 1px solid #e1e1e1;
+$dialogBorderStyle : 1px solid #cccccc;
+$menuBgColor : #f5f5f5;
+
+@mixin ke-inline-block {
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline;
+}
+//工具栏图标样式
+@mixin ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+}
+//阴影
+@mixin ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+}
+
+/**
+公共样式
+*/
+//清除浮动
+.ke-clearfix {
+    zoom: 1;
+    clear: both;
+}
+.ke-clearfix:after {
+    content: ".";
+    display: block;
+    clear: both;
+    font-size: 0;
+    height: 0;
+    line-height: 0;
+    visibility: hidden;
+}
+// 过渡动画
+.ke-animated {
+    animation: zoomIn;
+    animation-duration: 0.3s;
+    animation-fill-mode: both;
+}
+@keyframes zoomIn {
+    from {
+        opacity: 0;
+        transform: scale3d(0.3, 0.3, 0.3);
+    }
+    50% {
+        opacity: 1;
+    }
+}
+
+//遮罩层
+.ke-dialog-mask {
+    background-color: #FFF;
+    filter: alpha(opacity=50);
+    opacity: 0.5;
+}
+.ke-dialog-lock {
+    background-color: #FFF;
+    filter: alpha(opacity=50);
+    opacity: 0.5;
+    z-index: 811213;
+    left: 0;
+    top: 0;
+    position: absolute;
+}
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+
+    display: block;
+    //border: $editorBorderStyle;
+    background-color: #FFF;
+    overflow: hidden;
+    margin: 0;
+    padding: 0;
+    box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 1px 1px rgba(0,0,0,0.16);
+
+    /**
+    通用样式
+     */
+    .ke-shadow {
+        @include ke-shadow;
+        background-color: #F0F0EE;
+    }
+
+    .ke-menu a,
+    .ke-menu a:hover,
+    .ke-dialog a,
+    .ke-dialog a:hover {
+        color: #337FE5;
+        text-decoration: none;
+    }
+
+    /**
+     toolbar 样式
+     */
+    .ke-toolbar {
+        //border-bottom: $editorBorderStyle;
+        text-align: left;
+        overflow: hidden;
+        zoom: 1;
+        padding: 0px 5px;
+
+        .ke-outline {
+            //border: 1px solid #f5f5f5;
+            padding: 10px 5px;
+            font-size: 0;
+            line-height: 0;
+            cursor: pointer;
+            display: block;
+            float: left;
+
+            /**
+             * 按钮通用样式
+             */
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+            }
+
+        }
+
+        .ke-on {
+            background: #ebebeb;
+        }
+        .ke-selected {
+            background-color: #ebebeb;
+        }
+        .ke-disabled {
+            cursor: default;
+        }
+        .ke-separator {
+            height: 16px;
+            margin: 2px 3px;
+            border-left: 1px solid #A0A0A0;
+            border-right: 1px solid #FFFFFF;
+            border-top: 0;
+            border-bottom: 0;
+            width: 0;
+            font-size: 0;
+            line-height: 0;
+            overflow: hidden;
+            display: block;
+            float: left;
+        }
+        .ke-hr {
+            clear: both;
+            height: 1px;
+            width: calc(100% - (2 * 2px));
+            background: #ebebeb;
+        }
+    }
+    //end ke-toolbar
+
+    /**
+     ke-edit
+     */
+    .ke-edit {
+        padding: 0;
+
+        .ke-edit-iframe,
+        .ke-edit-textarea {
+            border: 0;
+            margin: 0;
+            padding: 0;
+            overflow: auto;
+        }
+        .ke-edit-textarea {
+            font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+            color: #000;
+            overflow: auto;
+            resize: none;
+
+            &:focus {
+                outline: none;
+            }
+        }
+    }
+    //end ke-edit
+
+    /**
+     statusbar start
+     */
+    .ke-statusbar {
+        position: relative;
+        background-color: #f5f5f5;
+        border-top: $editorBorderStyle;
+        font-size: 0;
+        line-height: 0;
+        *height: 12px;
+        overflow: hidden;
+        text-align: center;
+        cursor: s-resize;
+        display: none;
+
+        .ke-statusbar-center-icon {
+            background-position: -0px -754px;
+            width: 15px;
+            height: 11px;
+        }
+
+        .ke-statusbar-right-icon {
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            cursor: se-resize;
+            width: 11px;
+            height: 11px;
+        }
+    }
+    //end ke-statusbar
+}
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+    border: $dialogBorderStyle;
+    background-color: $menuBgColor;
+    color: #222222;
+    padding: 2px;
+    font-family: "sans serif", tahoma, verdana, helvetica;
+    font-size: 12px;
+    text-align: left;
+    overflow: hidden;
+
+    .ke-menu-item {
+        border: 1px solid #F1F1F1;
+        background-color: #F1F1F1;
+        color: #222222;
+        height: 24px;
+        overflow: hidden;
+        cursor: pointer;
+
+        .ke-inline-block {
+            @include ke-inline-block;
+
+            .ke-inline-block {
+                @include ke-inline-block;
+            }
+        }
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+
+        }
+
+        .ke-menu-item-center {
+            width: 0;
+            height: 24px;
+            border-left: 1px solid #E3E3E3;
+            border-right: 1px solid #FFFFFF;
+            border-top: 0;
+            border-bottom: 0;
+        }
+
+        .ke-menu-item-center-on {
+            border-left: 1px solid #E9EFF6;
+            border-right: 1px solid #E9EFF6;
+        }
+
+        .ke-menu-item-right {
+            border: 0;
+            padding: 0 0 0 5px;
+            line-height: 24px;
+            text-align: left;
+            overflow: hidden;
+        }
+
+        .ke-menu-separator {
+            margin: 2px 0;
+            height: 0;
+            overflow: hidden;
+            border-top: $editorBorderStyle;
+            border-bottom: 1px solid #FFFFFF;
+            border-left: 0;
+            border-right: 0;
+        }
+    }
+
+    .ke-menu-item-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6;
+    }
+
+    /**
+    表情插件
+     */
+    .ke-plugin-emoticons {
+        position: relative;
+
+        .ke-preview {
+            position: absolute;
+            text-align: center;
+            margin: 2px;
+            padding: 10px;
+            top: 0;
+            border: 1px solid #A0A0A0;
+            background-color: #FFFFFF;
+            display: none;
+
+            .ke-preview-img {
+                border: 0;
+                margin: 0;
+                padding: 0;
+            }
+        } //end ke-preview
+
+        .ke-table {
+            border: 0;
+            margin: 0;
+            padding: 0;
+            border-collapse: separate;
+
+            .ke-cell {
+                margin: 0;
+                padding: 1px;
+                border: 1px solid #f5f5f5;
+                cursor: pointer;
+
+                .ke-img {
+                    display: block;
+                    background-repeat: no-repeat;
+                    overflow: hidden;
+                    margin: 2px;
+                    width: 24px;
+                    height: 24px;
+                    margin: 0;
+                    padding: 0;
+                    border: 0;
+                }
+            }
+            .ke-on {
+                border: 1px solid #5690D2;
+                background-color: #E9EFF6;
+            }
+        } //end ke-table
+
+        .ke-page {
+            text-align: right;
+            margin: 5px;
+            padding: 0;
+            border: 0;
+            font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+            color: #333;
+            text-decoration: none;
+        }
+    }
+
+}
+//menu end
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+    border: 1px solid #A0A0A0;
+    background-color: #F1F1F1;
+    color: #222222;
+    padding: 2px;
+
+    .ke-colorpicker-table {
+        border: 0;
+        margin: 0;
+        padding: 0;
+        border-collapse: separate;
+
+        .ke-colorpicker-cell {
+            font-size: 0;
+            line-height: 0;
+            border: 1px solid #F0F0EE;
+            cursor: pointer;
+            margin: 3px;
+            padding: 0;
+
+            .ke-colorpicker-cell-color {
+                width: 14px;
+                height: 14px;
+                margin: 3px;
+                padding: 0;
+                border: 0;
+            }
+        }
+        .ke-colorpicker-cell-top {
+            font-family: "sans serif", tahoma, verdana, helvetica;
+            font-size: 12px;
+            line-height: 24px;
+            border: 1px solid #F1F1F1;
+            cursor: pointer;
+            margin: 0;
+            padding: 0;
+            text-align: center;
+        }
+        .ke-colorpicker-cell-on {
+            border: 1px solid #5690D2;
+        }
+        .ke-colorpicker-cell-selected {
+            border: 1px solid #2446AB;
+        }
+
+    }
+} //colorpicker end
+
+/**
+ dialog
+ */
+.ke-dialog {
+    margin: 0;
+    padding: 0;
+    border: $dialogBorderStyle;
+    zoom: 1;
+    @include ke-shadow;
+    border-radius: 5px;
+    -moz-border-radius: 5px;
+    -webkit-border-radius: 5px;
+    overflow: hidden;
+
+    // start ke-dialog-header
+    .ke-dialog-header {
+        border: 0;
+        margin: 0;
+        font-weight: bold;
+        font-size: 14px;
+        height: 30px;
+        line-height: 30px;
+        padding: 0px 10px;
+        text-align: left;
+        color: #222;
+        cursor: move;
+        border-top-left-radius: 6px;
+        border-top-right-radius: 6px;
+        border-bottom: 1px solid #c6c6c6;
+        background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+        position: relative;
+        cursor: move;
+
+        .ke-dialog-icon-close {
+            height: 20px;
+            width: 20px;
+            cursor: pointer;
+            background: url("../common/icons-all.gif") 0 -59px;
+            position: absolute;
+            right: 5px;
+            top: 4px;
+
+            &:hover {
+                background-position: 0px -89px;
+            }
+        }
+
+    } //end ke-dialog-header
+
+    //start ke-content
+    .ke-dialog-content {
+
+        background-color: #FFF;
+        width: 100%;
+        height: 100%;
+        color: #333;
+        outline: 0;
+        zoom: 1;
+
+        // ke-dialog-body start
+        .ke-dialog-body {
+            font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+            text-align: left;
+            overflow: hidden;
+            width: 100%;
+
+            .ke-textarea {
+                display: block;
+                width: 408px;
+                height: 260px;
+                font-family: "sans serif", tahoma, verdana, helvetica;
+                font-size: 12px;
+                border: 1px solid $inputBorderColor;
+
+                &:focus {
+                    border-color: $inputFocusBorderColor;
+                    outline: none;
+                }
+            }
+
+            .ke-select {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline;
+                width: auto;
+                border: 1px solid $inputBorderColor;
+                height: $inputHeight;
+            }
+            .ke-form {
+                margin: 0;
+                padding: 0;
+            }
+
+            .ke-input-number {
+                width: 50px;
+            }
+
+            .ke-input-checkbox {
+                position: relative;
+                top:6px;
+            }
+
+            textarea {
+                display: block;
+                overflow: auto;
+                padding: 0;
+                resize: none;
+
+                &:focus {
+                    outline: none;
+                }
+            }
+
+            .ke-input-text {
+                display: inline-block !important;
+                max-width: 400px;
+                height: $inputHeight;
+                line-height: $inputHeight;
+                border:1px solid $inputBorderColor;
+                font-size: 14px;
+                margin: 0;
+                outline: 0;
+                padding: 0px 10px;
+                *display: inline;
+
+                &:focus {
+                    border-color: $inputFocusBorderColor;
+                }
+            }
+
+            .ke-input-color {
+                border: $editorBorderStyle;
+                background-color: #FFFFFF;
+                font-size: 12px;
+                width: 60px;
+                height: 30px;
+                line-height: 30px;
+                padding-left: 5px;
+                overflow: hidden;
+                cursor: pointer;
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline;
+            }
+
+            .ke-upload-area {
+                position: relative;
+                overflow: hidden;
+                margin: 0;
+                padding: 0;
+                top:-1px;
+                position: relative;
+                *height: 25px;
+
+                .ke-upload-file {
+                    position: absolute;
+                    font-size: 60px;
+                    top: 0;
+                    right: 0;
+                    padding: 0;
+                    margin: 0;
+                    z-index: 811212;
+                    border: 0 none;
+                    opacity: 0;
+                    cursor: pointer;
+                    width: 62px;
+                    height: 30px;
+                    filter: alpha(opacity=0);
+
+                }
+
+                .ke-button-common {
+                    top: -1px;
+                }
+                .ke-button {
+                    padding: 8px 15px;
+                }
+            }
+
+            .ke-dialog-content-inner {
+                padding: 10px 20px 0px 20px;
+
+                .ke-dialog-row {
+                    border:1px solid #FFFFFF;
+                    margin-bottom: 10px;
+                    overflow: hidden;
+
+                    .row-left {
+                        float: left;
+                        height: 30px;
+                        line-height: 30px;
+                        width: 60px;
+                        text-align: right;
+                    }
+                    .row-right {
+                        float: left;
+                        text-align: left;
+
+                        .ke-inline-block {
+                            @include ke-inline-block;
+
+                            .ke-upload-button {
+                                position: relative;
+                                top: -1px;
+                            }
+                        }
+
+                        label {
+                            cursor: pointer;
+                            display: -moz-inline-stack;
+                            display: inline-block;
+                            vertical-align: middle;
+                            text-align: right;
+                            zoom: 1;
+                            *display: inline;
+
+                            img {
+                                display: -moz-inline-stack;
+                                display: inline-block;
+                                vertical-align: middle;
+                                zoom: 1;
+                                *display: inline;
+                            }
+                        }
+                    }
+
+
+                } //end ke-dialog-row
+
+                //百度地图样式
+                .ke-header {
+                    height: 30px;
+                    line-height: 30px;
+
+                    .ke-input-text {
+                        height: 22px;
+                        line-height: 22px;
+                    }
+                    .ke-button {
+                        padding: 3px 10px;
+                    }
+                    .checkbox {
+                        margin-left:10px;
+                    }
+                }
+
+                /**
+                 tabs
+                 */
+                .ke-tabs {
+                    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+                    border-bottom: $editorBorderStyle;
+                    margin-bottom: 20px;
+
+                    .ke-tabs-ul {
+                        list-style: none outside none;
+                        margin: 0;
+                        padding: 0;
+
+                        .ke-tabs-li {
+                            position: relative;
+                            margin: 0 2px -1px 0;
+                            padding: 0 20px;
+                            float: left;
+                            line-height: 25px;
+                            text-align: center;
+                            color: #337ab7;
+                            cursor: pointer;
+                        }
+                        .ke-tabs-li-selected {
+                            background-color: #FFF;
+                            border: $editorBorderStyle;
+                            border-bottom: 1px solid #FFF;
+                            color: #555555;
+                            cursor: default;
+                            border-top-left-radius: 3px;
+                            border-top-right-radius: 3px;
+                        }
+
+                        .ke-tabs-li-on {
+                            background-color: #FFF;
+                            color: #000;
+                        }
+                    } //end ul
+                } //end tabs
+
+            } //end ke-dialog-content-inner
+
+
+        } // end ke-dialog-body
+
+        .ke-dialog-loading {
+            position: absolute;
+            top: 0;
+            left: 1px;
+            z-index: 1;
+            text-align: center;
+
+            .ke-dialog-loading-content {
+                background: url("../common/loading.gif") no-repeat center;
+                color: #666;
+                font-size: 14px;
+                font-weight: bold;
+                height: 31px;
+                line-height: 31px;
+                padding-left: 36px;
+            }
+        } //end ke-dialog-loading
+
+    } //end ke-content
+
+    .ke-dialog-footer {
+        font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+        text-align: right;
+        padding: 0 15px 5px 0;
+        background-color: #FFF;
+        height: 40px;
+
+        .ke-dialog-yes {
+            margin: 5px;
+        }
+
+        .ke-dialog-no {
+            margin: 5px 10px 5px 5px;
+        }
+    } // ke-dialog-footer
+
+    .ke-button-common {
+        display: inline-block;
+        text-align: center;
+        background: none;
+        border: none;
+        padding: 0;
+        cursor: pointer;
+    }
+
+    .ke-button-outer {
+        background-position: 0 -25px;
+        padding: 0;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+    }
+
+    .ke-button {
+        color: #333;
+        font-size: 12px;
+        border: 1px solid #e6e6e6;
+        background-color: #e6e6e6;
+        padding: 7px 10px;
+        margin-top: -4px;
+        color: #444;
+        text-decoration: none;
+        transition: background-color .3s ease-out, border-color .3s ease-out;
+
+        &:hover {
+            border: $editorBorderStyle;
+            background-color: #e1e1e1;
+        }
+    }
+
+    .ke-dialog-btn {
+        font-size: 12px;
+        margin: 5px;
+        background: #2e8ded;
+        color: #fff !important;
+        padding: 8px 12px;
+        display: inline-block;
+        border-radius: 2px;
+        cursor: pointer;
+        text-decoration: none;
+        transition: .3s ease-out;
+
+        &:hover {
+            filter: alpha(opacity=80);
+            box-shadow: none;
+            box-shadow: none;
+            opacity: .8;
+        }
+    }
+
+
+} //dialog end
+
+//.ke-dialog-preview {
+//    margin: 5px;
+//}
+
+
+//.ke-plugin-plainpaste-textarea,
+//.ke-plugin-wordpaste-iframe {
+//    display: block;
+//    width: 408px;
+//    height: 260px;
+//    font-family: "sans serif", tahoma, verdana, helvetica;
+//    font-size: 12px;
+//    border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+//    border-style: solid;
+//    border-width: 1px;
+//}
+
+
diff --git a/addons/nkeditor/assets/themes/common/dialog-title-bg.png b/addons/nkeditor/assets/themes/common/dialog-title-bg.png
new file mode 100644
index 0000000..f744f26
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/dialog-title-bg.png differ
diff --git a/addons/nkeditor/assets/themes/common/flash.gif b/addons/nkeditor/assets/themes/common/flash.gif
new file mode 100644
index 0000000..2cb12b2
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/flash.gif differ
diff --git a/addons/nkeditor/assets/themes/common/flash.png b/addons/nkeditor/assets/themes/common/flash.png
new file mode 100644
index 0000000..cc3be67
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/flash.png differ
diff --git a/addons/nkeditor/assets/themes/common/flash.svg b/addons/nkeditor/assets/themes/common/flash.svg
new file mode 100644
index 0000000..31750f2
--- /dev/null
+++ b/addons/nkeditor/assets/themes/common/flash.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1506319500431" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3560" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M512 56.888889C261.688889 56.888889 56.888889 261.688889 56.888889 512s204.8 455.111111 455.111111 455.111111 455.111111-204.8 455.111111-455.111111-204.8-455.111111-455.111111-455.111111z m227.555556 324.266667c-79.644444-5.688889-125.155556 79.644444-125.155556 79.644444l91.022222 5.688889V568.888889h-130.844444C506.311111 819.2 341.333333 773.688889 341.333333 773.688889v-85.333333s96.711111 0 147.911111-176.355556C563.2 233.244444 739.555556 290.133333 739.555556 290.133333v91.022223z" p-id="3561"></path></svg>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/common/icons-all.gif b/addons/nkeditor/assets/themes/common/icons-all.gif
new file mode 100644
index 0000000..21915e5
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/icons-all.gif differ
diff --git a/addons/nkeditor/assets/themes/common/loading.gif b/addons/nkeditor/assets/themes/common/loading.gif
new file mode 100644
index 0000000..c69e937
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/loading.gif differ
diff --git a/addons/nkeditor/assets/themes/common/media.gif b/addons/nkeditor/assets/themes/common/media.gif
new file mode 100644
index 0000000..e1c0e30
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/media.gif differ
diff --git a/addons/nkeditor/assets/themes/common/play.png b/addons/nkeditor/assets/themes/common/play.png
new file mode 100644
index 0000000..7899c5a
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/play.png differ
diff --git a/addons/nkeditor/assets/themes/common/play.svg b/addons/nkeditor/assets/themes/common/play.svg
new file mode 100644
index 0000000..8d5cd9a
--- /dev/null
+++ b/addons/nkeditor/assets/themes/common/play.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1506318981937" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1622" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M512 1024C229.2352 1024 0 794.7648 0 512S229.2352 0 512 0s512 229.2352 512 512-229.2352 512-512 512z m-85.248-257.4976l307.0336-230.2848c17.024-12.7616 17.024-33.4336 0-46.1952L426.752 259.7376c-17.024-12.7616-30.7968-5.888-30.7968 15.3472v476.0704c0 21.2864 13.7984 28.1088 30.7968 15.36z" p-id="1623"></path></svg>
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/common/rm.gif b/addons/nkeditor/assets/themes/common/rm.gif
new file mode 100644
index 0000000..d013d55
Binary files /dev/null and b/addons/nkeditor/assets/themes/common/rm.gif differ
diff --git a/addons/nkeditor/assets/themes/default/editor.css b/addons/nkeditor/assets/themes/default/editor.css
new file mode 100644
index 0000000..8518512
--- /dev/null
+++ b/addons/nkeditor/assets/themes/default/editor.css
@@ -0,0 +1,1398 @@
+/* common */
+.ke-animated {
+	animation: zoomIn;
+	animation-duration: 0.3s;
+	animation-fill-mode: both; }
+
+@keyframes zoomIn {
+	from {
+		opacity: 0;
+		transform: scale3d(0.3, 0.3, 0.3); }
+	50% {
+		opacity: 1; } }
+
+.ke-inline-block {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-clearfix {
+	zoom: 1;
+}
+
+.ke-clearfix:after {
+	content: ".";
+	display: block;
+	clear: both;
+	font-size: 0;
+	height: 0;
+	line-height: 0;
+	visibility: hidden;
+}
+
+.ke-shadow {
+	box-shadow: 1px 1px 3px #A0A0A0;
+	-moz-box-shadow: 1px 1px 3px #A0A0A0;
+	-webkit-box-shadow: 1px 1px 3px #A0A0A0;
+	filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+	background-color: #F0F0EE;
+}
+
+.ke-menu a,
+.ke-menu a:hover,
+.ke-dialog a,
+.ke-dialog a:hover {
+	color: #337FE5;
+	text-decoration: none;
+}
+
+/* icons */
+.ke-icon-source {
+	background-position: 0px 0px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-preview {
+	background-position: 0px -16px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-print {
+	background-position: 0px -32px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-undo {
+	background-position: 0px -48px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-redo {
+	background-position: 0px -64px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-cut {
+	background-position: 0px -80px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-copy {
+	background-position: 0px -96px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-paste {
+	background-position: 0px -112px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-selectall {
+	background-position: 0px -128px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-justifyleft {
+	background-position: 0px -144px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-justifycenter {
+	background-position: 0px -160px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-justifyright {
+	background-position: 0px -176px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-justifyfull {
+	background-position: 0px -192px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-insertorderedlist {
+	background-position: 0px -208px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-insertunorderedlist {
+	background-position: 0px -224px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-indent {
+	background-position: 0px -240px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-outdent {
+	background-position: 0px -256px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-subscript {
+	background-position: 0px -272px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-superscript {
+	background-position: 0px -288px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-date {
+	background-position: 0px -304px;
+	width: 25px;
+	height: 16px;
+}
+
+.ke-icon-time {
+	background-position: 0px -320px;
+	width: 25px;
+	height: 16px;
+}
+
+.ke-icon-formatblock {
+	background-position: 0px -336px;
+	width: 25px;
+	height: 16px;
+}
+
+.ke-icon-fontname {
+	background-position: 0px -352px;
+	width: 21px;
+	height: 16px;
+}
+
+.ke-icon-fontsize {
+	background-position: 0px -368px;
+	width: 23px;
+	height: 16px;
+}
+
+.ke-icon-forecolor {
+	background-position: 0px -384px;
+	width: 20px;
+	height: 16px;
+}
+
+.ke-icon-hilitecolor {
+	background-position: 0px -400px;
+	width: 23px;
+	height: 16px;
+}
+
+.ke-icon-bold {
+	background-position: 0px -416px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-italic {
+	background-position: 0px -432px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-underline {
+	background-position: 0px -448px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-strikethrough {
+	background-position: 0px -464px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-removeformat {
+	background-position: 0px -480px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-image {
+	background-position: 0px -496px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-flash {
+	background-position: 0px -512px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-media {
+	background-position: 0px -528px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-div {
+	background-position: 0px -544px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-formula {
+	background-position: 0px -576px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-hr {
+	background-position: 0px -592px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-emoticons {
+	background-position: 0px -608px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-link {
+	background-position: 0px -624px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-unlink {
+	background-position: 0px -640px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-fullscreen {
+	background-position: 0px -656px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-about {
+	background-position: 0px -672px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-plainpaste {
+	background-position: 0px -704px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-wordpaste {
+	background-position: 0px -720px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-table {
+	background-position: 0px -784px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablemenu {
+	background-position: 0px -768px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tableinsert {
+	background-position: 0px -784px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tabledelete {
+	background-position: 0px -800px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecolinsertleft {
+	background-position: 0px -816px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecolinsertright {
+	background-position: 0px -832px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowinsertabove {
+	background-position: 0px -848px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowinsertbelow {
+	background-position: 0px -864px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecoldelete {
+	background-position: 0px -880px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowdelete {
+	background-position: 0px -896px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecellprop {
+	background-position: 0px -912px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tableprop {
+	background-position: 0px -928px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-checked {
+	background-position: 0px -944px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-code {
+	background-position: 0px -960px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-map {
+	background-position: 0px -976px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-baidumap {
+	background-position: 0px -976px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-lineheight {
+	background-position: 0px -992px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-clearhtml {
+	background-position: 0px -1008px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-pagebreak {
+	background-position: 0px -1024px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-insertfile {
+	background-position: 0px -1040px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-quickformat {
+	background-position: 0px -1056px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-template {
+	background-position: 0px -1072px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecellsplit {
+	background-position: 0px -1088px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowmerge {
+	background-position: 0px -1104px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowsplit {
+	background-position: 0px -1120px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecolmerge {
+	background-position: 0px -1136px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecolsplit {
+	background-position: 0px -1152px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-anchor {
+	background-position: 0px -1168px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-search {
+	background-position: 0px -1184px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-new {
+	background-position: 0px -1200px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-specialchar {
+	background-position: 0px -1216px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-multiimage {
+	background-position: 0px -1232px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-graft {
+	background: url("images/scrawl.png") !important;
+	width: 16px;
+	height: 16px;
+}
+
+/* container */
+.ke-container {
+	display: block;
+	border: 1px solid #CCCCCC;
+	background-color: #FFF;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+}
+
+/* toolbar */
+.ke-toolbar {
+	border-bottom: 1px solid #CCC;
+	background-color: #FFFFFF;
+	padding: 2px 5px;
+	text-align: left;
+	overflow: hidden;
+	zoom: 1;
+}
+
+.ke-toolbar-icon {
+	background-repeat: no-repeat;
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	display: block;
+}
+
+.ke-toolbar-icon-url {
+	background-image: url(images/default.png);
+}
+
+.ke-toolbar .ke-outline {
+	border: 1px solid #F0F0EE;
+	margin: 1px;
+	padding: 1px 2px;
+	font-size: 0;
+	line-height: 0;
+	cursor: pointer;
+	display: block;
+	float: left;
+}
+
+.ke-toolbar .ke-on {
+	border: 1px solid #5690D2;
+}
+
+.ke-toolbar .ke-selected {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+.ke-toolbar .ke-disabled {
+	cursor: default;
+}
+
+.ke-toolbar .ke-separator {
+	height: 16px;
+	margin: 2px 3px;
+	border-left: 1px solid #A0A0A0;
+	border-right: 1px solid #FFFFFF;
+	border-top: 0;
+	border-bottom: 0;
+	width: 0;
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	display: block;
+	float: left;
+}
+
+.ke-toolbar .ke-hr {
+	overflow: hidden;
+	height: 1px;
+	clear: both;
+}
+
+/* edit */
+.ke-edit {
+	padding: 0;
+}
+
+.ke-edit-iframe,
+.ke-edit-textarea {
+	border: 0;
+	margin: 0;
+	padding: 0;
+	overflow: auto;
+}
+
+.ke-edit-textarea {
+	font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+	color: #000;
+	overflow: auto;
+	resize: none;
+}
+
+.ke-edit-textarea:focus {
+	outline: none;
+}
+
+/* statusbar */
+.ke-statusbar {
+	position: relative;
+	background-color: #F0F0EE;
+	border-top: 1px solid #CCCCCC;
+	font-size: 0;
+	line-height: 0;
+	*height: 12px;
+	overflow: hidden;
+	text-align: center;
+	cursor: s-resize;
+}
+
+.ke-statusbar-center-icon {
+	background-position: -0px -754px;
+	width: 15px;
+	height: 11px;
+	background-image: url(images/default.png);
+}
+
+.ke-statusbar-right-icon {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	cursor: se-resize;
+	background-position: -5px -741px;
+	width: 11px;
+	height: 11px;
+	background-image: url(images/default.png);
+}
+
+/* menu */
+.ke-menu {
+	border: 1px solid #A0A0A0;
+	background-color: #F1F1F1;
+	color: #222222;
+	padding: 2px;
+	font-family: "sans serif", tahoma, verdana, helvetica;
+	font-size: 12px;
+	text-align: left;
+	overflow: hidden;
+}
+
+.ke-menu-item {
+	border: 1px solid #F1F1F1;
+	background-color: #F1F1F1;
+	color: #222222;
+	height: 24px;
+	overflow: hidden;
+	cursor: pointer;
+}
+
+.ke-menu-item-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+.ke-menu-item-left {
+	width: 27px;
+	text-align: center;
+	overflow: hidden;
+}
+
+.ke-menu-item-center {
+	width: 0;
+	height: 24px;
+	border-left: 1px solid #E3E3E3;
+	border-right: 1px solid #FFFFFF;
+	border-top: 0;
+	border-bottom: 0;
+}
+
+.ke-menu-item-center-on {
+	border-left: 1px solid #E9EFF6;
+	border-right: 1px solid #E9EFF6;
+}
+
+.ke-menu-item-right {
+	border: 0;
+	padding: 0 0 0 5px;
+	line-height: 24px;
+	text-align: left;
+	overflow: hidden;
+}
+
+.ke-menu-separator {
+	margin: 2px 0;
+	height: 0;
+	overflow: hidden;
+	border-top: 1px solid #CCCCCC;
+	border-bottom: 1px solid #FFFFFF;
+	border-left: 0;
+	border-right: 0;
+}
+
+/* colorpicker */
+.ke-colorpicker {
+	border: 1px solid #A0A0A0;
+	background-color: #F1F1F1;
+	color: #222222;
+	padding: 2px;
+}
+
+.ke-colorpicker-table {
+	border: 0;
+	margin: 0;
+	padding: 0;
+	border-collapse: separate;
+}
+
+.ke-colorpicker-cell {
+	font-size: 0;
+	line-height: 0;
+	border: 1px solid #F0F0EE;
+	cursor: pointer;
+	margin: 3px;
+	padding: 0;
+}
+
+.ke-colorpicker-cell-top {
+	font-family: "sans serif", tahoma, verdana, helvetica;
+	font-size: 12px;
+	line-height: 24px;
+	border: 1px solid #F0F0EE;
+	cursor: pointer;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+}
+
+.ke-colorpicker-cell-on {
+	border: 1px solid #5690D2;
+}
+
+.ke-colorpicker-cell-selected {
+	border: 1px solid #2446AB;
+}
+
+.ke-colorpicker-cell-color {
+	width: 14px;
+	height: 14px;
+	margin: 3px;
+	padding: 0;
+	border: 0;
+}
+
+/* dialog */
+.ke-dialog {
+	position: absolute;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-dialog .ke-header {
+	width: 100%;
+	margin-bottom: 10px;
+}
+
+.ke-dialog .ke-header .ke-left {
+	float: left;
+}
+
+.ke-dialog .ke-header .ke-right {
+	float: right;
+}
+
+.ke-dialog .ke-header label {
+	margin-right: 0;
+	cursor: pointer;
+	font-weight: normal;
+	display: inline;
+	vertical-align: top;
+}
+
+.ke-dialog-content {
+	background-color: #FFF;
+	width: 100%;
+	height: 100%;
+	color: #333;
+	outline: 0;
+}
+
+.ke-dialog-header {
+	border: 0;
+	margin: 0;
+	font-weight: bold;
+	font-size: 14px;
+	background: #F8F8F8;
+	border-bottom: 1px solid #eeeeee;
+	height: 30px;
+	line-height: 30px;
+	padding: 0px 10px;
+	text-align: left;
+	color: #222;
+	cursor: move;
+	border-top-left-radius: 6px;
+	border-top-right-radius: 6px;
+
+}
+
+.ke-dialog-icon-close {
+	display: block;
+	background: url(images/default.png) no-repeat scroll 0px -688px;
+	width: 16px;
+	height: 16px;
+	position: absolute;
+	right: 6px;
+	top: 8px;
+	cursor: pointer;
+}
+
+.ke-dialog-body {
+	font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+	text-align: left;
+	overflow: hidden;
+	width: 100%;
+}
+
+.ke-dialog-body textarea {
+	display: block;
+	overflow: auto;
+	padding: 0;
+	resize: none;
+}
+
+.ke-dialog-body textarea:focus,
+.ke-dialog-body input:focus,
+.ke-dialog-body select:focus {
+	outline: none;
+}
+
+.ke-dialog-body label {
+	margin-right: 10px;
+	cursor: pointer;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	text-align: right;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-dialog-body img {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-dialog-body select {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+	width: auto;
+}
+
+.ke-dialog-body .ke-textarea {
+	display: block;
+	width: 408px;
+	height: 260px;
+	font-family: "sans serif", tahoma, verdana, helvetica;
+	font-size: 12px;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+}
+
+.ke-dialog-body .ke-form {
+	margin: 0;
+	padding: 0;
+}
+
+.ke-dialog-loading {
+	position: absolute;
+	top: 0;
+	left: 1px;
+	z-index: 1;
+	text-align: center;
+}
+
+.ke-dialog-loading-content {
+	background: url("../common/loading.gif") no-repeat;
+	color: #666;
+	font-size: 14px;
+	font-weight: bold;
+	height: 31px;
+	line-height: 31px;
+	padding-left: 36px;
+}
+
+.ke-dialog-row {
+	margin-bottom: 10px;
+}
+
+.ke-dialog-footer {
+	font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+	text-align: right;
+	padding: 0 15px 5px 0;
+	background-color: #FFF;
+	border-radius: 6px;
+	height: 45px;
+}
+
+.ke-dialog-preview,
+.ke-dialog-yes {
+	margin: 5px;
+}
+
+.ke-dialog-no {
+	margin: 5px 10px 5px 5px;
+}
+
+.ke-dialog-mask {
+	background-color: #FFF;
+	filter: alpha(opacity=50);
+	opacity: 0.5;
+}
+
+.ke-button-common {
+	display: inline-block;
+	text-align: center;
+	background: none;
+	border: none;
+	padding: 0;
+	cursor: pointer;
+}
+
+.ke-button-outer {
+	background-position: 0 -25px;
+	padding: 0;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-button {
+	color: #333;
+	font-size: 12px;
+	border: 1px solid #e6e6e6;
+	background-color: #e6e6e6;
+	padding: 5px 10px;
+	margin-top: -2px;
+	color: #444;
+	text-decoration: none;
+	transition: background-color .3s ease-out, border-color .3s ease-out;
+}
+
+.ke-button:hover {
+	border: 1px solid #d1d1d1;
+	background-color: #d1d1d1;
+}
+
+.ke-dialog-btn {
+	font-size: 12px;
+	margin: 5px;
+	background: #2e8ded;
+	color: #fff !important;
+	padding: 8px 12px;
+	display: inline-block;
+	border-radius: 2px;
+	cursor: pointer;
+	text-decoration: none;
+	transition: .3s ease-out;
+}
+
+.ke-dialog-btn:hover {
+	filter: alpha(opacity=80);
+	box-shadow: none;
+	box-shadow: none;
+	opacity: .8;
+}
+
+/* inputbox */
+.ke-input-text {
+	display: inline-block !important;
+	width: 400px;
+	border: 1px solid #cccccc;
+	height: 20px;
+	line-height: 18px;
+	font-size: 14px;
+	padding: 3px;
+	margin: 0;
+	outline: 0;
+	*display: inline;
+}
+
+.ke-input-text:focus {
+	border-color: #66afe9;
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+}
+
+.ke-input-number {
+	width: 50px;
+}
+
+.ke-input-color {
+	border: 1px solid #A0A0A0;
+	background-color: #FFFFFF;
+	font-size: 12px;
+	width: 60px;
+	height: 20px;
+	line-height: 20px;
+	padding-left: 5px;
+	overflow: hidden;
+	cursor: pointer;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-upload-button {
+	position: relative;
+	top: -1px;
+}
+
+.ke-upload-area {
+	position: relative;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+	*height: 25px;
+}
+
+.ke-upload-area .ke-upload-file {
+	position: absolute;
+	font-size: 60px;
+	top: 0;
+	right: 0;
+	padding: 0;
+	margin: 0;
+	z-index: 811212;
+	border: 0 none;
+	opacity: 0;
+	cursor: pointer;
+	width: 50px;
+	height: 30px;
+	filter: alpha(opacity=0);
+}
+
+.ke-upload-area .ke-button {
+	padding: 6px 15px;
+}
+
+/* tabs */
+.ke-tabs {
+	font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+	border-bottom: 1px solid #cccccc;
+	padding-left: 5px;
+	margin-bottom: 20px;
+}
+
+.ke-tabs-ul {
+	list-style-image: none;
+	list-style-position: outside;
+	list-style-type: none;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-tabs-li {
+	position: relative;
+
+	margin: 0 2px -1px 0;
+	padding: 0 20px;
+	float: left;
+	line-height: 25px;
+	text-align: center;
+	color: #337ab7;
+	cursor: pointer;
+}
+
+.ke-tabs-li-selected {
+	background-color: #FFF;
+	border: 1px solid #cccccc;
+	border-bottom: 1px solid #FFF;
+	color: #555555;
+	cursor: default;
+	border-top-left-radius: 3px;
+	border-top-right-radius: 3px;
+}
+
+.ke-tabs-li-on {
+	background-color: #FFF;
+	color: #000;
+}
+
+/* progressbar */
+.ke-progressbar {
+	position: relative;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-progressbar-bar {
+	border: 1px solid #6FA5DB;
+	width: 80px;
+	height: 5px;
+	margin: 10px 10px 0 10px;
+	padding: 0;
+}
+
+.ke-progressbar-bar-inner {
+	width: 0;
+	height: 5px;
+	background-color: #6FA5DB;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-progressbar-percent {
+	position: absolute;
+	top: 0;
+	left: 40%;
+	display: none;
+}
+
+/* swfupload */
+.ke-swfupload-top {
+	position: relative;
+	margin-bottom: 10px;
+	_width: 608px;
+}
+
+.ke-swfupload-button {
+	height: 23px;
+	line-height: 23px;
+}
+
+.ke-swfupload-desc {
+	padding: 0 10px;
+	height: 23px;
+	line-height: 23px;
+}
+
+.ke-swfupload-startupload {
+	position: absolute;
+	top: 0;
+	right: 0;
+}
+
+.ke-swfupload-body {
+	overflow: scroll;
+	background-color: #FFFFFF;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+	width: auto;
+	height: 370px;
+	padding: 5px;
+}
+
+.ke-swfupload-body .ke-item {
+	width: 100px;
+	margin: 5px;
+}
+
+.ke-swfupload-body .ke-photo {
+	position: relative;
+	border: 1px solid #DDDDDD;
+	background-color: #FFFFFF;
+	padding: 10px;
+}
+
+.ke-swfupload-body .ke-delete {
+	display: block;
+	background: url(images/default.png) no-repeat scroll 0px -688px;
+	width: 16px;
+	height: 16px;
+	position: absolute;
+	right: 0;
+	top: 0;
+	cursor: pointer;
+}
+
+.ke-swfupload-body .ke-status {
+	position: absolute;
+	left: 0;
+	bottom: 5px;
+	width: 100px;
+	height: 17px;
+}
+
+.ke-swfupload-body .ke-message {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height: 17px;
+}
+
+.ke-swfupload-body .ke-error {
+	color: red;
+}
+
+.ke-swfupload-body .ke-name {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height: 16px;
+}
+
+.ke-swfupload-body .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+/* emoticons */
+.ke-plugin-emoticons {
+	position: relative;
+}
+
+.ke-plugin-emoticons .ke-preview {
+	position: absolute;
+	text-align: center;
+	margin: 2px;
+	padding: 10px;
+	top: 0;
+	border: 1px solid #A0A0A0;
+	background-color: #FFFFFF;
+	display: none;
+}
+
+.ke-plugin-emoticons .ke-preview-img {
+	border: 0;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-plugin-emoticons .ke-table {
+	border: 0;
+	margin: 0;
+	padding: 0;
+	border-collapse: separate;
+}
+
+.ke-plugin-emoticons .ke-cell {
+	margin: 0;
+	padding: 1px;
+	border: 1px solid #F0F0EE;
+	cursor: pointer;
+}
+
+.ke-plugin-emoticons .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+.ke-plugin-emoticons .ke-img {
+	display: block;
+	background-repeat: no-repeat;
+	overflow: hidden;
+	margin: 2px;
+	width: 24px;
+	height: 24px;
+	margin: 0;
+	padding: 0;
+	border: 0;
+}
+
+.ke-plugin-emoticons .ke-page {
+	text-align: right;
+	margin: 5px;
+	padding: 0;
+	border: 0;
+	font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+	color: #333;
+	text-decoration: none;
+}
+
+.ke-plugin-plainpaste-textarea,
+.ke-plugin-wordpaste-iframe {
+	display: block;
+	width: 408px;
+	height: 260px;
+	font-family: "sans serif", tahoma, verdana, helvetica;
+	font-size: 12px;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+}
+
+/* filemanager */
+.ke-plugin-filemanager-header {
+	width: 100%;
+	margin-bottom: 10px;
+}
+
+.ke-plugin-filemanager-header .ke-left {
+	float: left;
+}
+
+.ke-plugin-filemanager-header .ke-right {
+	float: right;
+}
+
+.ke-plugin-filemanager-body {
+	overflow: scroll;
+	background-color: #FFFFFF;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+	width: auto;
+	height: 370px;
+	padding: 5px;
+}
+
+.ke-plugin-filemanager-body .ke-item {
+	width: 100px;
+	margin: 5px;
+}
+
+.ke-plugin-filemanager-body .ke-photo {
+	border: 1px solid #DDDDDD;
+	background-color: #FFFFFF;
+	padding: 10px;
+}
+
+.ke-plugin-filemanager-body .ke-name {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height: 16px;
+}
+
+.ke-plugin-filemanager-body .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+.ke-plugin-filemanager-body .ke-table {
+	width: 95%;
+	border: 0;
+	margin: 0;
+	padding: 0;
+	border-collapse: separate;
+}
+
+.ke-plugin-filemanager-body .ke-table .ke-cell {
+	margin: 0;
+	padding: 0;
+	border: 0;
+}
+
+.ke-plugin-filemanager-body .ke-table .ke-name {
+	width: 55%;
+	text-align: left;
+}
+
+.ke-plugin-filemanager-body .ke-table .ke-size {
+	width: 15%;
+	text-align: left;
+}
+
+.ke-plugin-filemanager-body .ke-table .ke-datetime {
+	width: 30%;
+	text-align: center;
+}
+
+.ke-dialog-content-inner {
+	padding: 10px 20px;
+}
+.ke-dialog-content-inner .row-left {
+	float: left;
+}
+.ke-dialog-content-inner .row-right {
+	float: left;
+}
+.ke-dialog-default {
+	box-shadow: 0 5px 15px rgba(0, 0, 0, .2) !important;
+	border: 1px solid #999 !important;
+	border: 1px solid rgba(0, 0, 0, .2) !important;
+	border-radius: 6px;
+	outline: 0;
+	zoom: 1;
+	overflow: hidden;
+}
diff --git a/addons/nkeditor/assets/themes/default/editor.min.css b/addons/nkeditor/assets/themes/default/editor.min.css
new file mode 100644
index 0000000..cb8de2d
--- /dev/null
+++ b/addons/nkeditor/assets/themes/default/editor.min.css
@@ -0,0 +1 @@
+.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-clearfix{zoom:1}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-dialog a,.ke-dialog a:hover,.ke-menu a,.ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-icon-source{background-position:0 0;width:16px;height:16px}.ke-icon-preview{background-position:0 -16px;width:16px;height:16px}.ke-icon-print{background-position:0 -32px;width:16px;height:16px}.ke-icon-undo{background-position:0 -48px;width:16px;height:16px}.ke-icon-redo{background-position:0 -64px;width:16px;height:16px}.ke-icon-cut{background-position:0 -80px;width:16px;height:16px}.ke-icon-copy{background-position:0 -96px;width:16px;height:16px}.ke-icon-paste{background-position:0 -112px;width:16px;height:16px}.ke-icon-selectall{background-position:0 -128px;width:16px;height:16px}.ke-icon-justifyleft{background-position:0 -144px;width:16px;height:16px}.ke-icon-justifycenter{background-position:0 -160px;width:16px;height:16px}.ke-icon-justifyright{background-position:0 -176px;width:16px;height:16px}.ke-icon-justifyfull{background-position:0 -192px;width:16px;height:16px}.ke-icon-insertorderedlist{background-position:0 -208px;width:16px;height:16px}.ke-icon-insertunorderedlist{background-position:0 -224px;width:16px;height:16px}.ke-icon-indent{background-position:0 -240px;width:16px;height:16px}.ke-icon-outdent{background-position:0 -256px;width:16px;height:16px}.ke-icon-subscript{background-position:0 -272px;width:16px;height:16px}.ke-icon-superscript{background-position:0 -288px;width:16px;height:16px}.ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-icon-formatblock{background-position:0 -336px;width:25px;height:16px}.ke-icon-fontname{background-position:0 -352px;width:21px;height:16px}.ke-icon-fontsize{background-position:0 -368px;width:23px;height:16px}.ke-icon-forecolor{background-position:0 -384px;width:20px;height:16px}.ke-icon-hilitecolor{background-position:0 -400px;width:23px;height:16px}.ke-icon-bold{background-position:0 -416px;width:16px;height:16px}.ke-icon-italic{background-position:0 -432px;width:16px;height:16px}.ke-icon-underline{background-position:0 -448px;width:16px;height:16px}.ke-icon-strikethrough{background-position:0 -464px;width:16px;height:16px}.ke-icon-removeformat{background-position:0 -480px;width:16px;height:16px}.ke-icon-image{background-position:0 -496px;width:16px;height:16px}.ke-icon-flash{background-position:0 -512px;width:16px;height:16px}.ke-icon-media{background-position:0 -528px;width:16px;height:16px}.ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-icon-hr{background-position:0 -592px;width:16px;height:16px}.ke-icon-emoticons{background-position:0 -608px;width:16px;height:16px}.ke-icon-link{background-position:0 -624px;width:16px;height:16px}.ke-icon-unlink{background-position:0 -640px;width:16px;height:16px}.ke-icon-fullscreen{background-position:0 -656px;width:16px;height:16px}.ke-icon-about{background-position:0 -672px;width:16px;height:16px}.ke-icon-plainpaste{background-position:0 -704px;width:16px;height:16px}.ke-icon-wordpaste{background-position:0 -720px;width:16px;height:16px}.ke-icon-table{background-position:0 -784px;width:16px;height:16px}.ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-icon-tableinsert{background-position:0 -784px;width:16px;height:16px}.ke-icon-tabledelete{background-position:0 -800px;width:16px;height:16px}.ke-icon-tablecolinsertleft{background-position:0 -816px;width:16px;height:16px}.ke-icon-tablecolinsertright{background-position:0 -832px;width:16px;height:16px}.ke-icon-tablerowinsertabove{background-position:0 -848px;width:16px;height:16px}.ke-icon-tablerowinsertbelow{background-position:0 -864px;width:16px;height:16px}.ke-icon-tablecoldelete{background-position:0 -880px;width:16px;height:16px}.ke-icon-tablerowdelete{background-position:0 -896px;width:16px;height:16px}.ke-icon-tablecellprop{background-position:0 -912px;width:16px;height:16px}.ke-icon-tableprop{background-position:0 -928px;width:16px;height:16px}.ke-icon-checked{background-position:0 -944px;width:16px;height:16px}.ke-icon-code{background-position:0 -960px;width:16px;height:16px}.ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-icon-baidumap{background-position:0 -976px;width:16px;height:16px}.ke-icon-lineheight{background-position:0 -992px;width:16px;height:16px}.ke-icon-clearhtml{background-position:0 -1008px;width:16px;height:16px}.ke-icon-pagebreak{background-position:0 -1024px;width:16px;height:16px}.ke-icon-insertfile{background-position:0 -1040px;width:16px;height:16px}.ke-icon-quickformat{background-position:0 -1056px;width:16px;height:16px}.ke-icon-template{background-position:0 -1072px;width:16px;height:16px}.ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-icon-tablerowmerge{background-position:0 -1104px;width:16px;height:16px}.ke-icon-tablerowsplit{background-position:0 -1120px;width:16px;height:16px}.ke-icon-tablecolmerge{background-position:0 -1136px;width:16px;height:16px}.ke-icon-tablecolsplit{background-position:0 -1152px;width:16px;height:16px}.ke-icon-anchor{background-position:0 -1168px;width:16px;height:16px}.ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-icon-multiimage{background-position:0 -1232px;width:16px;height:16px}.ke-icon-graft{background:url(images/scrawl.png)!important;width:16px;height:16px}.ke-container{display:block;border:1px solid #ccc;background-color:#fff;overflow:hidden;margin:0;padding:0}.ke-toolbar{border-bottom:1px solid #ccc;background-color:#fff;padding:2px 5px;text-align:left;overflow:hidden;zoom:1}.ke-toolbar-icon{background-repeat:no-repeat;font-size:0;line-height:0;overflow:hidden;display:block}.ke-toolbar-icon-url{background-image:url(images/default.png)}.ke-toolbar .ke-outline{border:1px solid #f0f0ee;margin:1px;padding:1px 2px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-toolbar .ke-on{border:1px solid #5690d2}.ke-toolbar .ke-selected{border:1px solid #5690d2;background-color:#e9eff6}.ke-toolbar .ke-disabled{cursor:default}.ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-toolbar .ke-hr{overflow:hidden;height:1px;clear:both}.ke-edit{padding:0}.ke-edit-iframe,.ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-edit-textarea:focus{outline:0}.ke-statusbar{position:relative;background-color:#f0f0ee;border-top:1px solid #ccc;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize}.ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px;background-image:url(images/default.png)}.ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;background-position:-5px -741px;width:11px;height:11px;background-image:url(images/default.png)}.ke-menu{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #ccc;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f0f0ee;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-dialog{position:absolute;margin:0;padding:0}.ke-dialog .ke-header{width:100%;margin-bottom:10px}.ke-dialog .ke-header .ke-left{float:left}.ke-dialog .ke-header .ke-right{float:right}.ke-dialog .ke-header label{margin-right:0;cursor:pointer;font-weight:400;display:inline;vertical-align:top}.ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0}.ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;background:#f8f8f8;border-bottom:1px solid #eee;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px}.ke-dialog-icon-close{display:block;background:url(images/default.png) no-repeat scroll 0 -688px;width:16px;height:16px;position:absolute;right:6px;top:8px;cursor:pointer}.ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog-body input:focus,.ke-dialog-body select:focus,.ke-dialog-body textarea:focus{outline:0}.ke-dialog-body label{margin-right:10px;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog-body img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog-body select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto}.ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border-color:#848484 #e0e0e0 #e0e0e0 #848484;border-style:solid;border-width:1px}.ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog-row{margin-bottom:10px}.ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;border-radius:6px;height:45px}.ke-dialog-preview,.ke-dialog-yes{margin:5px}.ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:5px 10px;margin-top:-2px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-button:hover{border:1px solid #d1d1d1;background-color:#d1d1d1}.ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-input-text{display:inline-block!important;width:400px;border:1px solid #ccc;height:20px;line-height:18px;font-size:14px;padding:3px;margin:0;outline:0}.ke-input-text:focus{border-color:#66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.ke-input-number{width:50px}.ke-input-color{border:1px solid #a0a0a0;background-color:#fff;font-size:12px;width:60px;height:20px;line-height:20px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-upload-button{position:relative;top:-1px}.ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0}.ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:50px;height:30px}.ke-upload-area .ke-button{padding:6px 15px}.ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #ccc;padding-left:5px;margin-bottom:20px}.ke-tabs-ul{list-style-image:none;list-style-position:outside;list-style-type:none;margin:0;padding:0}.ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-tabs-li-selected{background-color:#fff;border:1px solid #ccc;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-tabs-li-on{background-color:#fff;color:#000}.ke-progressbar{position:relative;margin:0;padding:0}.ke-progressbar-bar{border:1px solid #6fa5db;width:80px;height:5px;margin:10px 10px 0 10px;padding:0}.ke-progressbar-bar-inner{width:0;height:5px;background-color:#6fa5db;overflow:hidden;margin:0;padding:0}.ke-progressbar-percent{position:absolute;top:0;left:40%;display:none}.ke-swfupload-top{position:relative;margin-bottom:10px}.ke-swfupload-button{height:23px;line-height:23px}.ke-swfupload-desc{padding:0 10px;height:23px;line-height:23px}.ke-swfupload-startupload{position:absolute;top:0;right:0}.ke-swfupload-body{overflow:scroll;background-color:#fff;border-color:#848484 #e0e0e0 #e0e0e0 #848484;border-style:solid;border-width:1px;width:auto;height:370px;padding:5px}.ke-swfupload-body .ke-item{width:100px;margin:5px}.ke-swfupload-body .ke-photo{position:relative;border:1px solid #ddd;background-color:#fff;padding:10px}.ke-swfupload-body .ke-delete{display:block;background:url(images/default.png) no-repeat scroll 0 -688px;width:16px;height:16px;position:absolute;right:0;top:0;cursor:pointer}.ke-swfupload-body .ke-status{position:absolute;left:0;bottom:5px;width:100px;height:17px}.ke-swfupload-body .ke-message{width:100px;text-align:center;overflow:hidden;height:17px}.ke-swfupload-body .ke-error{color:red}.ke-swfupload-body .ke-name{width:100px;text-align:center;overflow:hidden;height:16px}.ke-swfupload-body .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-plugin-emoticons{position:relative}.ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-plugin-emoticons .ke-preview-img{border:0;margin:0;padding:0}.ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-plugin-emoticons .ke-cell{margin:0;padding:1px;border:1px solid #f0f0ee;cursor:pointer}.ke-plugin-emoticons .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-plugin-emoticons .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-plugin-plainpaste-textarea,.ke-plugin-wordpaste-iframe{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border-color:#848484 #e0e0e0 #e0e0e0 #848484;border-style:solid;border-width:1px}.ke-plugin-filemanager-header{width:100%;margin-bottom:10px}.ke-plugin-filemanager-header .ke-left{float:left}.ke-plugin-filemanager-header .ke-right{float:right}.ke-plugin-filemanager-body{overflow:scroll;background-color:#fff;border-color:#848484 #e0e0e0 #e0e0e0 #848484;border-style:solid;border-width:1px;width:auto;height:370px;padding:5px}.ke-plugin-filemanager-body .ke-item{width:100px;margin:5px}.ke-plugin-filemanager-body .ke-photo{border:1px solid #ddd;background-color:#fff;padding:10px}.ke-plugin-filemanager-body .ke-name{width:100px;text-align:center;overflow:hidden;height:16px}.ke-plugin-filemanager-body .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-plugin-filemanager-body .ke-table{width:95%;border:0;margin:0;padding:0;border-collapse:separate}.ke-plugin-filemanager-body .ke-table .ke-cell{margin:0;padding:0;border:0}.ke-plugin-filemanager-body .ke-table .ke-name{width:55%;text-align:left}.ke-plugin-filemanager-body .ke-table .ke-size{width:15%;text-align:left}.ke-plugin-filemanager-body .ke-table .ke-datetime{width:30%;text-align:center}.ke-dialog-content-inner{padding:10px 20px}.ke-dialog-content-inner .row-left{float:left}.ke-dialog-content-inner .row-right{float:left}.ke-dialog-default{box-shadow:0 5px 15px rgba(0,0,0,.2)!important;border:1px solid #999!important;border:1px solid rgba(0,0,0,.2)!important;border-radius:6px;outline:0;zoom:1;overflow:hidden}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/default/images/background.png b/addons/nkeditor/assets/themes/default/images/background.png
new file mode 100644
index 0000000..e59bd68
Binary files /dev/null and b/addons/nkeditor/assets/themes/default/images/background.png differ
diff --git a/addons/nkeditor/assets/themes/default/images/default.png b/addons/nkeditor/assets/themes/default/images/default.png
new file mode 100644
index 0000000..cc9e72d
Binary files /dev/null and b/addons/nkeditor/assets/themes/default/images/default.png differ
diff --git a/addons/nkeditor/assets/themes/default/images/scrawl.png b/addons/nkeditor/assets/themes/default/images/scrawl.png
new file mode 100644
index 0000000..58e04ec
Binary files /dev/null and b/addons/nkeditor/assets/themes/default/images/scrawl.png differ
diff --git a/addons/nkeditor/assets/themes/grey/editor.css b/addons/nkeditor/assets/themes/grey/editor.css
new file mode 100644
index 0000000..beb0eae
--- /dev/null
+++ b/addons/nkeditor/assets/themes/grey/editor.css
@@ -0,0 +1,822 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+.ke-container-grey .ke-toolbar {
+  border-top: 5px solid #8a8a8a;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  background-clip: padding-box;
+  text-rendering: optimizelegibility; }
+  .ke-container-grey .ke-toolbar .ke-toolbar-icon {
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-container-grey .ke-toolbar .ke-icon-source {
+    background-position: 0 0px; }
+  .ke-container-grey .ke-toolbar .ke-icon-preview {
+    background-position: 0 -63px; }
+  .ke-container-grey .ke-toolbar .ke-icon-print {
+    background-position: 0 -84px; }
+  .ke-container-grey .ke-toolbar .ke-icon-undo {
+    background-position: 0 -21px; }
+  .ke-container-grey .ke-toolbar .ke-icon-redo {
+    background-position: 0 -42px; }
+  .ke-container-grey .ke-toolbar .ke-icon-template {
+    background-position: 0 -105px; }
+  .ke-container-grey .ke-toolbar .ke-icon-cut {
+    background-position: 0 -147px; }
+  .ke-container-grey .ke-toolbar .ke-icon-copy {
+    background-position: 0 -168px; }
+  .ke-container-grey .ke-toolbar .ke-icon-paste {
+    background-position: 0 -189px; }
+  .ke-container-grey .ke-toolbar .ke-icon-selectall {
+    background-position: 0 -483px; }
+  .ke-container-grey .ke-toolbar .ke-icon-justifyleft {
+    background-position: 0 -252px; }
+  .ke-container-grey .ke-toolbar .ke-icon-justifycenter {
+    background-position: 0 -273px; }
+  .ke-container-grey .ke-toolbar .ke-icon-justifyright {
+    background-position: 0 -294px; }
+  .ke-container-grey .ke-toolbar .ke-icon-justifyfull {
+    background-position: 0 -315px; }
+  .ke-container-grey .ke-toolbar .ke-icon-insertorderedlist {
+    background-position: 0 -336px; }
+  .ke-container-grey .ke-toolbar .ke-icon-insertunorderedlist {
+    background-position: 0 -357px; }
+  .ke-container-grey .ke-toolbar .ke-icon-indent {
+    background-position: 0 -378px; }
+  .ke-container-grey .ke-toolbar .ke-icon-outdent {
+    background-position: 0 -399px; }
+  .ke-container-grey .ke-toolbar .ke-icon-subscript {
+    background-position: 0 -420px; }
+  .ke-container-grey .ke-toolbar .ke-icon-superscript {
+    background-position: 0 -441px; }
+  .ke-container-grey .ke-toolbar .ke-icon-date {
+    background-position: 0px -304px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-time {
+    background-position: 0px -320px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-formatblock {
+    background-position: 0 -546px; }
+  .ke-container-grey .ke-toolbar .ke-icon-fontname {
+    background-position: 0 -567px; }
+  .ke-container-grey .ke-toolbar .ke-icon-fontsize {
+    background-position: 0 -588px; }
+  .ke-container-grey .ke-toolbar .ke-icon-forecolor {
+    background-position: 0 -609px; }
+  .ke-container-grey .ke-toolbar .ke-icon-hilitecolor {
+    background-position: 0 -630px; }
+  .ke-container-grey .ke-toolbar .ke-icon-bold {
+    background-position: 0 -651px; }
+  .ke-container-grey .ke-toolbar .ke-icon-italic {
+    background-position: 0 -672px; }
+  .ke-container-grey .ke-toolbar .ke-icon-underline {
+    background-position: 0 -693px; }
+  .ke-container-grey .ke-toolbar .ke-icon-strikethrough {
+    background-position: 0 -714px; }
+  .ke-container-grey .ke-toolbar .ke-icon-removeformat {
+    background-position: 0 -756px; }
+  .ke-container-grey .ke-toolbar .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-container-grey .ke-toolbar .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-container-grey .ke-toolbar .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-container-grey .ke-toolbar .ke-icon-div {
+    background-position: 0px -544px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-formula {
+    background-position: 0px -576px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-hr {
+    background-position: 0 -924px; }
+  .ke-container-grey .ke-toolbar .ke-icon-emoticons {
+    background-position: 0 -945px; }
+  .ke-container-grey .ke-toolbar .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-container-grey .ke-toolbar .ke-icon-unlink {
+    background-position: 0 -1029px; }
+  .ke-container-grey .ke-toolbar .ke-icon-fullscreen {
+    background-position: 0 -525px; }
+  .ke-container-grey .ke-toolbar .ke-icon-about {
+    background-position: 0 -1092px; }
+  .ke-container-grey .ke-toolbar .ke-icon-quote {
+    background-position: 0 -1114px; }
+  .ke-container-grey .ke-toolbar .ke-icon-plainpaste {
+    background-position: 0 -210px; }
+  .ke-container-grey .ke-toolbar .ke-icon-wordpaste {
+    background-position: 0 -231px; }
+  .ke-container-grey .ke-toolbar .ke-icon-table {
+    background-position: 0px -903px;
+    width: 18px !important; }
+  .ke-container-grey .ke-toolbar .ke-icon-tablemenu {
+    background-position: 0px -768px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-code {
+    background-position: 0 -126px; }
+  .ke-container-grey .ke-toolbar .ke-icon-map {
+    background-position: 0px -976px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-baidumap {
+    background-position: 0 -1050px; }
+  .ke-container-grey .ke-toolbar .ke-icon-lineheight {
+    background-position: 0 -735px; }
+  .ke-container-grey .ke-toolbar .ke-icon-clearhtml {
+    background-position: 0 -462px; }
+  .ke-container-grey .ke-toolbar .ke-icon-pagebreak {
+    background-position: 0 -966px; }
+  .ke-container-grey .ke-toolbar .ke-icon-insertfile {
+    background-position: 0 -882px; }
+  .ke-container-grey .ke-toolbar .ke-icon-quickformat {
+    background-position: 0 -504px; }
+  .ke-container-grey .ke-toolbar .ke-icon-anchor {
+    background-position: 0 -987px; }
+  .ke-container-grey .ke-toolbar .ke-icon-search {
+    background-position: 0px -1184px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-new {
+    background-position: 0px -1200px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-specialchar {
+    background-position: 0px -1216px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-multiimage {
+    background-position: 0 -798px; }
+  .ke-container-grey .ke-toolbar .ke-icon-graft {
+    background-position: 0 -819px; }
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-grey .ke-menu-item .ke-menu-item-left {
+  width: 27px;
+  text-align: center;
+  overflow: hidden; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert {
+    background-position: 0 -903px;
+    width: 18px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete {
+    background-position: 0 -1428px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft {
+    background-position: 0 -1176px;
+    width: 18px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright {
+    background-position: 0 -1323px;
+    width: 18px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove {
+    background-position: 0 -1302px;
+    width: 22px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow {
+    background-position: 0 -1155px;
+    width: 22px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete {
+    background-position: 0 -1239px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete {
+    background-position: 0 -1260px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop {
+    background-position: 0 -1218px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tableprop {
+    background-position: 0 -1134px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit {
+    background-position: 0px -1088px;
+    width: 16px;
+    height: 16px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge {
+    background-position: -1px -1197px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge {
+    background-position: -4px -1365px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-checked {
+    background-position: 0 -1407px; }
+
+/*# sourceMappingURL=editor.css.map */
diff --git a/addons/nkeditor/assets/themes/grey/editor.css.map b/addons/nkeditor/assets/themes/grey/editor.css.map
new file mode 100644
index 0000000..01a6d6f
--- /dev/null
+++ b/addons/nkeditor/assets/themes/grey/editor.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../common/common.scss","editor.scss"],
+"names": [],
+"file": "editor.css"
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/grey/editor.min.css b/addons/nkeditor/assets/themes/grey/editor.min.css
new file mode 100644
index 0000000..34fe061
--- /dev/null
+++ b/addons/nkeditor/assets/themes/grey/editor.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ke-clearfix{zoom:1;clear:both}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-dialog-lock{background-color:#fff;opacity:.5;z-index:811213;left:0;top:0;position:absolute}.ke-container{display:block;background-color:#fff;overflow:hidden;margin:0;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16)}.ke-container .ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-container .ke-dialog a,.ke-container .ke-dialog a:hover,.ke-container .ke-menu a,.ke-container .ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-container .ke-toolbar{text-align:left;overflow:hidden;zoom:1;padding:0 5px}.ke-container .ke-toolbar .ke-outline{padding:10px 5px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-container .ke-toolbar .ke-outline .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px}.ke-container .ke-toolbar .ke-on{background:#ebebeb}.ke-container .ke-toolbar .ke-selected{background-color:#ebebeb}.ke-container .ke-toolbar .ke-disabled{cursor:default}.ke-container .ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-container .ke-toolbar .ke-hr{clear:both;height:1px;width:calc(100% - (2 * 2px));background:#ebebeb}.ke-container .ke-edit{padding:0}.ke-container .ke-edit .ke-edit-iframe,.ke-container .ke-edit .ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-container .ke-edit .ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-container .ke-edit .ke-edit-textarea:focus{outline:0}.ke-container .ke-statusbar{position:relative;background-color:#f5f5f5;border-top:1px solid #e1e1e1;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize;display:none}.ke-container .ke-statusbar .ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px}.ke-container .ke-statusbar .ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;width:11px;height:11px}.ke-menu{border:1px solid #ccc;background-color:#f5f5f5;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu .ke-menu-item .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-inline-block .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu .ke-menu-item .ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu .ke-menu-item .ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #e1e1e1;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-menu .ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons{position:relative}.ke-menu .ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img{border:0;margin:0;padding:0}.ke-menu .ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell{margin:0;padding:1px;border:1px solid #f5f5f5;cursor:pointer}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-menu .ke-plugin-emoticons .ke-table .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker .ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f1f1f1;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-dialog{margin:0;padding:0;border:1px solid #ccc;zoom:1;box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden}.ke-dialog .ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom:1px solid #c6c6c6;background:transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.ke-dialog .ke-dialog-header .ke-dialog-icon-close{height:20px;width:20px;cursor:pointer;background:url(../common/icons-all.gif) 0 -59px;position:absolute;right:5px;top:4px}.ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover{background-position:0 -89px}.ke-dialog .ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border:1px solid #ccc}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus{border-color:#66afe9;outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto;border:1px solid #ccc;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number{width:50px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox{position:relative;top:6px}.ke-dialog .ke-dialog-content .ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus{outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text{display:inline-block!important;max-width:400px;height:30px;line-height:30px;border:1px solid #ccc;font-size:14px;margin:0;outline:0;padding:0 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus{border-color:#66afe9}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color{border:1px solid #e1e1e1;background-color:#fff;font-size:12px;width:60px;height:30px;line-height:30px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0;top:-1px;position:relative}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:62px;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common{top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button{padding:8px 15px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner{padding:10px 20px 0 20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row{border:1px solid #fff;margin-bottom:10px;overflow:hidden}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left{float:left;height:30px;line-height:30px;width:60px;text-align:right}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right{float:left;text-align:left}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button{position:relative;top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label{cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header{height:30px;line-height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text{height:22px;line-height:22px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button{padding:3px 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox{margin-left:10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #e1e1e1;margin-bottom:20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul{list-style:none outside none;margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected{background-color:#fff;border:1px solid #e1e1e1;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on{background-color:#fff;color:#000}.ke-dialog .ke-dialog-content .ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat center;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog .ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;height:40px}.ke-dialog .ke-dialog-footer .ke-dialog-yes{margin:5px}.ke-dialog .ke-dialog-footer .ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog .ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-dialog .ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:7px 10px;margin-top:-4px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-dialog .ke-button:hover{border:1px solid #e1e1e1;background-color:#e1e1e1}.ke-dialog .ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog .ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-container-grey .ke-toolbar{border-top:5px solid #8a8a8a;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);background-clip:padding-box;text-rendering:optimizelegibility}.ke-container-grey .ke-toolbar .ke-toolbar-icon{background:url(images/nkeditor.svg) no-repeat}.ke-container-grey .ke-toolbar .ke-icon-source{background-position:0 0}.ke-container-grey .ke-toolbar .ke-icon-preview{background-position:0 -63px}.ke-container-grey .ke-toolbar .ke-icon-print{background-position:0 -84px}.ke-container-grey .ke-toolbar .ke-icon-undo{background-position:0 -21px}.ke-container-grey .ke-toolbar .ke-icon-redo{background-position:0 -42px}.ke-container-grey .ke-toolbar .ke-icon-template{background-position:0 -105px}.ke-container-grey .ke-toolbar .ke-icon-cut{background-position:0 -147px}.ke-container-grey .ke-toolbar .ke-icon-copy{background-position:0 -168px}.ke-container-grey .ke-toolbar .ke-icon-paste{background-position:0 -189px}.ke-container-grey .ke-toolbar .ke-icon-selectall{background-position:0 -483px}.ke-container-grey .ke-toolbar .ke-icon-justifyleft{background-position:0 -252px}.ke-container-grey .ke-toolbar .ke-icon-justifycenter{background-position:0 -273px}.ke-container-grey .ke-toolbar .ke-icon-justifyright{background-position:0 -294px}.ke-container-grey .ke-toolbar .ke-icon-justifyfull{background-position:0 -315px}.ke-container-grey .ke-toolbar .ke-icon-insertorderedlist{background-position:0 -336px}.ke-container-grey .ke-toolbar .ke-icon-insertunorderedlist{background-position:0 -357px}.ke-container-grey .ke-toolbar .ke-icon-indent{background-position:0 -378px}.ke-container-grey .ke-toolbar .ke-icon-outdent{background-position:0 -399px}.ke-container-grey .ke-toolbar .ke-icon-subscript{background-position:0 -420px}.ke-container-grey .ke-toolbar .ke-icon-superscript{background-position:0 -441px}.ke-container-grey .ke-toolbar .ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-formatblock{background-position:0 -546px}.ke-container-grey .ke-toolbar .ke-icon-fontname{background-position:0 -567px}.ke-container-grey .ke-toolbar .ke-icon-fontsize{background-position:0 -588px}.ke-container-grey .ke-toolbar .ke-icon-forecolor{background-position:0 -609px}.ke-container-grey .ke-toolbar .ke-icon-hilitecolor{background-position:0 -630px}.ke-container-grey .ke-toolbar .ke-icon-bold{background-position:0 -651px}.ke-container-grey .ke-toolbar .ke-icon-italic{background-position:0 -672px}.ke-container-grey .ke-toolbar .ke-icon-underline{background-position:0 -693px}.ke-container-grey .ke-toolbar .ke-icon-strikethrough{background-position:0 -714px}.ke-container-grey .ke-toolbar .ke-icon-removeformat{background-position:0 -756px}.ke-container-grey .ke-toolbar .ke-icon-image{background-position:0 -777px}.ke-container-grey .ke-toolbar .ke-icon-flash{background-position:0 -840px}.ke-container-grey .ke-toolbar .ke-icon-media{background-position:0 -861px}.ke-container-grey .ke-toolbar .ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-hr{background-position:0 -924px}.ke-container-grey .ke-toolbar .ke-icon-emoticons{background-position:0 -945px}.ke-container-grey .ke-toolbar .ke-icon-link{background-position:0 -1008px}.ke-container-grey .ke-toolbar .ke-icon-unlink{background-position:0 -1029px}.ke-container-grey .ke-toolbar .ke-icon-fullscreen{background-position:0 -525px}.ke-container-grey .ke-toolbar .ke-icon-about{background-position:0 -1092px}.ke-container-grey .ke-toolbar .ke-icon-quote{background-position:0 -1114px}.ke-container-grey .ke-toolbar .ke-icon-plainpaste{background-position:0 -210px}.ke-container-grey .ke-toolbar .ke-icon-wordpaste{background-position:0 -231px}.ke-container-grey .ke-toolbar .ke-icon-table{background-position:0 -903px;width:18px!important}.ke-container-grey .ke-toolbar .ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-code{background-position:0 -126px}.ke-container-grey .ke-toolbar .ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-baidumap{background-position:0 -1050px}.ke-container-grey .ke-toolbar .ke-icon-lineheight{background-position:0 -735px}.ke-container-grey .ke-toolbar .ke-icon-clearhtml{background-position:0 -462px}.ke-container-grey .ke-toolbar .ke-icon-pagebreak{background-position:0 -966px}.ke-container-grey .ke-toolbar .ke-icon-insertfile{background-position:0 -882px}.ke-container-grey .ke-toolbar .ke-icon-quickformat{background-position:0 -504px}.ke-container-grey .ke-toolbar .ke-icon-anchor{background-position:0 -987px}.ke-container-grey .ke-toolbar .ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-multiimage{background-position:0 -798px}.ke-container-grey .ke-toolbar .ke-icon-graft{background-position:0 -819px}.ke-menu-grey .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px;background:url(images/nkeditor.svg) no-repeat}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert{background-position:0 -903px;width:18px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete{background-position:0 -1428px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft{background-position:0 -1176px;width:18px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright{background-position:0 -1323px;width:18px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove{background-position:0 -1302px;width:22px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow{background-position:0 -1155px;width:22px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete{background-position:0 -1239px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete{background-position:0 -1260px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop{background-position:0 -1218px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tableprop{background-position:0 -1134px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge{background-position:-1px -1197px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit{background-position:0 -1344px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge{background-position:-4px -1365px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit{background-position:0 -1344px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-image{background-position:0 -777px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-flash{background-position:0 -840px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-media{background-position:0 -861px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-link{background-position:0 -1008px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-checked{background-position:0 -1407px}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/grey/editor.scss b/addons/nkeditor/assets/themes/grey/editor.scss
new file mode 100644
index 0000000..9549839
--- /dev/null
+++ b/addons/nkeditor/assets/themes/grey/editor.scss
@@ -0,0 +1,387 @@
+@import "../common/common";
+
+.ke-container-grey {
+    .ke-toolbar {
+
+        border-top: 5px solid #8a8a8a;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+        background-clip: padding-box;
+        text-rendering: optimizelegibility;
+
+        .ke-toolbar-icon {
+            *background-image: url(images/nkeditor.png);
+            background: url(images/nkeditor.svg) no-repeat;
+        }
+
+        .ke-icon-source {
+            background-position: 0 0px;
+        }
+        .ke-icon-preview {
+            background-position: 0 -63px;
+        }
+        .ke-icon-print {
+            background-position: 0 -84px;
+        }
+        .ke-icon-undo {
+            background-position: 0 -21px;
+        }
+
+        .ke-icon-redo {
+            background-position: 0 -42px;
+        }
+
+        .ke-icon-template {
+            background-position: 0 -105px;
+        }
+
+        .ke-icon-cut {
+            background-position: 0 -147px;
+        }
+
+        .ke-icon-copy {
+            background-position: 0 -168px;
+        }
+
+        .ke-icon-paste {
+            background-position: 0 -189px;
+        }
+
+        .ke-icon-selectall {
+            background-position: 0 -483px;
+        }
+
+        .ke-icon-justifyleft {
+            background-position: 0 -252px;
+        }
+
+        .ke-icon-justifycenter {
+            background-position: 0 -273px;
+        }
+
+        .ke-icon-justifyright {
+            background-position: 0 -294px;
+        }
+
+        .ke-icon-justifyfull {
+            background-position: 0 -315px;
+        }
+
+        .ke-icon-insertorderedlist {
+            background-position: 0 -336px;
+        }
+
+        .ke-icon-insertunorderedlist {
+            background-position: 0 -357px;
+        }
+
+        .ke-icon-indent {
+            background-position: 0 -378px;
+        }
+
+        .ke-icon-outdent {
+            background-position: 0 -399px;
+        }
+
+        .ke-icon-subscript {
+            background-position: 0 -420px;
+        }
+
+        .ke-icon-superscript {
+            background-position: 0 -441px;
+        }
+
+        .ke-icon-date {
+            background-position: 0px -304px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-time {
+            background-position: 0px -320px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-formatblock {
+            background-position: 0 -546px;
+        }
+
+        .ke-icon-fontname {
+            background-position: 0 -567px;
+        }
+
+        .ke-icon-fontsize {
+            background-position: 0 -588px;
+        }
+
+        .ke-icon-forecolor {
+            background-position: 0 -609px;
+        }
+
+        .ke-icon-hilitecolor {
+            background-position: 0 -630px;
+        }
+
+        .ke-icon-bold {
+            background-position: 0 -651px;
+        }
+
+        .ke-icon-italic {
+            background-position: 0 -672px;
+        }
+
+        .ke-icon-underline {
+            background-position: 0 -693px;
+        }
+
+        .ke-icon-strikethrough {
+            background-position: 0 -714px;
+        }
+
+        .ke-icon-removeformat {
+            background-position: 0 -756px;
+        }
+
+        .ke-icon-image {
+            background-position: 0 -777px;
+        }
+
+        .ke-icon-flash {
+            background-position: 0 -840px;
+        }
+
+        .ke-icon-media {
+            background-position: 0 -861px;
+        }
+
+        .ke-icon-div {
+            background-position: 0px -544px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-formula {
+            background-position: 0px -576px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-hr {
+            background-position: 0 -924px;
+        }
+
+        .ke-icon-emoticons {
+            background-position: 0 -945px;
+        }
+
+        .ke-icon-link {
+            background-position: 0 -1008px;
+        }
+
+        .ke-icon-unlink {
+            background-position: 0 -1029px;
+        }
+
+        .ke-icon-fullscreen {
+            background-position: 0 -525px;
+        }
+
+        .ke-icon-about {
+            background-position: 0 -1092px;
+        }
+
+        .ke-icon-quote {
+            background-position: 0 -1114px;
+        }
+
+        .ke-icon-plainpaste {
+            background-position: 0 -210px;
+        }
+
+        .ke-icon-wordpaste {
+            background-position: 0 -231px;
+        }
+
+        .ke-icon-table {
+            background-position: 0px -903px;
+            width: 18px !important;
+        }
+
+        .ke-icon-tablemenu {
+            background-position: 0px -768px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-code {
+            background-position: 0 -126px;
+        }
+
+        .ke-icon-map {
+            background-position: 0px -976px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-baidumap {
+            background-position: 0 -1050px;
+        }
+
+        .ke-icon-lineheight {
+            background-position: 0 -735px;
+        }
+
+        .ke-icon-clearhtml {
+            background-position: 0 -462px;
+        }
+
+        .ke-icon-pagebreak {
+            background-position: 0 -966px;
+        }
+
+        .ke-icon-insertfile {
+            background-position: 0 -882px;
+        }
+
+        .ke-icon-quickformat {
+            background-position: 0 -504px;
+        }
+
+        .ke-icon-anchor {
+            background-position: 0 -987px;
+        }
+
+        .ke-icon-search {
+            background-position: 0px -1184px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-new {
+            background-position: 0px -1200px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-specialchar {
+            background-position: 0px -1216px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-multiimage {
+            background-position: 0 -798px;
+        }
+
+        .ke-icon-graft {
+            background-position: 0 -819px;
+        }
+    }
+}
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-grey {
+
+    .ke-menu-item {
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+                *background-image: url(images/nkeditor.png);
+                background: url(images/nkeditor.svg) no-repeat;
+            }
+
+            .ke-icon-tableinsert {
+                background-position: 0 -903px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tabledelete {
+                background-position: 0 -1428px;
+            }
+
+            .ke-icon-tablecolinsertleft {
+                background-position: 0 -1176px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablecolinsertright {
+                background-position: 0 -1323px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablerowinsertabove {
+                background-position: 0 -1302px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablerowinsertbelow {
+                background-position: 0 -1155px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablecoldelete {
+                background-position: 0 -1239px;
+            }
+
+            .ke-icon-tablerowdelete {
+                background-position: 0 -1260px;
+            }
+
+            .ke-icon-tablecellprop {
+                background-position: 0 -1218px;
+            }
+
+            .ke-icon-tableprop {
+                background-position: 0 -1134px;
+            }
+            .ke-icon-tablecellsplit {
+                background-position: 0px -1088px;
+                width: 16px;
+                height: 16px;
+            }
+
+            .ke-icon-tablerowmerge {
+                background-position: -1px -1197px;
+            }
+
+            .ke-icon-tablerowsplit {
+                background-position: 0 -1344px;
+            }
+
+            .ke-icon-tablecolmerge {
+                background-position: -4px -1365px;
+            }
+
+            .ke-icon-tablecolsplit {
+                background-position: 0 -1344px;
+            }
+
+            //图片,视频右键菜单
+            .ke-icon-image {
+                background-position: 0 -777px;
+            }
+            .ke-icon-flash {
+                background-position: 0 -840px;
+            }
+            .ke-icon-media {
+                background-position: 0 -861px;
+            }
+            .ke-icon-link {
+                background-position: 0 -1008px;
+            }
+
+            .ke-icon-checked {
+                background-position: 0 -1407px;
+            }
+
+        }
+    }
+}
+//menu end
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/grey/images/nkeditor.png b/addons/nkeditor/assets/themes/grey/images/nkeditor.png
new file mode 100644
index 0000000..3e12962
Binary files /dev/null and b/addons/nkeditor/assets/themes/grey/images/nkeditor.png differ
diff --git a/addons/nkeditor/assets/themes/grey/images/nkeditor.svg b/addons/nkeditor/assets/themes/grey/images/nkeditor.svg
new file mode 100644
index 0000000..7a5b61d
--- /dev/null
+++ b/addons/nkeditor/assets/themes/grey/images/nkeditor.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="1549" viewBox="0 0 21 1549">
+<svg id="icon-source-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="0">
+<path fill="#8a8a8a" d="M14.4 16h-12.8c-0.884 0-1.6-0.716-1.6-1.6v-12.8c0-0.884 0.716-1.6 1.6-1.6h12.8c0.884 0 1.6 0.716 1.6 1.6v12.8c0 0.884-0.716 1.6-1.6 1.6zM14.4 2.4h-12.8v12h12.8v-12zM6.4 5.6l-2.4 3.2 2.4 2.4-0.8 0.8-3.2-3.2 3.2-4 0.8 0.8zM9.6 4l-1.6 8.8h-1.6l1.6-8.8h1.6zM10.4 4.8l3.2 4-3.2 3.2-0.8-0.8 2.4-2.4-2.4-3.2 0.8-0.8z"></path>
+</svg>
+<svg id="icon-undo" width="16" height="16" viewBox="0 0 16 16" x="0" y="21">
+<path fill="#8a8a8a" d="M12.161 16c1.777-3.219 2.076-8.13-4.904-7.966v3.966l-6-6 6-6v3.881c8.359-0.218 9.29 7.378 4.904 12.119z"></path>
+</svg>
+<svg id="icon-redo" width="16" height="16" viewBox="0 0 16 16" x="0" y="42">
+<path fill="#8a8a8a" d="M9 3.881v-3.881l6 6-6 6v-3.966c-6.981-0.164-6.681 4.747-4.904 7.966-4.386-4.741-3.454-12.337 4.904-12.119z"></path>
+</svg>
+<svg id="icon-preview" width="16" height="16" viewBox="0 0 16 16" x="0" y="63">
+<path fill="#8a8a8a" d="M11.566 10.552c1.261-1.733 1.095-4.134-0.425-5.645-0.827-0.827-1.922-1.275-3.089-1.275-1.166 0-2.261 0.456-3.089 1.275-0.811 0.827-1.269 1.922-1.269 3.086s0.456 2.259 1.277 3.086c0.827 0.827 1.922 1.275 3.089 1.275 0.922 0 1.805-0.291 2.561-0.85l2.269 2.259c0.127 0.127 0.292 0.197 0.473 0.197s0.347-0.070 0.473-0.197c0.259-0.259 0.259-0.684 0-0.945l-2.27-2.266zM5.916 10.134c-1.181-1.181-1.181-3.094 0-4.275 0.575-0.575 1.331-0.881 2.142-0.881s1.567 0.316 2.142 0.881c1.181 1.181 1.181 3.094 0 4.275-1.141 1.133-3.142 1.133-4.284 0z"></path>
+<path fill="#8a8a8a" d="M11.431 1h-6.855c-1.969 0-3.577 1.598-3.577 3.575v6.85c0 1.969 1.6 3.575 3.577 3.575h3.719c0.37 0 0.67-0.298 0.67-0.669s-0.3-0.669-0.67-0.669h-3.719c-1.23 0-2.23-1-2.23-2.228v-6.852c0-1.228 1-2.228 2.23-2.228h6.855c1.23 0 2.23 1 2.23 2.228v3.645c0 0.37 0.3 0.669 0.67 0.669s0.67-0.298 0.67-0.669v-3.661c-0.002-1.969-1.602-3.567-3.57-3.567z"></path>
+</svg>
+<svg id="icon-print" width="16" height="16" viewBox="0 0 16 16" x="0" y="84">
+<path fill="#8a8a8a" d="M4.98 14.938h5.967c0.548 0 0.975-0.461 0.975-1.011v-2.973h-7.922v2.973c0 0.55 0.431 1.011 0.98 1.011zM10.947 1.016h-5.967c-0.548 0-0.98 0.428-0.98 0.978v2.959h7.922v-2.959c0-0.55-0.427-0.978-0.975-0.978z"></path>
+<path fill="#8a8a8a" d="M12.922 4.953v1.016h-9.922v-1.016h-1.003c-0.55 0-0.981 0.469-0.981 1.019v6.961c0 0.55 0.431 1.005 0.981 1.005h1.003v-3.984h9.922v3.984h1.008c0.548 0 1.008-0.455 1.008-1.005v-6.961c0-0.55-0.458-1.019-1.008-1.019h-1.008zM12.922 7.984h-2.969v-1.016h2.969v1.016z"></path>
+</svg>
+<svg id="icon-template" width="16" height="16" viewBox="0 0 16 16" x="0" y="105">
+<path fill="#8a8a8a" d="M8.824 4.504h-8.504v8.536h8.504v-8.536zM6.632 10.84h-0.68v-3.056l-1.056 3.056h-0.608l-1.048-3.104v3.104h-0.68v-4.28h0.952l0.992 2.976c0.048 0.144 0.088 0.264 0.12 0.376 0.040-0.12 0.088-0.264 0.144-0.424l1-2.92h0.872v4.272zM14.88 2.84l-2.024-2.032c-0.44-0.44-1.312-0.808-1.936-0.808h-6.8c-0.624 0-1.136 0.512-1.136 1.136v2.296h0.904v-2.296c0-0.12 0.104-0.224 0.224-0.224h6.8c0.064 0 0.144 0.008 0.224 0.024v3.616h3.6c0.016 0.080 0.024 0.528 0.024 0.6v9.712c0 0.12-0.104 0.224-0.224 0.224h-10.432c-0.12 0-0.224-0.104-0.224-0.224v-0.76h-0.904v0.76c0 0.624 0.512 1.136 1.136 1.136h10.432c0.624 0 1.136-0.512 1.136-1.136v-9.712c0-0.624-0.36-1.872-0.8-2.312zM12.056 3.64v-2.328c0.064 0.040 0.112 0.088 0.16 0.136l2.024 2.032c0.048 0.048 0.088 0.096 0.136 0.16h-2.32zM9.864 9.6h3.72v-1.064h-3.72v1.064zM9.864 11.736h3.72v-1.064h-3.72v1.064zM13.584 6.4h-3.72v1.064h3.72v-1.064z"></path>
+</svg>
+<svg id="icon-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="126">
+<path fill="#8a8a8a" d="M5.015 3.754l-0.708-0.585c-0.215-0.154-0.462-0.123-0.646 0.062l-3.569 4.492c-0.123 0.154-0.123 0.4 0 0.585l3.6 4.462c0.154 0.185 0.431 0.246 0.646 0.062l0.708-0.585c0.215-0.154 0.246-0.462 0.062-0.646l-2.892-3.6 2.923-3.6c0.123-0.185 0.092-0.462-0.123-0.646zM15.908 7.723l-3.6-4.462c-0.154-0.185-0.431-0.246-0.646-0.062l-0.708 0.585c-0.215 0.154-0.246 0.462-0.062 0.646l2.923 3.6-2.923 3.6c-0.154 0.185-0.123 0.492 0.062 0.646l0.708 0.585c0.215 0.154 0.462 0.123 0.646-0.062l3.6-4.492c0.123-0.215 0.123-0.431 0-0.585zM9.723 3.323l-0.923-0.215c-0.246-0.062-0.523 0.092-0.585 0.338l-2.277 8.738c-0.062 0.246 0.092 0.492 0.338 0.554l0.923 0.215c0.246 0.062 0.523-0.092 0.585-0.338l2.277-8.738c0.062-0.277-0.092-0.492-0.338-0.554z"></path>
+</svg>
+<svg id="icon-crop" width="16" height="16" viewBox="0 0 16 16" x="0" y="147">
+<path fill="#8a8a8a" d="M13.585 0.288c1.548 1.972 0.581 3.752 0.581 3.752l-6.049 7.649s-4.161-4.761-5.855-7.12c-1.693-2.356 0.099-4.569 0.099-4.569l5.757 7.312 5.467-7.023zM8.074 10.223c0.469 0 0.846-0.378 0.846-0.842 0-0.224-0.090-0.439-0.249-0.597s-0.374-0.246-0.598-0.246c-0.467 0-0.848 0.377-0.848 0.842s0.381 0.842 0.848 0.842zM11.641 10.395c0.746-0.002 1.462 0.292 1.989 0.818s0.827 1.24 0.829 1.985c-0.002 0.746-0.3 1.459-0.829 1.985s-1.244 0.819-1.989 0.817c-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.3-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM11.641 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001zM4.575 10.395c0.746-0.002 1.461 0.292 1.989 0.818s0.826 1.24 0.829 1.985c-0.005 1.552-1.266 2.807-2.818 2.802-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.299-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM4.575 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001z"></path>
+</svg>
+<svg id="icon-copy" width="16" height="16" viewBox="0 0 16 16" x="0" y="168">
+<path fill="#8a8a8a" d="M3 10h7v1h-7v-1z"></path>
+<path fill="#8a8a8a" d="M3 8h7v1h-7v-1z"></path>
+<path fill="#8a8a8a" d="M3 12h4v1h-4v-1z"></path>
+<path fill="#8a8a8a" d="M14 0h-9c-1.1 0-2 0.9-2 2h1c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9c0 0.6-0.4 1-1 1v1c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2z"></path>
+<path fill="#8a8a8a" d="M3 6h7v1h-7v-1z"></path>
+<path fill="#8a8a8a" d="M11 3h-9c-1.1 0-2 0.9-2 2v9c0 1.1 0.9 2 2 2h9c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2zM12 14c0 0.6-0.4 1-1 1h-9c-0.6 0-1-0.4-1-1v-9c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9z"></path>
+</svg>
+<svg id="icon-paste" width="16" height="16" viewBox="0 0 16 16" x="0" y="189">
+<path fill="#8a8a8a" d="M13.644 7h-5.288c-1.298 0-2.356 1.056-2.356 2.356v4.288c0 1.298 1.056 2.356 2.356 2.356h5.289c1.298 0 2.356-1.056 2.356-2.356v-4.289c-0.002-1.298-1.058-2.355-2.358-2.355zM15 13.644c0 0.747-0.608 1.356-1.356 1.356h-5.288c-0.747 0-1.356-0.608-1.356-1.356v-4.289c0-0.747 0.608-1.356 1.356-1.356h5.289c0.747 0 1.356 0.608 1.356 1.356v4.289h-0.002z"></path>
+<path fill="#8a8a8a" d="M4.453 13h-2.434c-0.561 0-1.019-0.456-1.019-1.019v-9.963c0-0.561 0.456-1.019 1.019-1.019h8.962c0.561 0 1.019 0.456 1.019 1.019v3.497c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-3.497c0-1.112-0.906-2.019-2.019-2.019h-8.963c-1.112 0-2.019 0.905-2.019 2.019v9.962c0 1.113 0.906 2.019 2.019 2.019h2.434c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+<path fill="#8a8a8a" d="M10.5 3h-8c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h8c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM5.5 6h-3c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h3c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM4.5 9h-2c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h2c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+</svg>
+<svg id="icon-paste-text" width="16" height="16" viewBox="0 0 16 16" x="0" y="210">
+<path fill="#8a8a8a" d="M10.5 2h-2v-1c0-0.551-0.45-1-1-1h-2c-0.549 0-1 0.45-1 1v1h-2v2.278h7.999v-2.278zM7.5 2h-2v-0.998c0.001 0 0.001-0.001 0.002-0.001h1.996c0.001 0 0.001 0.001 0.002 0.001l-0.001 0.998zM8.17 9.529h1.972v3.834h1.005v-3.834h1.967v-1.005h-4.943z"></path>
+<path fill="#8a8a8a" d="M12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.816h-0.012v1.928h-8.992v-1.743h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.651c0 0.275 0.225 0.5 0.5 0.5h4.772v1.347l9.727 0.001v-10.118h-3zM6.773 14.999v-8.118h7.726l0.003 8.117-7.729 0.001z"></path>
+</svg>
+<svg id="icon-paste-word" width="16" height="16" viewBox="0 0 16 16" x="0" y="231">
+<path fill="#8a8a8a" d="M13.628 8.819v0.146c-0.195 0.017-0.34 0.154-0.437 0.413l-1.238 3.691h-0.17l-1.044-2.865h-0.024l-1.141 2.865h-0.17l-1.311-3.691c-0.081-0.259-0.227-0.396-0.437-0.413v-0.146h1.821v0.146c-0.275 0.017-0.405 0.105-0.389 0.267 0 0.081 0.016 0.154 0.049 0.219l0.59 1.788 0.718-1.799-0.046-0.257c-0.097-0.13-0.251-0.202-0.461-0.219v-0.146h1.942v0.146c-0.032 0.017-0.057 0.024-0.073 0.024-0.276 0-0.397 0.073-0.364 0.219 0 0.033 0.008 0.105 0.025 0.219 0.016 0.065 0.032 0.105 0.048 0.121l0.572 1.679 0.534-1.806c0.016-0.032 0.084-0.421-0.062-0.432-0.017-0.001-0.033-0.008-0.049-0.024v-0.146h1.117zM10.5 2h-2v-1c0-0.55-0.45-1-1-1h-2c-0.55 0-1 0.45-1 1v1h-2v2.278h8v-2.278zM7.5 2h-2v-0.998l0.002-0.002h1.997c0 0.001 0.002 0.001 0.002 0.002l-0 0.998zM12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.815h-0.011v1.928h-8.992v-1.744h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.652c0 0.275 0.225 0.5 0.5 0.5h4.773v1.348l9.727 0.001v-10.118h-3zM6.773 14.999v-8.117h7.727l0.003 8.117h-7.729z"></path>
+</svg>
+<svg id="icon-left-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="252">
+<path fill="#8a8a8a" d="M1.148 0h13.704c0.624 0 1.123 0.499 1.123 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.679c-0.649-0.025-1.148-0.524-1.148-1.148 0-0.649 0.499-1.148 1.148-1.148zM1.148 4.568h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 9.136h13.704c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.704c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 13.704h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.649-0.025-1.148-0.524-1.148-1.173 0-0.624 0.499-1.123 1.148-1.123z"></path>
+</svg>
+<svg id="icon-center-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="273">
+<path fill="#8a8a8a" d="M1.953 3.11q-0.407 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.281h11.719q0.406 0 0.688 0.281t0.281 0.688-0.281 0.696-0.688 0.289h-11.719zM11.719 5.063q0.406 0 0.688 0.282t0.281 0.688-0.281 0.696-0.688 0.289h-7.813q-0.406 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.282h7.813zM13.672 8.953q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-11.719q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h11.719zM11.719 12.86q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-7.813q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h7.813z"></path>
+</svg>
+<svg id="icon-right-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="294">
+<path fill="#8a8a8a" d="M3.497 10.966c-0.249-0.002-0.529-0.062-0.737-0.19-0.382-0.234-0.488-0.667-0.349-1.095 0.142-0.437 0.484-0.671 1.071-0.672 3.574-0.006 7.149-0.006 10.723 0.005 0.236 0.001 0.5 0.070 0.701 0.19 0.374 0.222 0.5 0.672 0.371 1.090-0.132 0.428-0.468 0.674-0.974 0.676-1.822 0.006-3.643 0.002-5.465 0.002-1.78 0-3.561 0.008-5.341-0.008zM14.228 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.795-0 3.589-0.002 5.383 0.001zM9.344 6.983c-1.63 0-3.26 0.004-4.89-0.002-0.662-0.002-1.097-0.402-1.095-0.98 0.001-0.58 0.436-0.993 1.093-0.994 3.26-0.006 6.52-0.008 9.78 0.007 0.245 0.001 0.521 0.098 0.727 0.235 0.35 0.232 0.448 0.677 0.309 1.074-0.144 0.412-0.47 0.654-0.951 0.656-1.658 0.007-3.315 0.003-4.973 0.003v0.002zM14.279 13.022c0.627 0.003 1.053 0.418 1.049 0.983-0.004 0.563-0.437 0.98-1.058 0.981-3.287 0.005-5.935 0.007-9.222-0.008-0.231-0.001-0.492-0.098-0.685-0.23-0.343-0.234-0.441-0.681-0.305-1.078 0.137-0.4 0.477-0.646 0.958-0.648 1.657-0.007 2.675-0.003 4.332-0.003 1.644-0 3.287-0.006 4.931 0.002z"></path>
+</svg>
+<svg id="icon-both-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="315">
+<path fill="#8a8a8a" d="M14.148 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 13.040c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 8.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.002 7.105-0.002 1.794-0 3.589-0.002 5.383 0.001zM14.148 4.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001z"></path>
+</svg>
+<svg id="icon-ol" width="16" height="16" viewBox="0 0 16 16" x="0" y="336">
+<path fill="#8a8a8a" d="M7.111 1.778h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889z"></path>
+<path fill="#8a8a8a" d="M15.111 4.711h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M15.111 9.511h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M15.111 14.222h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M2.578 0.533h-0.8l-1.689 0.889 0.267 0.889 1.244-0.711v3.733h-1.333v0.889h3.556v-0.889h-1.244z"></path>
+<path fill="#8a8a8a" d="M2.222 13.956c0.178-0.178 0.444-0.444 0.622-0.622s0.356-0.356 0.444-0.533c0.089-0.178 0.178-0.356 0.267-0.533s0.089-0.356 0.089-0.622c0-0.267-0.089-0.622-0.178-0.8-0.089-0.267-0.267-0.356-0.356-0.533s-0.444-0.267-0.622-0.356c-0.178-0.089-0.444-0.089-0.711-0.089-0.356 0-0.711 0.089-0.978 0.178-0.267 0.178-0.622 0.356-0.8 0.622l0.444 0.622c0.178-0.178 0.356-0.267 0.533-0.444s0.444-0.178 0.622-0.178c0.178 0 0.356 0 0.444 0s0.267 0.089 0.267 0.267 0.178 0.178 0.178 0.356 0.089 0.267 0.089 0.356c0 0.178 0 0.267 0 0.444s-0.089 0.267-0.178 0.356-0.178 0.267-0.356 0.444-0.356 0.444-0.533 0.711l-1.511 1.244v0.889h3.733v-0.889h-2.4l0.889-0.889z"></path>
+</svg>
+<svg id="icon-ul" width="16" height="16" viewBox="0 0 16 16" x="0" y="357">
+<path fill="#8a8a8a" d="M15.111 13.333h-8.889c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M6.222 2.667h8.889c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889z"></path>
+<path fill="#8a8a8a" d="M15.111 7.111h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M0 1.778c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#8a8a8a" d="M0 8c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#8a8a8a" d="M0 14.222c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+</svg>
+<svg id="icon-right-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="378">
+<path fill="#8a8a8a" d="M0 1.882h17.488v-1.882h-17.488zM7.511 5.412h9.977v-1.883h-9.977zM7.511 8.941h9.977v-1.883h-9.977zM7.511 12.471h9.977v-1.883h-9.977zM0 16h17.488v-1.882h-17.488zM0 11.572v-6.627l4.418 3.314z"></path>
+</svg>
+<svg id="icon-left-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="399">
+<path fill="#8a8a8a" d="M0 1.883h17.488v-1.883h-17.488v1.883zM7.511 5.412h9.977v-1.883h-9.977v1.883zM7.511 8.941h9.977v-1.883h-9.977v1.883zM7.511 12.471h9.977v-1.883h-9.977v1.883zM0 16h17.488v-1.883h-17.488v1.883zM4.418 11.572v-6.627l-4.418 3.314 4.418 3.313z"></path>
+</svg>
+<svg id="icon-down-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="420">
+<path fill="#8a8a8a" d="M13.331 13.511v1.089h2.669v1.4h-4.001v-3.189l2.664-1.309v-1.089h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-up-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="441">
+<path fill="#8a8a8a" d="M13.331 4.492v1.095h2.669v1.394h-4.001v-3.183l2.664-1.309v-1.095h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-clear-format" width="16" height="16" viewBox="0 0 16 16" x="0" y="462">
+<path fill="#8a8a8a" d="M11.163 3.197l3.005-1.734 1.43 1.763-2.248 2.491zM8.877 2.251c0.879 0.108 5.156 5.318 5.046 5.904s-2.497 2.206-2.497 2.206l-5.417-6.229c-0 0 1.989-1.988 2.868-1.88zM5.491 4.897l5.23 6.088-3.209 4.173-7.247-9.178s1.436-0.060 2.633-0.374c0.783-0.206 2.593-0.709 2.593-0.709z"></path>
+</svg>
+<svg id="icon-selectall" width="16" height="16" viewBox="0 0 16 16" x="0" y="483">
+<path fill="#8a8a8a" d="M7.272 8.96c-0.216 0-0.416-0.080-0.568-0.232l-3.136-3.144c-0.112-0.112-0.176-0.264-0.176-0.416 0-0.16 0.064-0.304 0.176-0.416s0.264-0.176 0.416-0.176c0.16 0 0.304 0.064 0.416 0.176l2.872 2.872 6.104-6.104c0.112-0.112 0.264-0.176 0.416-0.176 0.16 0 0.304 0.064 0.416 0.176 0.232 0.232 0.232 0.608 0 0.84l-6.368 6.368c-0.152 0.152-0.352 0.232-0.568 0.232z"></path>
+<path fill="#8a8a8a" d="M2 12.76c-0.256 0-0.496-0.104-0.68-0.28-0.184-0.184-0.28-0.424-0.28-0.68v-9.776c0-0.256 0.104-0.496 0.28-0.68 0.184-0.184 0.424-0.28 0.68-0.28h6.776c0.328 0 0.592 0.264 0.592 0.592s-0.264 0.592-0.592 0.592h-6.552v9.328h8.92v-4.304c0-0.328 0.272-0.6 0.6-0.6s0.6 0.272 0.6 0.6v4.528c0 0.256-0.104 0.496-0.28 0.68-0.184 0.184-0.424 0.28-0.68 0.28h-9.384z"></path>
+<path fill="#8a8a8a" d="M5 15.016c-0.328 0-0.592-0.264-0.592-0.592s0.264-0.592 0.592-0.592l8.808-0.008v-7.68c0-0.328 0.264-0.592 0.592-0.592 0.16 0 0.312 0.064 0.424 0.176s0.176 0.264 0.176 0.424l-0.008 8.008c0 0.472-0.384 0.848-0.856 0.848l-9.136 0.008z"></path>
+</svg>
+<svg id="icon-paiban" width="16" height="16" viewBox="0 0 16 16" x="0" y="504">
+<path fill="#8a8a8a" d="M15.176 12.792l-5.48-4.8c-0.304-0.264-0.76-0.232-1.024 0.072l-1.552 1.776c-0.264 0.304-0.232 0.76 0.064 1.024l2.16 1.888 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.776 0.68 0.36-0.416 0.424-0.48c0.088-0.104 0.24-0.112 0.344-0.024l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.424 0.48-0.36 0.416 0.776 0.68 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.616 0.544c0.304 0.264 0.76 0.232 1.024-0.072l1.56-1.776c0.264-0.32 0.232-0.776-0.072-1.040zM9.76 9.944c-0.176 0.2-0.488 0.208-0.704 0.024s-0.248-0.496-0.072-0.696c0.176-0.2 0.488-0.208 0.704-0.024s0.248 0.496 0.072 0.696z"></path>
+<path fill="#8a8a8a" d="M5.784 10.824h-2.928c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.552 0.552-0.552h3.096l0.944-1.112h-4.040c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.56 0.552-0.56h4.984l0.472-0.56c0.344-0.4 0.952-0.456 1.352-0.112l2.632 2.232v-6.016l-0.072-0.072v-0.008l-2.88-2.88h-7.784c-0.816 0-1.48 0.664-1.48 1.48v10.744c0 0.816 0.664 1.48 1.48 1.48h7.6l-3.144-2.664c-0.096-0.080-0.176-0.184-0.232-0.296zM2.856 3.040h3.704c0.304 0 0.552 0.248 0.552 0.552s-0.248 0.552-0.552 0.552h-3.704c-0.304 0-0.552-0.248-0.552-0.552 0-0.296 0.248-0.552 0.552-0.552zM2.856 5.264h6.664c0.304 0 0.552 0.248 0.552 0.56 0 0.304-0.248 0.552-0.552 0.552h-6.664c-0.304 0-0.552-0.248-0.552-0.552 0-0.312 0.248-0.56 0.552-0.56z"></path>
+</svg>
+<svg id="icon-full-screen" width="16" height="16" viewBox="0 0 16 16" x="0" y="525">
+<path fill="#8a8a8a" d="M14.872 1.258c-0.094-0.094-0.219-0.145-0.352-0.145h-0.002l-4.502 0.017c-0.275 0.002-0.497 0.223-0.497 0.5 0.002 0.273 0.223 0.497 0.498 0.497h0.002l3.175-0.013-3.423 3.45c-0.194 0.194-0.192 0.511 0.003 0.705 0.097 0.097 0.223 0.145 0.35 0.145 0.128 0 0.256-0.050 0.353-0.148l3.545-3.572v3.22c0 0.275 0.222 0.498 0.498 0.498 0.275 0 0.498-0.222 0.498-0.498v-4.303c-0.002-0.133-0.055-0.259-0.148-0.353zM1.239 1.238c0.094-0.094 0.219-0.145 0.352-0.145h0.002l4.502 0.019c0.275 0.002 0.497 0.225 0.497 0.5-0.002 0.273-0.223 0.497-0.498 0.497h-0.002l-3.177-0.014 3.425 3.45c0.194 0.194 0.192 0.511-0.003 0.705-0.097 0.097-0.223 0.145-0.35 0.145-0.128 0-0.256-0.050-0.353-0.148l-3.545-3.572v3.22c0 0.275-0.222 0.498-0.498 0.498s-0.498-0.222-0.498-0.498v-4.303c0.002-0.131 0.055-0.259 0.148-0.353zM14.872 14.881c-0.094 0.094-0.219 0.145-0.352 0.145h-0.002l-4.502-0.017c-0.275-0.002-0.497-0.225-0.497-0.5 0.002-0.273 0.223-0.497 0.498-0.497h0.002l3.175 0.012-3.423-3.448c-0.194-0.194-0.192-0.511 0.003-0.705 0.097-0.097 0.223-0.145 0.35-0.145 0.128 0 0.256 0.050 0.353 0.148l3.545 3.57v-3.22c0-0.275 0.222-0.498 0.498-0.498 0.275 0 0.498 0.222 0.498 0.498v4.303c-0.002 0.133-0.055 0.259-0.148 0.353zM1.223 14.886c0.094 0.094 0.219 0.145 0.352 0.145h0.002l4.502-0.017c0.275-0.002 0.497-0.225 0.497-0.5-0.002-0.273-0.223-0.497-0.498-0.497h-0.002l-3.175 0.012 3.425-3.45c0.194-0.194 0.192-0.511-0.003-0.705-0.097-0.097-0.223-0.145-0.35-0.145-0.128 0-0.256 0.050-0.353 0.148l-3.547 3.572v-3.22c0-0.275-0.222-0.498-0.498-0.498s-0.498 0.222-0.498 0.498v4.303c0.002 0.133 0.055 0.259 0.148 0.353z"></path>
+</svg>
+<svg id="icon-title" width="16" height="16" viewBox="0 0 16 16" x="0" y="546">
+<path fill="#8a8a8a" d="M1.815 2.089v4.803h1.332v-4.803h1.815v-1.089h-4.962v1.089h1.815zM6.443 1.966v-0.966h-1.205v0.966h1.205zM5.239 2.626v4.267h1.205v-4.267h-1.205zM8.594 2.626v-1.279h-1.205v1.279h-0.73v0.784h0.73v2.517c0 0.215 0.037 0.388 0.11 0.52s0.174 0.234 0.301 0.305c0.127 0.072 0.274 0.12 0.441 0.144s0.344 0.037 0.53 0.037c0.119 0 0.24-0.003 0.365-0.008s0.238-0.016 0.339-0.033v-0.908c-0.057 0.011-0.116 0.019-0.178 0.025s-0.127 0.008-0.195 0.008c-0.204 0-0.339-0.033-0.407-0.099s-0.102-0.198-0.102-0.396v-2.113h0.882v-0.784h-0.882zM9.761 1v5.893h1.205v-5.893h-1.205zM14.541 4.301h-1.96c0.006-0.083 0.024-0.176 0.055-0.281s0.085-0.204 0.161-0.297c0.076-0.094 0.178-0.172 0.305-0.235s0.287-0.095 0.479-0.095c0.294 0 0.513 0.077 0.657 0.231s0.245 0.38 0.301 0.677v0zM12.581 5.044h3.164c0.023-0.33-0.006-0.646-0.085-0.949s-0.208-0.572-0.386-0.809c-0.178-0.237-0.406-0.425-0.683-0.565s-0.602-0.21-0.976-0.21c-0.334 0-0.638 0.058-0.912 0.173s-0.51 0.274-0.708 0.475c-0.198 0.201-0.351 0.439-0.458 0.714s-0.161 0.572-0.161 0.891c0 0.33 0.052 0.633 0.157 0.908s0.253 0.512 0.445 0.71c0.192 0.198 0.427 0.351 0.704 0.458s0.588 0.161 0.933 0.161c0.498 0 0.922-0.11 1.272-0.33s0.611-0.586 0.78-1.098h-1.060c-0.040 0.132-0.147 0.257-0.322 0.376s-0.385 0.177-0.628 0.177c-0.339 0-0.599-0.085-0.78-0.256s-0.28-0.446-0.297-0.825zM0 9h16v1h-16v-1zM0 12h16v1h-16v-1zM0 15h12v1h-12v-1z"></path>
+</svg>
+<svg id="icon-font" width="16" height="16" viewBox="0 0 16 16" x="0" y="567">
+<path fill="#8a8a8a" d="M0.32 1.436v3.661h0.448c0.149-0.971 0.523-1.793 1.195-2.316 0.374-0.374 1.046-0.598 2.017-0.598h1.046v10.386c0 0.672-0.075 1.121-0.149 1.27-0.075 0.224-0.224 0.374-0.448 0.448-0.224 0.149-0.598 0.224-0.971 0.224h-0.448v0.374h7.472v-0.374h-0.448c-0.448 0-0.747-0.075-0.971-0.224s-0.374-0.299-0.448-0.448-0.149-0.598-0.149-1.27v-10.386h1.046c0.672 0 1.121 0.075 1.42 0.149 0.448 0.224 0.822 0.523 1.121 0.897s0.523 0.971 0.747 1.793h0.374v-3.586h-12.851z"></path>
+<path fill="#8a8a8a" d="M8.533 6.286v2.341h0.254c0.085-0.621 0.296-1.146 0.676-1.481 0.211-0.239 0.592-0.382 1.141-0.382h0.592v6.64c0 0.43-0.042 0.716-0.085 0.812-0.042 0.143-0.127 0.239-0.254 0.287-0.127 0.095-0.338 0.143-0.549 0.143h-0.254v0.239h4.225v-0.239h-0.253c-0.254 0-0.423-0.048-0.549-0.143s-0.211-0.191-0.254-0.287c-0.042-0.095-0.084-0.382-0.084-0.812v-6.64h0.592c0.38 0 0.634 0.048 0.803 0.096 0.255 0.145 0.467 0.338 0.63 0.567l0.004 0.006c0.169 0.239 0.296 0.621 0.423 1.146h0.211v-2.293h-7.268z"></path>
+</svg>
+<svg id="icon-fontsize" width="16" height="16" viewBox="0 0 16 16" x="0" y="588">
+<path fill="#8a8a8a" d="M10.75 12.432l2.663 3.141 2.674-3.141z"></path>
+<path fill="#8a8a8a" d="M2.979 7.234l1.53-4.933 1.534 4.933h-3.064zM5.888 0.408h-2.332l-3.489 11.051h1.617l0.825-2.63h4.042l0.839 2.63h2.025l-3.527-11.051z"></path>
+<path fill="#8a8a8a" d="M9.553 8.899l0.888-2.357 0.888 2.357h-1.776zM11.238 5.444h-1.351l-1.085 2.927 0.47 1.475 0.007-0.021h2.342l0.487 1.522h1.171l-2.041-5.903z"></path>
+</svg>
+<svg id="icon-fontcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="609">
+<path fill="#8a8a8a" d="M1.051 12.486v2.105h9.121l2.105-2.105h-11.226zM11.575 14.591h3.508v-3.508l-3.508 3.508z"></path>
+<path fill="#8a8a8a" d="M12.338 12.135h-1.766l-1.437-3.369h-4.42l-1.423 3.369h-1.802l4.631-10.705h1.66l4.558 10.705zM8.565 7.275l-1.625-3.615-1.639 3.615h3.264z"></path>
+</svg>
+<svg id="icon-font-bgcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="630">
+<path fill="#8a8a8a" d="M4.068 9.652c-0.151 0.146-0.226 0.351-0.226 0.614 0 0.231 0.082 0.42 0.246 0.566s0.38 0.219 0.649 0.219c0.374 0 0.683-0.132 0.926-0.395s0.364-0.594 0.364-0.991v-0.465l-1.136 0.154c-0.398 0.053-0.672 0.152-0.823 0.298zM12.953 1.452h-9.984c-1.103 0-1.997 0.894-1.997 1.997v8.985c0 1.103 0.894 1.997 1.997 1.997h9.984c1.103 0 1.997-0.894 1.997-1.997v-8.985c0-1.103-0.894-1.997-1.997-1.997zM6.879 11.635h-0.851v-0.75h-0.022c-0.336 0.576-0.832 0.864-1.487 0.864-0.471 0-0.845-0.127-1.123-0.382s-0.417-0.598-0.417-1.031c0-0.907 0.537-1.435 1.61-1.584l1.439-0.202c0-0.793-0.328-1.189-0.983-1.189-0.582 0-1.113 0.196-1.593 0.588v-0.829c0.483-0.301 1.040-0.452 1.672-0.452 1.17 0 1.755 0.614 1.755 1.843v3.124zM12.26 11.023c-0.402 0.484-0.938 0.726-1.608 0.726-0.632 0-1.113-0.266-1.443-0.799h-0.018v0.684h-0.86v-7.182h0.86v3.168h0.018c0.38-0.635 0.936-0.952 1.667-0.952 0.608 0 1.092 0.214 1.45 0.643s0.538 1.014 0.538 1.757c0 0.819-0.201 1.47-0.603 1.955zM10.638 7.38c-0.421 0-0.769 0.151-1.042 0.452s-0.41 0.684-0.41 1.15v0.658c0 0.392 0.127 0.723 0.382 0.994s0.573 0.406 0.956 0.406c0.456 0 0.813-0.175 1.071-0.526s0.386-0.836 0.386-1.457c0-0.512-0.12-0.919-0.36-1.222s-0.567-0.454-0.983-0.454z"></path>
+</svg>
+<svg id="icon-b" width="16" height="16" viewBox="0 0 16 16" x="0" y="651">
+<path fill="#8a8a8a" d="M12.615 5.846c0-1.846-1.477-3.385-3.231-3.385h-5.077c-0.338 0-0.615 0.277-0.615 0.615v10.154c0 0.338 0.277 0.615 0.615 0.615h5.077c1.754 0 3.231-1.538 3.231-3.385 0-0.892-0.338-1.692-0.892-2.308 0.554-0.615 0.892-1.415 0.892-2.308zM9.385 11.692h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231zM9.385 7.077h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231z"></path>
+</svg>
+<svg id="icon-italic" width="16" height="16" viewBox="0 0 16 16" x="0" y="672">
+<path fill="#8a8a8a" d="M11.692 3.785v-0.4c0-0.338-0.277-0.615-0.615-0.615h-4.308c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615 0.523 0 0.923 0.492 0.8 0.985l-1.108 5.415c-0.092 0.4-0.431 0.677-0.8 0.677h-0.738c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615h4.308c0.338 0 0.615-0.277 0.615-0.615v-0.615c0-0.338-0.277-0.615-0.615-0.615-0.523 0-0.923-0.492-0.8-0.985l1.108-5.415c0.092-0.4 0.431-0.677 0.8-0.677h0.523c0.462 0 0.831-0.369 0.831-0.831z"></path>
+</svg>
+<svg id="icon-underline" width="16" height="16" viewBox="0 0 16 16" x="0" y="693">
+<path fill="#8a8a8a" d="M13.692 12.923h-11.385c-0.246 0-0.462 0.215-0.462 0.462v0.923c0 0.246 0.215 0.462 0.462 0.462h11.385c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462zM7.785 11.692c-2.308-0.123-4.092-2.123-4.092-4.431v-4.185c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.215c0 1.323 0.985 2.462 2.308 2.554 1.446 0.092 2.615-1.046 2.615-2.462v-4.308c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.308c0 2.462-2.062 4.431-4.523 4.308z"></path>
+</svg>
+<svg id="icon-strickout" width="16" height="16" viewBox="0 0 16 16" x="0" y="714">
+<path fill="#8a8a8a" d="M3.723 5.569c-0.062-0.308-0.092-0.677-0.092-1.046 0-0.4 0.092-0.862 0.277-1.292 0.185-0.462 0.462-0.892 0.862-1.262 0.369-0.369 0.892-0.708 1.477-0.954 0.615-0.246 1.323-0.4 2.185-0.4 0.769 0 1.508 0.092 2.215 0.308 0.554 0.185 1.077 0.492 1.538 0.923 0.185 0.185 0.185 0.492-0.031 0.677l-0.831 0.769c-0.185 0.154-0.462 0.185-0.646 0-0.215-0.215-0.462-0.4-0.738-0.554-0.431-0.215-0.923-0.338-1.508-0.338-0.523 0-0.985 0.062-1.323 0.215s-0.646 0.308-0.862 0.554-0.369 0.462-0.462 0.708-0.123 0.492-0.123 0.677c0 0.338 0.062 0.615 0.154 0.862 0.092 0.215-0.062 0.431-0.277 0.431h-1.508c-0.154 0-0.277-0.154-0.308-0.277zM12.277 10.154h-1.538c-0.215 0-0.369 0.215-0.277 0.4s0.123 0.431 0.123 0.677c0 0.369-0.092 0.708-0.246 1.015-0.185 0.308-0.4 0.523-0.677 0.738-0.277 0.185-0.585 0.338-0.923 0.431s-0.646 0.154-0.985 0.154c-0.585 0-1.138-0.123-1.662-0.369-0.4-0.185-0.738-0.431-1.046-0.769-0.154-0.185-0.462-0.215-0.646-0.062l-0.862 0.738c-0.185 0.154-0.215 0.462-0.031 0.646 0.431 0.492 0.985 0.862 1.631 1.108 0.8 0.308 1.662 0.462 2.585 0.462 0.677 0 1.323-0.092 1.908-0.308 0.585-0.185 1.108-0.492 1.569-0.862 0.431-0.369 0.8-0.831 1.046-1.385s0.4-1.138 0.4-1.815c0-0.246 0-0.4-0.031-0.615-0.062-0.062-0.185-0.185-0.338-0.185zM15.354 7.354c-0.062-0.185-0.246-0.277-0.431-0.277h-13.846c-0.215 0-0.369 0.092-0.431 0.277-0.031 0.062-0.031 0.092-0.031 0.154v0.923c0 0.246 0.215 0.492 0.462 0.492h13.846c0.246 0 0.462-0.246 0.462-0.492v-0.923c0-0.062 0-0.092-0.031-0.154z"></path>
+</svg>
+<svg id="icon-line-height" width="16" height="16" viewBox="0 0 16 16" x="0" y="735">
+<path fill="#8a8a8a" d="M2.499 11.902v-7.682c-0.166 0-0.326 0.009-0.485-0.002-0.265-0.019-0.339-0.2-0.178-0.467 0.254-0.423 0.52-0.837 0.79-1.245 0.145-0.219 0.377-0.212 0.522 0.009 0.262 0.398 0.521 0.801 0.767 1.214 0.055 0.093 0.087 0.254 0.063 0.359-0.016 0.067-0.153 0.115-0.239 0.126-0.153 0.020-0.308 0.006-0.469 0.006v7.672c0.15 0 0.298-0.017 0.444 0.006 0.097 0.015 0.246 0.062 0.266 0.138 0.027 0.104-0.021 0.274-0.080 0.375-0.236 0.397-0.486 0.781-0.737 1.164-0.17 0.26-0.396 0.258-0.566-0.005-0.25-0.384-0.492-0.775-0.737-1.163-0.022-0.035-0.044-0.075-0.061-0.118l-0.002-0.005c-0.088-0.217-0.034-0.357 0.161-0.375 0.176-0.016 0.353-0.003 0.543-0.003z"></path>
+<path fill="#8a8a8a" d="M14.841 0v1.166h-13.69v-1.166zM14.849 14.834v1.166h-13.69v-1.166zM10.056 2.956l4.172 10.602h-1.321l-1.129-2.97h-4.871l-1.128 2.97h-1.307l4.173-10.602zM11.392 9.563l-2.004-5.3h-0.059l-2.034 5.3z"></path>
+</svg>
+<svg id="icon-clear-html" width="16" height="16" viewBox="0 0 16 16" x="0" y="756">
+<path fill="#8a8a8a" d="M10.175 3.11c-0.106-0.106-0.279-0.106-0.385 0l-8.625 8.625c-0.106 0.106-0.106 0.279 0 0.385l1.678 1.678c0.106 0.106 0.315 0.192 0.464 0.192h5.374c0.15 0 0.358-0.087 0.464-0.192l5.666-5.666c0.106-0.106 0.106-0.279 0-0.385l-4.636-4.636zM8.612 12.774c-0.106 0.106-0.315 0.192-0.464 0.192h-4.161c-0.15 0-0.358-0.087-0.464-0.192l-0.791-0.791c-0.106-0.106-0.106-0.279 0-0.385l3.162-3.162c0.106-0.106 0.279-0.106 0.385 0l3.143 3.143c0.106 0.106 0.106 0.279 0 0.385l-0.81 0.81z"></path>
+</svg>
+<svg id="icon-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="777">
+<path fill="#8a8a8a" d="M15.385 3.077c0-0.677-0.554-1.231-1.231-1.231h-12.308c-0.677 0-1.231 0.554-1.231 1.231v9.846c0 0.677 0.554 1.231 1.231 1.231h12.308c0.677 0 1.231-0.554 1.231-1.231v-9.846zM12.185 11.692h-8.923c-0.369 0-0.585-0.4-0.4-0.708l2.708-4.708c0.123-0.215 0.4-0.215 0.523 0l1.631 2.8c0.123 0.185 0.4 0.215 0.523 0.031l1.323-1.908c0.123-0.185 0.4-0.185 0.523 0l2.431 3.877c0.185 0.277 0 0.615-0.338 0.615zM11.385 6.154c-0.677 0-1.231-0.554-1.231-1.231s0.554-1.231 1.231-1.231 1.231 0.554 1.231 1.231-0.554 1.231-1.231 1.231z"></path>
+</svg>
+<svg id="icon-multiple-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="798">
+<path fill="#8a8a8a" d="M13 1v12.033h-12v-12.033h12zM13 0h-12c-0.567 0-1 0.433-1 1v12.033c0 0.567 0.433 1 1 1h12.033c0.567 0 1-0.433 1-1v-12.033c-0.033-0.567-0.467-1-1.033-1z"></path>
+<path fill="#8a8a8a" d="M13 12.267c0.567-0.6 0.8-2.3 0.8-3.1 0-2.033-1.6-3.7-3.633-3.7-1.433 0-2.633 0.8-3.233 1.967-0.667 1.033-1.8 1.7-3.1 1.7-1.367 0-2.533-0.733-3.2-1.833-0.333 0.567-0.5 1.2-0.5 1.867 0 0.733 0.2 2.333 0.567 2.9v1.133h1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h2.1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h0.7v-0.933z"></path>
+<path fill="#8a8a8a" d="M2.767 4.233c0 0 0 0 0 0 0 0.7 0.567 1.267 1.267 1.267s1.267-0.567 1.267-1.267c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.7-0.567-1.267-1.267-1.267s-1.267 0.567-1.267 1.267c0 0 0 0 0 0v0z"></path>
+<path fill="#8a8a8a" d="M15.633 16h-9c-0.267 0-0.5-0.233-0.5-0.5s0.233-0.5 0.5-0.5h8.5v-8.5c0-0.267 0.233-0.5 0.5-0.5s0.5 0.233 0.5 0.5v9c0 0.267-0.233 0.5-0.5 0.5z"></path>
+</svg>
+<svg id="icon-graft" width="17" height="16" viewBox="0 0 17 16" x="0" y="819">
+<path fill="#8a8a8a" d="M16.407 3.584c0.106-0.333 0.388-1.214-0.194-1.628-0.171-0.118-0.382-0.188-0.61-0.188-0.013 0-0.026 0-0.039 0.001l0.002-0c-0.449 0-1.133 0.267-1.914 0.713-0.030-0.060-0.067-0.112-0.111-0.157l0 0c-1.435-1.432-3.417-2.318-5.605-2.318-4.379 0-7.93 3.548-7.935 7.926v0c-0 0.009-0 0.020-0 0.031 0 2.264 0.957 4.305 2.489 5.739l0.004 0.004c0.107 0.101 0.251 0.163 0.41 0.163 0.001 0 0.001 0 0.002 0h0.044c-0.291 0.29-0.604 0.557-0.938 0.8l-0.023 0.016c-0.155 0.11-0.255 0.289-0.255 0.491 0 0.279 0.19 0.513 0.448 0.581l0.004 0.001c0.631 0.152 1.356 0.239 2.102 0.239 0.004 0 0.008 0 0.011 0h-0.001c1.236 0 2.256-0.259 3.042-0.777v0.047c0 0.332 0.269 0.601 0.601 0.601v0c4.38-0.005 7.929-3.555 7.935-7.934v-0c0-0.008 0.001-0.018 0.001-0.028 0-0.332-0.269-0.601-0.601-0.601s-0.601 0.269-0.601 0.601c0 0.010 0 0.020 0.001 0.029l-0-0.001c-0.005 3.687-2.969 6.679-6.644 6.731l-0.005 0c0.617-0.614 0.933-1.306 0.906-1.993-0.017-0.336-0.114-0.646-0.272-0.916l0.005 0.009c0.166 0.056 0.358 0.088 0.557 0.088 0.004 0 0.007-0 0.011-0h-0.001c2.749-0.001 6.495-6.143 7.175-8.27zM4.521 13.81c0.268-0.47 1.21-1.992 2.168-1.992 0.209 0.006 0.402 0.071 0.563 0.18l-0.004-0.002c0.265 0.15 0.447 0.419 0.476 0.732l0 0.004c0.021 0.427-0.3 0.928-0.881 1.375s-1.457 0.695-2.549 0.695c-0.181 0-0.369-0.006-0.56-0.021 0.298-0.283 0.558-0.602 0.774-0.952l0.012-0.020zM8.754 9.025c1.072-2.589 5.206-5.632 6.574-6.016-0.129 0.493-0.567 1.583-1.553 3.158-1.643 2.599-3.549 4.486-4.55 4.486-0.003 0-0.007 0-0.010 0-0.167 0-0.317-0.071-0.422-0.185l-0-0c-0.299-0.299-0.312-0.786-0.039-1.443zM1.2 7.933c0-0.002 0-0.004 0-0.006 0-3.717 3.014-6.731 6.731-6.731 1.835 0 3.499 0.734 4.713 1.925l-0.001-0.001c-1.977 1.364-4.207 3.536-4.998 5.444-0.422 1.019-0.327 1.744-0.071 2.246-0.26-0.121-0.564-0.192-0.885-0.193h-0c-1.486 0-2.63 1.588-3.193 2.559-0.021-0.136-0.086-0.254-0.18-0.343l-0-0c-1.303-1.221-2.115-2.952-2.115-4.874 0-0.009 0-0.019 0-0.028v0.001z"></path>
+<path fill="#8a8a8a" d="M8.931 4.704c0.858 0 1.553-0.695 1.553-1.553s-0.695-1.553-1.553-1.553c-0.858 0-1.553 0.695-1.553 1.553v0c0 0.858 0.695 1.553 1.553 1.553v0zM8.931 3.504c-0.194 0-0.352-0.158-0.352-0.352s0.158-0.352 0.352-0.352c0.194 0 0.352 0.158 0.352 0.352v0c0 0.194-0.158 0.352-0.352 0.352v0zM5.394 9.012c0-0.858-0.695-1.553-1.553-1.553s-1.553 0.695-1.553 1.553c0 0.858 0.695 1.553 1.553 1.553v0c0.858 0 1.553-0.695 1.553-1.553v0zM3.841 8.659c0.002-0 0.004-0 0.006-0 0.194 0 0.352 0.158 0.352 0.352s-0.158 0.352-0.352 0.352c-0.194 0-0.352-0.158-0.352-0.352v0c0-0 0-0 0-0 0-0.193 0.155-0.349 0.347-0.352h0zM4.977 7.069c1.144 0 2.071-0.927 2.071-2.071s-0.927-2.071-2.071-2.071c-1.144 0-2.071 0.927-2.071 2.071v0c0 1.144 0.927 2.071 2.071 2.071v0zM4.977 4.123c0.482 0 0.872 0.391 0.872 0.872s-0.391 0.872-0.872 0.872c-0.482 0-0.872-0.391-0.872-0.872v0c0.001-0.481 0.391-0.87 0.872-0.871h0z"></path>
+</svg>
+<svg id="icon-flash" width="16" height="16" viewBox="0 0 16 16" x="0" y="840">
+<path fill="#8a8a8a" d="M8 0.889c-3.911 0-7.111 3.2-7.111 7.111s3.2 7.111 7.111 7.111 7.111-3.2 7.111-7.111-3.2-7.111-7.111-7.111zM11.556 5.956c-1.244-0.089-1.956 1.244-1.956 1.244l1.422 0.089v1.6h-2.044c-1.067 3.911-3.644 3.2-3.644 3.2v-1.333s1.511 0 2.311-2.756c1.156-4.356 3.911-3.467 3.911-3.467v1.422z"></path>
+</svg>
+<svg id="icon-vedio" width="16" height="16" viewBox="0 0 16 16" x="0" y="861">
+<path fill="#8a8a8a" d="M15.385 0.615h-0.615v1.231h-1.846v-1.231h-9.846v1.231h-1.846v-1.231h-0.615c-0.339 0-0.615 0.276-0.615 0.615v13.538c0 0.339 0.276 0.615 0.615 0.615h0.615v-0.615h1.846v0.615h9.846v-0.615h1.846v0.615h0.615c0.339 0 0.615-0.276 0.615-0.615v-13.538c0-0.339-0.276-0.615-0.615-0.615zM3.077 12.923h-1.846v-1.846h1.846v1.846zM3.077 9.231h-1.846v-1.846h1.846v1.846zM3.077 5.538h-1.846v-1.846h1.846v1.846zM10.823 8.404l-4.002 2.334c-0.065 0.033-0.137 0.048-0.207 0.048-0.085 0-0.167-0.023-0.242-0.067-0.135-0.082-0.218-0.228-0.218-0.385v-4.668c0-0.157 0.082-0.303 0.218-0.385 0.137-0.082 0.307-0.090 0.449-0.018l4.002 2.334c0.156 0.077 0.254 0.233 0.254 0.404s-0.098 0.327-0.254 0.404zM14.769 12.923h-1.846v-1.846h1.846v1.846zM14.769 9.231h-1.846v-1.846h1.846v1.846zM14.769 5.538h-1.846v-1.846h1.846v1.846z"></path>
+</svg>
+<svg id="icon-attach" width="16" height="16" viewBox="0 0 16 16" x="0" y="882">
+<path fill="#8a8a8a" d="M5.415 11.292c0.185 0.185 0.462 0.154 0.646 0l3.077-3.077c0.215-0.215 0.585-0.246 0.862 0s0.246 0.677 0 0.923l-3.785 3.723c-0.831 0.831-2.215 0.831-3.046 0l-0.031-0.031c-0.831-0.831-0.831-2.215 0-3.046l6.677-6.677c0.831-0.831 2.215-0.831 3.046 0l0.031 0.031c0.831 0.831 0.831 2.215 0 3.046l-0.031 0.031c-0.154 0.154-0.185 0.369-0.062 0.554 0.185 0.338 0.338 0.708 0.431 1.077 0.062 0.246 0.338 0.308 0.523 0.154 0.246-0.246 0.462-0.492 0.462-0.492 1.569-1.569 1.569-4.123 0-5.692h-0.062c-1.569-1.569-4.123-1.569-5.692 0l-6.677 6.646c-1.569 1.569-1.569 4.123 0 5.692l0.062 0.062c1.569 1.569 4.092 1.569 5.662 0l3.815-3.785c0.985-0.985 0.954-2.585-0.062-3.569-0.985-0.954-2.585-0.892-3.538 0.092l-3.015 3.015c-0.185 0.185-0.185 0.492 0 0.677l0.708 0.646z"></path>
+</svg>
+<svg id="icon-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="903">
+<path fill="#8a8a8a" d="M17.846 0h-17.231c-0.49 0-0.615 0.129-0.615 0.615v14.769c0 0.486 0.125 0.615 0.615 0.615h17.231c0.49 0 0.615-0.129 0.615-0.615v-14.769c0-0.486-0.125-0.615-0.615-0.615zM5.538 14.769l-4.328 0.051v-3.108l4.328-0.020v3.077zM5.538 10.462h-4.308v-3.077h4.308v3.077zM5.538 6.154h-4.308v-2.462h4.308v2.462zM11.692 14.769h-4.923v-3.077h4.923v3.077zM11.692 10.462h-4.923v-3.077h4.923v3.077zM11.692 6.154h-4.923v-2.462h4.923v2.462zM17.231 14.769h-4.308v-3.077h4.308v3.077zM17.231 10.462h-4.308v-3.077h4.308v3.077zM17.231 6.154h-4.308v-2.462h4.308v2.462z"></path>
+</svg>
+<svg id="icon-split" width="16" height="16" viewBox="0 0 16 16" x="0" y="924">
+<path fill="#8a8a8a" d="M14.222 12.412l-1.811 1.811h-1.022l2.833-2.833v1.022zM14.222 13.742v0.48h-0.48l0.48-0.48zM14.222 10.059l-4.164 4.164h-1.022l4.444-4.444h0.741v0.281zM12.15 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM9.796 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM7.444 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM5.091 9.778l-3.313 3.313v-1.012l2.3-2.3h1.013zM2.748 9.778l-0.97 0.97v-0.97h0.97zM14.222 3.078l-2.255 2.255h-1.022l3.277-3.277v1.022zM14.222 4.409v0.924h-0.924l0.924-0.924zM13.17 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM10.817 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM8.462 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM6.11 1.778l-3.556 3.556h-0.777v-0.244l3.311-3.311h1.022zM3.757 1.778l-1.98 1.98v-1.012l0.967-0.967h1.013zM0 7.111h16v0.889h-16v-0.889z"></path>
+</svg>
+<svg id="icon-face" width="16" height="16" viewBox="0 0 16 16" x="0" y="945">
+<path fill="#8a8a8a" d="M8 16c-4.417 0-8-3.58-8-7.993s3.583-8.007 8-8.007 8 3.594 8 8.007c0 4.413-3.583 7.993-8 7.993zM8 1c-3.865 0-7 3.145-7 7.006s3.135 6.994 7 6.994 7-3.132 7-6.994c0-3.861-3.135-7.006-7-7.006zM8 13c-2.419 0-4.436-1.718-4.899-4h1.041c0.446 1.722 1.997 3 3.859 3s3.412-1.278 3.858-3h1.041c-0.463 2.282-2.48 4-4.899 4zM11 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1zM5 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1z"></path>
+</svg>
+<svg id="icon-split-page" width="16" height="16" viewBox="0 0 16 16" x="0" y="966">
+<path fill="#8a8a8a" d="M14.25 1v4h-12.5v-4h1.042v3h10.417v-3zM1.75 15v-4h12.5v4h-1.041v-3h-10.417v3zM1 7h14v2h-14z"></path>
+</svg>
+<svg id="icon-anchor" width="16" height="16" viewBox="0 0 16 16" x="0" y="987">
+<path fill="#8a8a8a" d="M15.297 9.614l-1.117-1.117c-0.075-0.075-0.174-0.116-0.28-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l0.442-0.442c-0.107 1.281-0.667 2.486-1.579 3.399-0.925 0.925-2.149 1.487-3.45 1.583l-0-7.611 3.106-0c0.218 0 0.396-0.178 0.396-0.396s-0.178-0.396-0.396-0.396h-3.106v-4.407l2.781 2.781c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-3.434-3.434c-0.083-0.083-0.198-0.125-0.316-0.114-0.109-0.003-0.214 0.038-0.291 0.116l-3.434 3.434c-0.154 0.154-0.154 0.406 0 0.56 0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l2.781-2.781v4.405h-3.106c-0.218 0-0.396 0.178-0.396 0.396s0.178 0.396 0.396 0.396l3.106-0v7.613c-1.311-0.091-2.546-0.653-3.478-1.585-0.92-0.92-1.481-2.137-1.582-3.43l0.444 0.444c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-1.117-1.117c-0.075-0.075-0.174-0.116-0.279-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28 0.174 0.116 0.28 0.116c0.106 0 0.205-0.041 0.28-0.116l0.475-0.475c0.047 0.697 0.208 1.376 0.48 2.018 0.316 0.748 0.769 1.42 1.346 1.997s1.249 1.030 1.997 1.346c0.775 0.328 1.598 0.494 2.446 0.494s1.671-0.166 2.446-0.494c0.748-0.316 1.42-0.769 1.997-1.346s1.030-1.249 1.346-1.997c0.275-0.651 0.437-1.338 0.481-2.045l0.474 0.474c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116 0.116-0.174 0.116-0.28c0-0.106-0.041-0.205-0.116-0.28z"></path>
+</svg>
+<svg id="icon-link" width="16" height="16" viewBox="0 0 16 16" x="0" y="1008">
+<path fill="#8a8a8a" d="M8.369 12.831l-0.646-0.092s-0.431-0.092-0.646-0.185c-0.123-0.031-0.277 0-0.369 0.092l-0.154 0.154c-0.892 0.892-2.338 0.985-3.262 0.185-1.046-0.892-1.077-2.492-0.123-3.446l2.338-2.338c0.308-0.308 0.677-0.492 1.046-0.615 0.492-0.123 1.015-0.092 1.477 0.092 0.277 0.123 0.554 0.277 0.8 0.523 0.123 0.123 0.215 0.246 0.308 0.4 0.123 0.215 0.4 0.246 0.554 0.062l0.862-0.862c0.123-0.123 0.123-0.308 0.031-0.462-0.123-0.185-0.277-0.338-0.431-0.492-0.215-0.215-0.462-0.431-0.738-0.585-0.431-0.277-0.923-0.462-1.446-0.554-0.954-0.185-2-0.031-2.862 0.431-0.338 0.185-0.677 0.431-0.954 0.708l-2.246 2.246c-1.631 1.631-1.754 4.277-0.185 5.938 1.631 1.785 4.4 1.815 6.092 0.123l0.769-0.769c0.215-0.154 0.062-0.523-0.215-0.554zM14.031 1.785c-1.692-1.569-4.338-1.446-5.938 0.185l-0.708 0.677c-0.215 0.215-0.062 0.585 0.215 0.615 0.431 0.031 0.862 0.123 1.292 0.246 0.123 0.031 0.277 0 0.369-0.092l0.154-0.154c0.892-0.892 2.338-0.985 3.262-0.185 1.046 0.892 1.077 2.492 0.123 3.446l-2.338 2.338c-0.308 0.308-0.677 0.492-1.046 0.615-0.492 0.123-1.015 0.092-1.477-0.092-0.277-0.123-0.554-0.277-0.8-0.523-0.123-0.123-0.215-0.246-0.308-0.4-0.123-0.215-0.4-0.246-0.554-0.062l-0.862 0.862c-0.123 0.123-0.123 0.308-0.031 0.462 0.123 0.185 0.277 0.338 0.431 0.492 0.215 0.215 0.492 0.431 0.738 0.585 0.431 0.277 0.923 0.462 1.415 0.554 0.954 0.185 2 0.031 2.862-0.431 0.338-0.185 0.677-0.431 0.954-0.708l2.338-2.338c1.723-1.692 1.662-4.462-0.092-6.092z"></path>
+</svg>
+<svg id="icon-unlink" width="16" height="16" viewBox="0 0 16 16" x="0" y="1029">
+<path fill="#8a8a8a" d="M7.385 11.262c-0.185 0-0.369-0.031-0.554-0.092-0.185-0.031-0.4-0.092-0.585-0.154-0.123-0.031-0.246 0-0.308 0.062l-0.123 0.123c-0.769 0.769-2.031 0.862-2.862 0.154-0.892-0.8-0.954-2.185-0.092-3.015l2.031-2.031c0.277-0.277 0.585-0.431 0.923-0.523 0.431-0.123 0.892-0.092 1.292 0.092 0.246 0.092 0.492 0.246 0.677 0.462 0.092 0.092 0.185 0.215 0.277 0.369 0.092 0.185 0.338 0.215 0.492 0.062l0.769-0.769c0.123-0.123 0.123-0.277 0.031-0.4-0.123-0.154-0.246-0.277-0.369-0.431-0.185-0.185-0.431-0.369-0.646-0.523-0.4-0.246-0.8-0.4-1.262-0.492-0.831-0.154-1.723-0.031-2.523 0.4-0.308 0.154-0.585 0.369-0.831 0.615l-1.969 1.969c-1.415 1.415-1.538 3.723-0.154 5.2 1.446 1.538 3.877 1.6 5.354 0.092l0.677-0.677c0.154-0.154 0.031-0.462-0.246-0.492zM12.462 6.923c1.477-1.477 1.446-3.908-0.092-5.354-1.477-1.354-3.785-1.262-5.2 0.154l-0.615 0.615c-0.185 0.185-0.062 0.492 0.185 0.523 0.369 0.031 0.769 0.092 1.138 0.215 0.123 0.031 0.246 0 0.308-0.062l0.123-0.123c0.769-0.769 2.031-0.862 2.862-0.154 0.892 0.8 0.954 2.185 0.092 3.015l-2.031 2.031c-0.277 0.277-0.585 0.431-0.923 0.523-0.431 0.123-0.892 0.092-1.292-0.092-0.246-0.092-0.492-0.246-0.677-0.462-0.092-0.092-0.185-0.215-0.246-0.338-0.092-0.185-0.338-0.215-0.492-0.062l-0.738 0.738c-0.123 0.123-0.123 0.277-0.031 0.4 0.123 0.154 0.215 0.277 0.369 0.431 0.215 0.215 0.431 0.369 0.646 0.523 0.4 0.246 0.8 0.4 1.262 0.492 0.831 0.154 1.723 0.031 2.523-0.4 0.308-0.154 0.585-0.369 0.831-0.615l2-2zM13.877 12.615l1.415-1.415c0.123-0.123 0.123-0.308 0-0.431l-0.862-0.862c-0.123-0.123-0.308-0.123-0.431 0l-1.385 1.446-1.323-1.323c-0.123-0.123-0.308-0.123-0.431 0l-0.862 0.862c-0.123 0.123-0.123 0.308 0 0.431l1.323 1.323-1.292 1.292c-0.123 0.123-0.123 0.308 0 0.431l0.862 0.862c0.123 0.123 0.308 0.123 0.431 0l1.292-1.292 1.385 1.385c0.123 0.123 0.308 0.123 0.431 0l0.862-0.862c0.123-0.123 0.123-0.308 0-0.431l-1.415-1.415z"></path>
+</svg>
+<svg id="icon-baidu-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1050">
+<path fill="#8a8a8a" d="M9.473 10.846c0.725-0.156 0.626-1.022 0.605-1.211-0.035-0.292-0.379-0.802-0.845-0.762-0.587 0.053-0.672 0.9-0.672 0.9-0.080 0.392 0.189 1.229 0.913 1.073zM10.243 12.353c-0.021 0.061-0.069 0.217-0.027 0.352 0.081 0.305 0.345 0.318 0.345 0.318h0.379v-0.928h-0.407c-0.183 0.055-0.271 0.197-0.291 0.258zM10.819 9.393c0.401 0 0.724-0.461 0.724-1.031s-0.323-1.030-0.724-1.030c-0.399 0-0.724 0.461-0.724 1.030s0.324 1.031 0.724 1.031zM12.543 9.461c0.535 0.069 0.879-0.501 0.947-0.935 0.070-0.432-0.275-0.935-0.654-1.021-0.379-0.087-0.853 0.521-0.897 0.917-0.052 0.485 0.069 0.969 0.603 1.038zM13.854 12.006s-0.828-0.641-1.311-1.333c-0.655-1.021-1.586-0.605-1.897-0.086-0.31 0.519-0.793 0.847-0.861 0.935-0.069 0.085-1 0.588-0.793 1.505s0.932 0.899 0.932 0.899 0.535 0.053 1.155-0.086c0.621-0.137 1.155 0.035 1.155 0.035s1.449 0.485 1.846-0.449c0.396-0.935-0.224-1.42-0.224-1.42zM11.374 13.397h-0.942c-0.407-0.081-0.569-0.359-0.589-0.406s-0.135-0.271-0.075-0.651c0.176-0.569 0.677-0.61 0.677-0.61h0.501v-0.617l0.427 0.007v2.277zM13.129 13.39h-1.084c-0.42-0.108-0.44-0.407-0.44-0.407v-1.199l0.44-0.007v1.078c0.027 0.115 0.169 0.136 0.169 0.136h0.447v-1.206h0.468v1.605zM14.664 10.189c0-0.207-0.172-0.831-0.81-0.831s-0.725 0.589-0.725 1.005c0 0.397 0.033 0.951 0.827 0.933s0.707-0.899 0.707-1.107zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l0.052-0.111c-0.201-0.083-0.385-0.213-0.533-0.393-0.345-0.423-0.433-0.979-0.368-1.358 0.062-0.522 0.394-1.388 1.275-1.467 0.032-0.003 0.069-0.005 0.106-0.005 0.001 0 0.002 0 0.003 0h-0c0.051 0 0.1 0.003 0.149 0.009 0.061-0.878 0.647-1.546 1.386-1.546 0.072 0 0.14 0.015 0.208 0.027l0.092-0.195c0.143-0.304 0.215-0.692 0.215-1.165 0-0.92-0.325-1.706-0.977-2.357s-1.437-0.977-2.357-0.977-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM8.734 14h-7.401l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h5.811c0.083 0.274 0.202 0.494 0.344 0.667z"></path>
+</svg>
+<svg id="icon-google-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1071">
+<path fill="#8a8a8a" d="M10.813 8.519c0 0.622 0.208 1.071 0.618 1.335 0.335 0.216 0.725 0.249 0.927 0.249 0.049 0 0.089-0.002 0.116-0.004 0 0-0.064 0.418 0.246 0.832h-0.014c-0.537 0-2.289 0.112-2.289 1.553 0 1.465 1.609 1.54 1.932 1.54 0.025 0 0.040-0.001 0.040-0.001 0.003 0 0.027 0.001 0.066 0.001 0.207 0 0.743-0.026 1.24-0.268 0.645-0.313 0.972-0.858 0.972-1.619 0-0.735-0.499-1.173-0.863-1.493-0.222-0.195-0.414-0.363-0.414-0.527 0-0.167 0.14-0.292 0.317-0.451 0.287-0.257 0.557-0.622 0.557-1.313 0-0.607-0.079-1.015-0.564-1.273 0.051-0.026 0.229-0.045 0.318-0.057 0.263-0.036 0.647-0.077 0.647-0.291v-0.041h-1.916c-0.019-0.001-1.937 0.071-1.937 1.827zM13.906 12.274c0.037 0.586-0.465 1.019-1.217 1.073-0.765 0.056-1.394-0.288-1.431-0.873-0.018-0.281 0.106-0.557 0.348-0.777 0.245-0.223 0.583-0.359 0.949-0.387 0.043-0.003 0.086-0.005 0.129-0.005 0.707 0 1.187 0.416 1.221 0.968zM13.405 8.118c0.188 0.661-0.096 1.353-0.548 1.48-0.048 0.014-0.103 0.022-0.16 0.022-0 0-0 0-0 0h0c-0.415 0-0.825-0.419-0.977-0.997-0.085-0.325-0.078-0.608 0.019-0.881 0.096-0.268 0.268-0.449 0.485-0.511 0.048-0.014 0.103-0.022 0.16-0.022 0 0 0 0 0 0h-0c0.501 0 0.823 0.207 1.021 0.908zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l1.275-2.711c-0.009-0.099-0.017-0.199-0.017-0.308 0-1.052 0.509-1.742 1.153-2.151 0.109-0.284 0.174-0.621 0.174-1.034 0-0.92-0.325-1.706-0.977-2.357-0.651-0.652-1.437-0.977-2.357-0.977s-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM9.895 10.667l0.313-0.667h0.225c0.137 0.189 0.299 0.35 0.483 0.48l0.006 0.004c-0.115 0.055-0.221 0.116-0.322 0.182h-0.705zM10.184 14h-8.851l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h7.195c0.099 0.255 0.235 0.479 0.411 0.667z"></path>
+</svg>
+<svg id="icon-about" width="16" height="16" viewBox="0 0 16 16" x="0" y="1092">
+<path fill="#8a8a8a" d="M8.011 0.991c-3.868 0-7.003 3.135-7.003 7.003s3.135 7.003 7.003 7.003 7.003-3.136 7.003-7.003c0-3.868-3.135-7.003-7.003-7.003zM7.984 11.487c-0.399 0-0.723-0.333-0.723-0.743s0.324-0.743 0.723-0.743c0.399 0 0.723 0.333 0.723 0.743s-0.324 0.743-0.723 0.743zM10.003 6.816c-0.1 0.192-0.218 0.357-0.355 0.496s-0.384 0.374-0.739 0.704c-0.098 0.093-0.177 0.174-0.236 0.245s-0.103 0.134-0.132 0.193c-0.026 0.050-0.049 0.108-0.066 0.168l-0.002 0.007c-0.016 0.059-0.040 0.161-0.072 0.308-0.055 0.312-0.227 0.467-0.516 0.467-0.15 0-0.277-0.051-0.379-0.153s-0.154-0.253-0.154-0.454c0-0.251 0.037-0.47 0.113-0.654s0.175-0.347 0.299-0.486c0.124-0.139 0.292-0.305 0.503-0.497 0.185-0.168 0.319-0.294 0.401-0.38 0.080-0.083 0.149-0.176 0.205-0.279l0.003-0.007c0.056-0.105 0.085-0.219 0.085-0.341 0-0.24-0.086-0.442-0.258-0.607s-0.394-0.247-0.666-0.247c-0.318 0-0.552 0.083-0.702 0.25s-0.277 0.411-0.382 0.735c-0.098 0.339-0.285 0.508-0.559 0.508-0.162 0-0.298-0.059-0.41-0.178s-0.167-0.247-0.167-0.384c0-0.285 0.088-0.573 0.264-0.866s0.434-0.534 0.772-0.726c0.338-0.192 0.733-0.288 1.183-0.288 0.419 0 0.789 0.080 1.11 0.24s0.569 0.378 0.743 0.654c0.175 0.276 0.262 0.576 0.262 0.899 0 0.255-0.050 0.478-0.15 0.67z"></path>
+</svg>
+<svg id="icon-blockquote" width="16" height="16" viewBox="0 0 16 16" x="0" y="1113">
+<path fill="#8a8a8a" d="M13.631 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8zM6 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8z"></path>
+</svg>
+<svg id="icon-table-attr" width="16" height="16" viewBox="0 0 16 16" x="0" y="1134">
+<path fill="#8a8a8a" d="M15.204 1.055h-14.364c-0.41 0-0.743 0.333-0.743 0.743v12.383c0 0.41 0.333 0.743 0.743 0.743h14.364c0.41 0 0.743-0.333 0.743-0.743v-12.383c0-0.41-0.333-0.743-0.743-0.743l-0-0zM15.204 4.027v2.903h-4.293v-2.903h4.293zM5.875 10.563v-2.889h4.293v2.889h-4.293zM10.168 11.306v2.875h-4.293v-2.875h4.293zM5.132 10.563h-4.293v-2.889h4.293v2.889zM10.168 4.027v2.903h-4.293v-2.903h4.293zM10.911 7.674h4.293v2.889h-4.293v-2.889zM6.040 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM3.811 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 4.027h3.55v2.903h-4.293l0-2.903h0.743zM0.839 11.306h4.293v2.875h-4.293v-2.875zM10.911 14.181v-2.875h4.293v2.875h-4.293z"></path>
+</svg>
+<svg id="icon-insert-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1155">
+<path fill="#8a8a8a" d="M14 0h-2s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h2c0.552 0 1-0.448 1-1v-10c0-0.552-0.448-1-1-1zM14 11h-2v-3h2v3zM14 7h-2v-2h2v2zM14 4h-2v-3h2v3zM9 13l-2 3h5l-2-3h-1zM8 11v-10c0-0.552-0.448-1-1-1h-5s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h5c0.552 0 1-0.448 1-1zM7 7h-2v-2h2v2zM7 1v3h-2v-3h2zM4 11h-2v-3h2v3zM4 7h-2v-2h2v2zM4 4h-2v-3h2v3zM5 8h2v3h-2v-3z"></path>
+</svg>
+<svg id="icon-insert-row" width="18" height="16" viewBox="0 0 18 16" x="0" y="1176">
+<path fill="#8a8a8a" d="M17.143 16h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143zM9.143 9.143h-3.429v2.286h3.429v-2.286zM9.143 12.571h-3.429v2.286h3.429v-2.286zM12.571 9.143h-2.286v2.286h2.286v-2.286zM12.571 12.571h-2.286v2.286h2.286v-2.286zM17.143 9.143h-3.429v2.286h3.429v-2.286zM13.714 12.571v2.286h3.429v-2.286h-3.429zM17.143 4.571h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143zM9.143 1.143h-3.429v2.286h3.429v-2.286zM12.571 1.143h-2.286v2.286h2.286v-2.286zM17.143 1.143h-3.429v2.286h3.429v-2.286zM0 3.429l3.429 2.286v1.143l-3.429 2.286v-5.714z"></path>
+</svg>
+<svg id="icon-merge-table" width="21" height="16" viewBox="0 0 21 16" x="0" y="1197">
+<path fill="#8a8a8a" d="M1.484 2.296c0-0.615 0.242-1.198 0.682-1.63 0.43-0.432 1.005-0.666 1.62-0.666h0.016l10.845 0.059c0.615 0 1.198 0.242 1.63 0.682s0.666 1.021 0.666 1.637l-0.059 10.845c0 0.615-0.242 1.198-0.682 1.63-0.432 0.432-1.007 0.666-1.622 0.666h-0.016l-10.845-0.059c-0.615 0-1.198-0.242-1.63-0.682s-0.666-1.023-0.666-1.639l0.061-10.843zM6.199 1.048l-2.412-0.016c-0.333 0-0.65 0.134-0.897 0.374-0.242 0.242-0.374 0.556-0.374 0.897l-0.016 2.461h3.7v-3.716zM10.98 1.072l-3.742-0.024v3.718h3.742v-3.693zM12.020 14.463l2.552 0.016c0.341 0 0.658-0.124 0.897-0.365 0.242-0.242 0.374-0.556 0.374-0.897l0.016-2.579h-3.842v3.825zM12.020 9.598h3.844l0.016-3.793h-3.868v3.793h0.008zM12.020 4.765h3.868l0.016-2.396c0-0.333-0.124-0.658-0.365-0.897-0.242-0.242-0.556-0.374-0.897-0.374l-2.619-0.016v3.683z"></path>
+<path fill="#8a8a8a" d="M5.005 1.478c0.008 0 0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-merge-td" width="16" height="16" viewBox="0 0 16 16" x="0" y="1218">
+<path fill="#8a8a8a" d="M11.371 9.493h2.837v-2.987h-12.416v2.987h9.579zM0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333z"></path>
+</svg>
+<svg id="icon-remove-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1239">
+<path fill="#8a8a8a" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM7 12h1v1h-1s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h5c0.552 0 1 0.448 1 1v7h-1v-3h-2v3h-1v-3h-2v3h1v1h-1v3zM10 4h2v-3h-2v3zM9 4v-3h-2v3h2zM1 13s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h2c0.552 0 1 0.448 1 1v12h-3zM3 1h-2v3h2v-3zM3 5h-2v3h2v-3zM3 9h-2v3h2v-3z"></path>
+</svg>
+<svg id="icon-remove-row" width="16" height="16" viewBox="0 0 16 16" x="0" y="1260">
+<path fill="#8a8a8a" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM9 8h-4v2h1.667l0.333 1h-2v2h2.667l0.333 1h-7c-0.552 0-1-0.448-1-1v-5s0.448-1 1-1h12v1h-4zM4 8h-3v2h3v-2zM4 11h-3v2h3v-2zM1 4c-0.552 0-1-0.448-1-1v-2s0.448-1 1-1h11c0.552 0 1 0.448 1 1v3h-12zM4 1h-3v2h3v-2zM8 1h-3v2h3v-2zM12 1h-3v2h3v-2z"></path>
+</svg>
+<svg id="icon-remove-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="1281">
+<path fill="#8a8a8a" d="M14.857 16v-3.429l3.429-2.286v3.429l-3.429 2.286zM8 11.429l4.571-3.429h5.714l-4.571 3.429h-5.714zM13.714 4.571h-3.429v3.429h-4.571v2.286h1.143v1.143h-5.714c-0.631 0-1.143-0.512-1.143-1.143v-9.143c0-0.631 0.512-1.143 1.143-1.143h12.571c0.631 0 1.143 0.512 1.143 1.143v5.714h-1.143v-2.286zM4.571 1.143h-3.429v2.286h3.429v-2.286zM4.571 4.571h-3.429v2.286h3.429v-2.286zM4.571 8h-3.429v2.286h3.429v-2.286zM9.143 1.143h-3.429v2.286h3.429v-2.286zM9.143 4.571h-3.429v2.286h3.429v-2.286zM13.714 1.143h-3.429v2.286h3.429v-2.286zM13.714 16h-5.714v-3.429h5.714v3.429z"></path>
+</svg>
+<svg id="icon-insert-col2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1302">
+<path fill="#8a8a8a" d="M2 16h2s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v10c0 0.552 0.448 1 1 1zM2 5h2v3h-2v-3zM2 9h2v2h-2v-2zM2 12h2v3h-2v-3zM7 3l2-3h-5l2 3h1zM8 5v10c0 0.552 0.448 1 1 1h5s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-5c-0.552 0-1 0.448-1 1zM9 9h2v2h-2v-2zM9 15v-3h2v3h-2zM12 5h2v3h-2v-3zM12 9h2v2h-2v-2zM12 12h2v3h-2v-3zM11 8h-2v-3h2v3z"></path>
+</svg>
+<svg id="icon-insert-row2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1323">
+<path fill="#8a8a8a" d="M1.154 0h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143zM9.154 6.857h3.429v-2.286h-3.429v2.286zM9.154 3.429h3.429v-2.286h-3.429v2.286zM5.725 6.857h2.286v-2.286h-2.286v2.286zM5.725 3.429h2.286v-2.286h-2.286v2.286zM1.154 6.857h3.429v-2.286h-3.429v2.286zM4.583 3.429v-2.286h-3.429v2.286h3.429zM1.154 11.429h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143zM9.154 14.857h3.429v-2.286h-3.429v2.286zM5.725 14.857h2.286v-2.286h-2.286v2.286zM1.154 14.857h3.429v-2.286h-3.429v2.286zM18.297 12.571l-3.429-2.286v-1.143l3.429-2.286v5.714z"></path>
+</svg>
+<svg id="icon-split-table" width="16" height="16" viewBox="0 0 16 16" x="0" y="1344">
+<path fill="#8a8a8a" d="M0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333zM10.667 9.493v-2.987h-1.792v2.987h1.792zM14.208 9.493v-2.987h-1.792v2.987h1.792zM3.584 9.493v-2.987h-1.792v2.987h1.792zM7.125 9.493v-2.987h-1.792v2.987h1.792z"></path>
+</svg>
+<svg id="icon-merge-table2" width="21" height="16" viewBox="0 0 21 16" x="0" y="1365">
+<path fill="#8a8a8a" d="M19.297 2.296c0-0.615-0.242-1.198-0.682-1.63-0.43-0.432-1.005-0.666-1.62-0.666h-0.016l-10.845 0.059c-0.615 0-1.198 0.242-1.63 0.682s-0.666 1.021-0.666 1.637l0.059 10.845c0 0.615 0.242 1.198 0.682 1.63 0.432 0.432 1.007 0.666 1.622 0.666h0.016l10.845-0.059c0.615 0 1.198-0.242 1.63-0.682s0.666-1.023 0.666-1.639l-0.061-10.843zM14.583 1.048l2.412-0.016c0.333 0 0.65 0.134 0.897 0.374 0.242 0.242 0.374 0.556 0.374 0.897l0.016 2.461h-3.7v-3.716zM9.801 1.072l3.742-0.024v3.718h-3.742v-3.693zM8.761 14.463l-2.552 0.016c-0.341 0-0.658-0.124-0.897-0.365-0.242-0.242-0.374-0.556-0.374-0.897l-0.016-2.579h3.842v3.825zM8.761 9.598h-3.844l-0.016-3.793h3.868v3.793h-0.008zM8.761 4.765h-3.868l-0.016-2.396c0-0.333 0.124-0.658 0.365-0.897 0.242-0.242 0.556-0.374 0.897-0.374l2.619-0.016v3.683z"></path>
+<path fill="#8a8a8a" d="M15.777 1.478c-0.008 0-0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-remove2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1386">
+<path fill="#8a8a8a" d="M6.214 13.804c0.401 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726zM15.299 1.464h-6.178v-0.726c0-0.401-0.325-0.726-0.727-0.726h-0.727c-0.401 0-0.727 0.325-0.727 0.726v0.726h-6.177c-0.008-0-0.017-0-0.026-0-0.401 0-0.726 0.325-0.726 0.726s0.325 0.726 0.726 0.726c0.009 0 0.018-0 0.027-0.001l-0.001 0h1.090v11.615c0.001 0.802 0.651 1.452 1.453 1.452 0 0 0.001 0 0.001 0h9.448c0 0 0.001 0 0.001 0 0.802 0 1.452-0.65 1.453-1.452v-11.615h1.090c0.008 0 0.017 0 0.026 0 0.401 0 0.726-0.325 0.726-0.726s-0.325-0.726-0.726-0.726c-0.009 0-0.018 0-0.027 0l0.001-0zM12.755 13.804c0 0.401-0.325 0.726-0.727 0.726h-7.994c-0.401 0-0.727-0.325-0.727-0.726v-10.889h9.448v10.889zM9.847 13.804c0.402 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726z"></path>
+</svg>
+<svg id="icon-ok" width="16" height="16" viewBox="0 0 16 16" x="0" y="1407">
+<path fill="#8a8a8a" d="M8 16c-4.418 0-8-3.582-8-8s3.582-8 8-8c4.418 0 8 3.582 8 8s-3.582 8-8 8zM12.177 4.986l-4.894 4.894-3.364-3.365-0.918 0.918 4.282 4.283 5.811-5.812-0.917-0.918z"></path>
+</svg>
+<svg id="icon-remove" width="16" height="16" viewBox="0 0 16 16" x="0" y="1428">
+<path fill="#8a8a8a" d="M8 1c-3.867 0-7 3.133-7 7s3.133 7 7 7 7-3.133 7-7c0-3.867-3.133-7-7-7zM11.167 10.7c0.133 0.133 0.133 0.333 0 0.467s-0.333 0.133-0.467 0l-2.7-2.7-2.7 2.7c-0.133 0.133-0.333 0.133-0.467 0s-0.133-0.333 0-0.467l2.7-2.7-2.7-2.7c-0.133-0.133-0.133-0.333 0-0.467s0.333-0.133 0.467 0l2.7 2.7 2.7-2.7c0.133-0.133 0.333-0.133 0.467 0s0.133 0.333 0 0.467l-2.7 2.7 2.7 2.7z"></path>
+</svg>
+<svg id="icon-graft2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1449">
+<path fill="#8a8a8a" d="M11.658 0.504c0.216-0.218 0.516-0.354 0.848-0.354s0.631 0.135 0.847 0.354l1.664 1.664c0.217 0.217 0.351 0.517 0.351 0.848s-0.134 0.631-0.351 0.848l-9.336 9.336c-0.468 0.468-1.365 0.954-2.024 1.089l-3.048 0.625 0.625-3.048c0.133-0.65 0.62-1.557 1.088-2.025l9.336-9.336zM9.96 2.202l-0.848 0.849 3.358 3.359 0.849-0.849-3.359-3.359zM12.184 12.804c0.905-0.457 1.054-0.865 0.639-1.526-0.338-0.537-1.675-0.285-1.797 0.805-0.044 0.398 0.117 0.753 0.421 1.026 0.28-0.096 0.525-0.197 0.737-0.305zM13.063 13.682c-0.092 0.059-0.206 0.124-0.322 0.183l-0.025 0.012c-0.396 0.201-0.877 0.38-1.442 0.54-1.27 0.36-2.968 0.617-5.104 0.781-0.013 0.001-0.028 0.002-0.043 0.002-0.314 0-0.572-0.243-0.594-0.552l-0-0.002c-0.001-0.014-0.002-0.031-0.002-0.048 0-0.313 0.24-0.57 0.547-0.596l0.002-0c1.652-0.127 3.021-0.311 4.101-0.548 0.479-0.104 0.901-0.22 1.266-0.345 0.367 0.331 0.943 0.544 1.616 0.573 0.981 0.043 2.17-0.303 3.22-1.242 0.104-0.093 0.242-0.15 0.393-0.15 0.177 0 0.336 0.078 0.444 0.202l0.001 0.001c0.093 0.106 0.149 0.245 0.149 0.398 0 0.178-0.077 0.338-0.2 0.449l-0.001 0c-1.888 1.687-4.29 1.855-5.796 1.079-0.462-0.238-0.84-0.565-1.093-0.964-0.221-0.346-0.353-0.767-0.353-1.219 0-0.101 0.007-0.2 0.019-0.297l-0.001 0.011c0.25-2.25 3.058-2.78 3.979-1.315 0.752 1.197 0.45 2.291-0.762 3.048z"></path>
+</svg>
+<svg id="icon-func" width="17" height="16" viewBox="0 0 17 16" x="0" y="1470">
+<path fill="#8a8a8a" d="M0.531 15.51v-2.065h4.213c-1.236-0.919-2.162-1.924-2.78-3.018-0.582-1.007-0.926-2.215-0.926-3.503 0-0.014 0-0.029 0-0.043l-0 0.002c0-1.992 0.695-3.612 2.086-4.861 1.39-1.25 3.193-1.874 5.406-1.874 2.215 0 4.017 0.625 5.408 1.874s2.086 2.869 2.086 4.86c0 1.263-0.309 2.441-0.927 3.535s-1.544 2.103-2.78 3.028h4.213v2.065h-6.854v-2.065c1.012-0.756 1.772-1.663 2.278-2.72 0.506-1.056 0.76-2.263 0.76-3.62 0-1.519-0.373-2.715-1.12-3.59-0.745-0.874-1.767-1.31-3.063-1.31s-2.317 0.438-3.063 1.316c-0.746 0.877-1.119 2.076-1.119 3.595 0 1.356 0.253 2.562 0.76 3.615s1.265 1.958 2.278 2.714v2.065h-6.857z"></path>
+</svg>
+<svg id="icon-find" width="16" height="16" viewBox="0 0 16 16" x="0" y="1491">
+<path fill="#8a8a8a" d="M1 0h6v1h-6zM9 0h6v1h-6zM14.875 5h-0.875v-4h-4v4h-4v-4h-4v4h-0.875c-0.619 0-1.125 0.506-1.125 1.125v8.75c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-5.875h2v5.875c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-8.75c0-0.619-0.506-1.125-1.125-1.125zM5.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5zM8.5 8h-1c-0.275 0-0.5-0.225-0.5-0.5s0.225-0.5 0.5-0.5h1c0.275 0 0.5 0.225 0.5 0.5s-0.225 0.5-0.5 0.5zM14.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5z"></path>
+</svg>
+<svg id="icon-date" width="16" height="16" viewBox="0 0 16 16" x="0" y="1512">
+<path fill="#8a8a8a" d="M13.597 2.081h-0.584v2.837c0 0.603-0.489 1.093-1.093 1.093s-1.092-0.49-1.092-1.093v-2.837h-5.64v2.83c0 0.604-0.49 1.094-1.094 1.094-0.603 0-1.092-0.49-1.092-1.094v-2.83h-0.6c-0.775 0-1.402 0.628-1.402 1.402v3.070h14v-3.070c0-0.774-0.627-1.402-1.403-1.402zM4.927 4.612c0 0.463-0.376 0.837-0.837 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.375-0.837 0.837-0.837v0c0.461 0 0.837 0.374 0.837 0.837v2.76zM12.78 4.612c0 0.463-0.374 0.837-0.838 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.374-0.837 0.837-0.837v0c0.464 0 0.838 0.374 0.838 0.837v2.76zM14.182 7.133v5.608c0 0.774-0.627 1.401-1.401 1.401h-9.573c-0.774 0-1.401-0.627-1.401-1.401v-5.608h-0.807v6.45c0 0.774 0.627 1.403 1.403 1.403h11.193c0.776 0 1.403-0.629 1.403-1.403v-6.45h-0.817zM8.393 11.198h1.101c0.109 0.504 0.389 0.649 0.662 0.649 0.405 0 0.651-0.262 0.651-0.723 0-0.26-0.097-0.626-0.651-0.64h-0.351v-0.69h0.159c0.554-0.014 0.687-0.241 0.687-0.66 0-0.271-0.201-0.468-0.526-0.477-0.426-0.011-0.491 0.185-0.598 0.443l-1.031 0.002c0.239-0.793 0.793-1.196 1.661-1.21 1.052 0.028 1.597 0.453 1.635 1.274 0 0.403-0.232 0.708-0.692 0.909 0.589 0.202 0.885 0.563 0.885 1.080-0.037 0.865-0.646 1.319-1.827 1.362-0.998 0.001-1.599-0.483-1.765-1.319zM7.633 11.479v0.975h-3.543v-0.629c0.386-0.605 0.771-1.059 1.492-1.52 0.663-0.433 0.894-0.763 0.894-1.080 0-0.070 0.003-0.433-0.531-0.433-0.372 0.014-0.645 0.182-0.645 0.565l-1.128 0.007c0.065-1.087 0.95-1.473 1.856-1.473 1.032 0.043 1.586 0.482 1.66 1.317 0.037 0.563-0.28 1.101-1.148 1.634-0.48 0.287-0.523 0.319-0.817 0.636h1.91z"></path>
+</svg>
+<svg id="icon-clock" width="16" height="16" viewBox="0 0 16 16" x="0" y="1533">
+<path fill="#8a8a8a" d="M11.331 7.805h-2.732v-2.199c0-0.333-0.267-0.6-0.6-0.6s-0.6 0.267-0.6 0.6v2.932c0.067 0.267 0.267 0.466 0.533 0.466h3.398c0.333 0 0.6-0.267 0.6-0.6s-0.267-0.6-0.6-0.6zM13.53 3.074c-1.399-1.399-3.331-2.199-5.53-2.199-2.132 0-4.131 0.866-5.53 2.199-1.399 1.399-2.265 3.265-2.265 5.33s0.866 3.998 2.265 5.33c1.399 1.399 3.331 2.199 5.53 2.199 2.132 0 4.131-0.866 5.53-2.199 1.399-1.399 2.265-3.265 2.265-5.33s-0.866-3.998-2.265-5.33zM12.664 12.935c-1.199 1.133-2.865 1.866-4.664 1.866s-3.465-0.733-4.664-1.866c-1.199-1.133-1.932-2.732-1.932-4.531s0.733-3.398 1.932-4.531c1.199-1.133 2.865-1.866 4.664-1.866s3.465 0.733 4.664 1.866c1.199 1.133 1.932 2.798 1.932 4.531 0 1.799-0.733 3.398-1.932 4.531zM1.271 2.874l2.332-1.866c0.267-0.2 0.267-0.6 0.067-0.8-0.2-0.267-0.6-0.267-0.866-0.067l-2.332 1.866c-0.267 0.2-0.333 0.6-0.067 0.8 0.2 0.267 0.6 0.267 0.866 0.067zM14.729 2.874c0.267 0.2 0.666 0.133 0.866-0.067 0.2-0.267 0.133-0.6-0.067-0.8l-2.332-1.866c-0.267-0.2-0.666-0.133-0.866 0.067-0.2 0.267-0.2 0.6 0.067 0.8l2.332 1.866z"></path>
+</svg>
+</svg>
diff --git a/addons/nkeditor/assets/themes/primary/editor.css b/addons/nkeditor/assets/themes/primary/editor.css
new file mode 100644
index 0000000..33f3788
--- /dev/null
+++ b/addons/nkeditor/assets/themes/primary/editor.css
@@ -0,0 +1,822 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+.ke-container-primary .ke-toolbar {
+  border-top: 5px solid #009688;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  background-clip: padding-box;
+  text-rendering: optimizelegibility; }
+  .ke-container-primary .ke-toolbar .ke-toolbar-icon {
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-container-primary .ke-toolbar .ke-icon-source {
+    background-position: 0 0px; }
+  .ke-container-primary .ke-toolbar .ke-icon-preview {
+    background-position: 0 -63px; }
+  .ke-container-primary .ke-toolbar .ke-icon-print {
+    background-position: 0 -84px; }
+  .ke-container-primary .ke-toolbar .ke-icon-undo {
+    background-position: 0 -21px; }
+  .ke-container-primary .ke-toolbar .ke-icon-redo {
+    background-position: 0 -42px; }
+  .ke-container-primary .ke-toolbar .ke-icon-template {
+    background-position: 0 -105px; }
+  .ke-container-primary .ke-toolbar .ke-icon-cut {
+    background-position: 0 -147px; }
+  .ke-container-primary .ke-toolbar .ke-icon-copy {
+    background-position: 0 -168px; }
+  .ke-container-primary .ke-toolbar .ke-icon-paste {
+    background-position: 0 -189px; }
+  .ke-container-primary .ke-toolbar .ke-icon-selectall {
+    background-position: 0 -483px; }
+  .ke-container-primary .ke-toolbar .ke-icon-justifyleft {
+    background-position: 0 -252px; }
+  .ke-container-primary .ke-toolbar .ke-icon-justifycenter {
+    background-position: 0 -273px; }
+  .ke-container-primary .ke-toolbar .ke-icon-justifyright {
+    background-position: 0 -294px; }
+  .ke-container-primary .ke-toolbar .ke-icon-justifyfull {
+    background-position: 0 -315px; }
+  .ke-container-primary .ke-toolbar .ke-icon-insertorderedlist {
+    background-position: 0 -336px; }
+  .ke-container-primary .ke-toolbar .ke-icon-insertunorderedlist {
+    background-position: 0 -357px; }
+  .ke-container-primary .ke-toolbar .ke-icon-indent {
+    background-position: 0 -378px; }
+  .ke-container-primary .ke-toolbar .ke-icon-outdent {
+    background-position: 0 -399px; }
+  .ke-container-primary .ke-toolbar .ke-icon-subscript {
+    background-position: 0 -420px; }
+  .ke-container-primary .ke-toolbar .ke-icon-superscript {
+    background-position: 0 -441px; }
+  .ke-container-primary .ke-toolbar .ke-icon-date {
+    background-position: 0px -304px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-time {
+    background-position: 0px -320px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-formatblock {
+    background-position: 0 -546px; }
+  .ke-container-primary .ke-toolbar .ke-icon-fontname {
+    background-position: 0 -567px; }
+  .ke-container-primary .ke-toolbar .ke-icon-fontsize {
+    background-position: 0 -588px; }
+  .ke-container-primary .ke-toolbar .ke-icon-forecolor {
+    background-position: 0 -609px; }
+  .ke-container-primary .ke-toolbar .ke-icon-hilitecolor {
+    background-position: 0 -630px; }
+  .ke-container-primary .ke-toolbar .ke-icon-bold {
+    background-position: 0 -651px; }
+  .ke-container-primary .ke-toolbar .ke-icon-italic {
+    background-position: 0 -672px; }
+  .ke-container-primary .ke-toolbar .ke-icon-underline {
+    background-position: 0 -693px; }
+  .ke-container-primary .ke-toolbar .ke-icon-strikethrough {
+    background-position: 0 -714px; }
+  .ke-container-primary .ke-toolbar .ke-icon-removeformat {
+    background-position: 0 -756px; }
+  .ke-container-primary .ke-toolbar .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-container-primary .ke-toolbar .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-container-primary .ke-toolbar .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-container-primary .ke-toolbar .ke-icon-div {
+    background-position: 0px -544px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-formula {
+    background-position: 0px -576px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-hr {
+    background-position: 0 -924px; }
+  .ke-container-primary .ke-toolbar .ke-icon-emoticons {
+    background-position: 0 -945px; }
+  .ke-container-primary .ke-toolbar .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-container-primary .ke-toolbar .ke-icon-unlink {
+    background-position: 0 -1029px; }
+  .ke-container-primary .ke-toolbar .ke-icon-fullscreen {
+    background-position: 0 -525px; }
+  .ke-container-primary .ke-toolbar .ke-icon-about {
+    background-position: 0 -1092px; }
+  .ke-container-primary .ke-toolbar .ke-icon-quote {
+    background-position: 0 -1114px; }
+  .ke-container-primary .ke-toolbar .ke-icon-plainpaste {
+    background-position: 0 -210px; }
+  .ke-container-primary .ke-toolbar .ke-icon-wordpaste {
+    background-position: 0 -231px; }
+  .ke-container-primary .ke-toolbar .ke-icon-table {
+    background-position: 0px -903px;
+    width: 18px !important; }
+  .ke-container-primary .ke-toolbar .ke-icon-tablemenu {
+    background-position: 0px -768px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-code {
+    background-position: 0 -126px; }
+  .ke-container-primary .ke-toolbar .ke-icon-map {
+    background-position: 0px -976px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-baidumap {
+    background-position: 0 -1050px; }
+  .ke-container-primary .ke-toolbar .ke-icon-lineheight {
+    background-position: 0 -735px; }
+  .ke-container-primary .ke-toolbar .ke-icon-clearhtml {
+    background-position: 0 -462px; }
+  .ke-container-primary .ke-toolbar .ke-icon-pagebreak {
+    background-position: 0 -966px; }
+  .ke-container-primary .ke-toolbar .ke-icon-insertfile {
+    background-position: 0 -882px; }
+  .ke-container-primary .ke-toolbar .ke-icon-quickformat {
+    background-position: 0 -504px; }
+  .ke-container-primary .ke-toolbar .ke-icon-anchor {
+    background-position: 0 -987px; }
+  .ke-container-primary .ke-toolbar .ke-icon-search {
+    background-position: 0px -1184px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-new {
+    background-position: 0px -1200px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-specialchar {
+    background-position: 0px -1216px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-multiimage {
+    background-position: 0 -798px; }
+  .ke-container-primary .ke-toolbar .ke-icon-graft {
+    background-position: 0 -819px; }
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-primary .ke-menu-item .ke-menu-item-left {
+  width: 27px;
+  text-align: center;
+  overflow: hidden; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert {
+    background-position: 0 -903px;
+    width: 18px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete {
+    background-position: 0 -1428px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft {
+    background-position: 0 -1176px;
+    width: 18px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright {
+    background-position: 0 -1323px;
+    width: 18px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove {
+    background-position: 0 -1302px;
+    width: 22px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow {
+    background-position: 0 -1155px;
+    width: 22px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete {
+    background-position: 0 -1239px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete {
+    background-position: 0 -1260px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop {
+    background-position: 0 -1218px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tableprop {
+    background-position: 0 -1134px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit {
+    background-position: 0px -1088px;
+    width: 16px;
+    height: 16px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge {
+    background-position: -1px -1197px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge {
+    background-position: -4px -1365px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-checked {
+    background-position: 0 -1407px; }
+
+/*# sourceMappingURL=editor.css.map */
diff --git a/addons/nkeditor/assets/themes/primary/editor.css.map b/addons/nkeditor/assets/themes/primary/editor.css.map
new file mode 100644
index 0000000..268b7c7
--- /dev/null
+++ b/addons/nkeditor/assets/themes/primary/editor.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": ";AAgCA;;EAEE;AAEF,YAAa;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;;AAEf,kBAAmB;EACf,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,CAAC;EACZ,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,CAAC;EACd,UAAU,EAAE,MAAM;;AAGtB,YAAa;EACT,SAAS,EAAE,MAAM;EACjB,kBAAkB,EAAE,IAAI;EACxB,mBAAmB,EAAE,IAAI;;AAE7B,iBAQC;EAPG,IAAK;IACD,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,sBAAsB;EAErC,GAAI;IACA,OAAO,EAAE,CAAC;AAKlB,eAAgB;EACZ,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,iBAAiB;EACzB,OAAO,EAAE,GAAG;;AAEhB,eAAgB;EACZ,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,iBAAiB;EACzB,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,MAAM;EACf,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,CAAC;EACN,QAAQ,EAAE,QAAQ;;AAGtB;;GAEG;AACH,aAAc;EAEV,OAAO,EAAE,KAAK;EAEd,gBAAgB,EAAE,IAAI;EACtB,QAAQ,EAAE,MAAM;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,gEAA0D;EAEtE;;KAEG;EAcH;;KAEG;EA0DH;;KAEG;EAwBH;;KAEG;EArGH,wBAAW;IAvEX,UAAU,EAAE,mBAAmB;IAC/B,eAAe,EAAE,mBAAmB;IACpC,kBAAkB,EAAE,mBAAmB;IACvC,MAAM,EAAE,oFAAoF;IAsExF,gBAAgB,EAAE,OAAO;EAG7B;;;kCAGmB;IACf,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,IAAI;EAMzB,yBAAY;IAER,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,OAAO;IAEhB,qCAAY;MAER,OAAO,EAAE,QAAQ;MACjB,SAAS,EAAE,CAAC;MACZ,WAAW,EAAE,CAAC;MACd,MAAM,EAAE,OAAO;MACf,OAAO,EAAE,KAAK;MACd,KAAK,EAAE,IAAI;MAEX;;SAEG;MACH,sDAAiB;QApHzB,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,OAAO;IAoHX,gCAAO;MACH,UAAU,EAAE,OAAO;IAEvB,sCAAa;MACT,gBAAgB,EAAE,OAAO;IAE7B,sCAAa;MACT,MAAM,EAAE,OAAO;IAEnB,uCAAc;MACV,MAAM,EAAE,IAAI;MACZ,MAAM,EAAE,OAAO;MACf,WAAW,EAAE,iBAAiB;MAC9B,YAAY,EAAE,iBAAiB;MAC/B,UAAU,EAAE,CAAC;MACb,aAAa,EAAE,CAAC;MAChB,KAAK,EAAE,CAAC;MACR,SAAS,EAAE,CAAC;MACZ,WAAW,EAAE,CAAC;MACd,QAAQ,EAAE,MAAM;MAChB,OAAO,EAAE,KAAK;MACd,KAAK,EAAE,IAAI;IAEf,gCAAO;MACH,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,GAAG;MACX,KAAK,EAAE,sBAAsB;MAC7B,UAAU,EAAE,OAAO;EAQ3B,sBAAS;IACL,OAAO,EAAE,CAAC;IAEV;4CACkB;MACd,MAAM,EAAE,CAAC;MACT,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,CAAC;MACV,QAAQ,EAAE,IAAI;IAElB,wCAAkB;MACd,IAAI,EAAE,4FAA4F;MAClG,KAAK,EAAE,IAAI;MACX,QAAQ,EAAE,IAAI;MACd,MAAM,EAAE,IAAI;MAEZ,8CAAQ;QACJ,OAAO,EAAE,IAAI;EASzB,2BAAc;IACV,QAAQ,EAAE,QAAQ;IAClB,gBAAgB,EAAE,OAAO;IACzB,UAAU,EAvMG,iBAAiB;IAwM9B,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,IAAI;IAEb,qDAA0B;MACtB,mBAAmB,EAAE,WAAW;MAChC,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,IAAI;IAGhB,oDAAyB;MACrB,QAAQ,EAAE,QAAQ;MAClB,KAAK,EAAE,CAAC;MACR,MAAM,EAAE,CAAC;MACT,MAAM,EAAE,SAAS;MACjB,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,IAAI;;AAMxB;;OAEO;AACP,QAAS;EACL,MAAM,EArOW,iBAAiB;EAsOlC,gBAAgB,EArOL,OAAO;EAsOlB,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,GAAG;EACZ,WAAW,EAAE,wCAAwC;EACrD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,MAAM;EAgEhB;;KAEG;EAhEH,sBAAc;IACV,MAAM,EAAE,iBAAiB;IACzB,gBAAgB,EAAE,OAAO;IACzB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,OAAO;IAEf,uCAAiB;MAlPrB,OAAO,EAAE,iBAAiB;MAC1B,OAAO,EAAE,YAAY;MACrB,cAAc,EAAE,MAAM;MACtB,IAAI,EAAE,CAAC;MACP,QAAQ,EAAE,MAAM;MAiPR,wDAAiB;QArPzB,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,MAAM;QACtB,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,MAAM;IAsPZ,yCAAmB;MACf,KAAK,EAAE,IAAI;MACX,UAAU,EAAE,MAAM;MAClB,QAAQ,EAAE,MAAM;IAKpB,2CAAqB;MACjB,KAAK,EAAE,CAAC;MACR,MAAM,EAAE,IAAI;MACZ,WAAW,EAAE,iBAAiB;MAC9B,YAAY,EAAE,iBAAiB;MAC/B,UAAU,EAAE,CAAC;MACb,aAAa,EAAE,CAAC;IAGpB,8CAAwB;MACpB,WAAW,EAAE,iBAAiB;MAC9B,YAAY,EAAE,iBAAiB;IAGnC,0CAAoB;MAChB,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,SAAS;MAClB,WAAW,EAAE,IAAI;MACjB,UAAU,EAAE,IAAI;MAChB,QAAQ,EAAE,MAAM;IAGpB,yCAAmB;MACf,MAAM,EAAE,KAAK;MACb,MAAM,EAAE,CAAC;MACT,QAAQ,EAAE,MAAM;MAChB,UAAU,EAjSD,iBAAiB;MAkS1B,aAAa,EAAE,iBAAiB;MAChC,WAAW,EAAE,CAAC;MACd,YAAY,EAAE,CAAC;EAIvB,yBAAiB;IACb,MAAM,EAAE,iBAAiB;IACzB,gBAAgB,EAAE,OAAO;EAM7B,6BAAqB;IACjB,QAAQ,EAAE,QAAQ;IAElB,yCAAY;MACR,QAAQ,EAAE,QAAQ;MAClB,UAAU,EAAE,MAAM;MAClB,MAAM,EAAE,GAAG;MACX,OAAO,EAAE,IAAI;MACb,GAAG,EAAE,CAAC;MACN,MAAM,EAAE,iBAAiB;MACzB,gBAAgB,EAAE,OAAO;MACzB,OAAO,EAAE,IAAI;MAEb,yDAAgB;QACZ,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IAIlB,uCAAU;MACN,MAAM,EAAE,CAAC;MACT,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,CAAC;MACV,eAAe,EAAE,QAAQ;MAEzB,gDAAS;QACL,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,GAAG;QACZ,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,OAAO;QAEf,wDAAQ;UACJ,OAAO,EAAE,KAAK;UACd,iBAAiB,EAAE,SAAS;UAC5B,QAAQ,EAAE,MAAM;UAChB,MAAM,EAAE,GAAG;UACX,KAAK,EAAE,IAAI;UACX,MAAM,EAAE,IAAI;UACZ,MAAM,EAAE,CAAC;UACT,OAAO,EAAE,CAAC;UACV,MAAM,EAAE,CAAC;MAGjB,8CAAO;QACH,MAAM,EAAE,iBAAiB;QACzB,gBAAgB,EAAE,OAAO;IAIjC,sCAAS;MACL,UAAU,EAAE,KAAK;MACjB,MAAM,EAAE,GAAG;MACX,OAAO,EAAE,CAAC;MACV,MAAM,EAAE,CAAC;MACT,IAAI,EAAE,+CAA+C;MACrD,KAAK,EAAE,IAAI;MACX,eAAe,EAAE,IAAI;;AAOjC;;GAEG;AACH,eAAgB;EACZ,MAAM,EAAE,iBAAiB;EACzB,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,GAAG;EAEZ,qCAAsB;IAClB,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,eAAe,EAAE,QAAQ;IAEzB,0DAAqB;MACjB,SAAS,EAAE,CAAC;MACZ,WAAW,EAAE,CAAC;MACd,MAAM,EAAE,iBAAiB;MACzB,MAAM,EAAE,OAAO;MACf,MAAM,EAAE,GAAG;MACX,OAAO,EAAE,CAAC;MAEV,qFAA2B;QACvB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;IAGjB,8DAAyB;MACrB,WAAW,EAAE,wCAAwC;MACrD,SAAS,EAAE,IAAI;MACf,WAAW,EAAE,IAAI;MACjB,MAAM,EAAE,iBAAiB;MACzB,MAAM,EAAE,OAAO;MACf,MAAM,EAAE,CAAC;MACT,OAAO,EAAE,CAAC;MACV,UAAU,EAAE,MAAM;IAEtB,6DAAwB;MACpB,MAAM,EAAE,iBAAiB;IAE7B,mEAA8B;MAC1B,MAAM,EAAE,iBAAiB;;AAMrC;;GAEG;AACH,UAAW;EACP,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,MAAM,EAxaW,iBAAiB;EAyalC,IAAI,EAAE,CAAC;EAnZP,UAAU,EAAE,mBAAmB;EAC/B,eAAe,EAAE,mBAAmB;EACpC,kBAAkB,EAAE,mBAAmB;EACvC,MAAM,EAAE,oFAAoF;EAkZ5F,aAAa,EAAE,GAAG;EAClB,kBAAkB,EAAE,GAAG;EACvB,qBAAqB,EAAE,GAAG;EAC1B,QAAQ,EAAE,MAAM;EAGhB,4BAAkB;IACd,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,sBAAsB,EAAE,GAAG;IAC3B,uBAAuB,EAAE,GAAG;IAC5B,aAAa,EAAE,iBAAiB;IAChC,UAAU,EAAE,kEAAkE;IAC9E,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,IAAI;IAEZ,kDAAsB;MAClB,MAAM,EAAE,IAAI;MACZ,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,OAAO;MACf,UAAU,EAAE,sCAAsC;MAClD,QAAQ,EAAE,QAAQ;MAClB,KAAK,EAAE,GAAG;MACV,GAAG,EAAE,GAAG;MAER,wDAAQ;QACJ,mBAAmB,EAAE,SAAS;EAO1C,6BAAmB;IAEf,gBAAgB,EAAE,IAAI;IACtB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IAGP,6CAAgB;MACZ,IAAI,EAAE,iDAAiD;MACvD,UAAU,EAAE,IAAI;MAChB,QAAQ,EAAE,MAAM;MAChB,KAAK,EAAE,IAAI;MAEX,0DAAa;QACT,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,wCAAwC;QACrD,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,iBAA2B;QAEnC,gEAAQ;UACJ,YAAY,EAhfP,OAAO;UAifZ,OAAO,EAAE,IAAI;MAIrB,wDAAW;QACP,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,MAAM;QACtB,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,iBAA2B;QACnC,MAAM,EA5fP,IAAI;MA8fP,sDAAS;QACL,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;MAGd,8DAAiB;QACb,KAAK,EAAE,IAAI;MAGf,gEAAmB;QACf,QAAQ,EAAE,QAAQ;QAClB,GAAG,EAAC,GAAG;MAGX,sDAAS;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,IAAI;QAEZ,4DAAQ;UACJ,OAAO,EAAE,IAAI;MAIrB,4DAAe;QACX,OAAO,EAAE,uBAAuB;QAChC,SAAS,EAAE,KAAK;QAChB,MAAM,EA1hBP,IAAI;QA2hBH,WAAW,EA3hBZ,IAAI;QA4hBH,MAAM,EAAC,iBAA2B;QAClC,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,MAAM;QAEhB,kEAAQ;UACJ,YAAY,EAriBP,OAAO;MAyiBpB,6DAAgB;QACZ,MAAM,EAxiBD,iBAAiB;QAyiBtB,gBAAgB,EAAE,OAAO;QACzB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,GAAG;QACjB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,MAAM;QACtB,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,MAAM;MAGpB,6DAAgB;QACZ,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,GAAG,EAAC,IAAI;QACR,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,IAAI;QAEb,6EAAgB;UACZ,QAAQ,EAAE,QAAQ;UAClB,SAAS,EAAE,IAAI;UACf,GAAG,EAAE,CAAC;UACN,KAAK,EAAE,CAAC;UACR,OAAO,EAAE,CAAC;UACV,MAAM,EAAE,CAAC;UACT,OAAO,EAAE,MAAM;UACf,MAAM,EAAE,MAAM;UACd,OAAO,EAAE,CAAC;UACV,MAAM,EAAE,OAAO;UACf,KAAK,EAAE,IAAI;UACX,MAAM,EAAE,IAAI;UACZ,MAAM,EAAE,gBAAgB;QAI5B,+EAAkB;UACd,GAAG,EAAE,IAAI;QAEb,wEAAW;UACP,OAAO,EAAE,QAAQ;MAIzB,sEAAyB;QACrB,OAAO,EAAE,kBAAkB;QAkE3B;;WAEG;QAlEH,qFAAe;UACX,MAAM,EAAC,iBAAiB;UACxB,aAAa,EAAE,IAAI;UACnB,QAAQ,EAAE,MAAM;UAEhB,+FAAU;YACN,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,KAAK;UAErB,gGAAW;YACP,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,IAAI;YAEhB,iHAAiB;cAxmBrC,OAAO,EAAE,iBAAiB;cAC1B,OAAO,EAAE,YAAY;cACrB,cAAc,EAAE,MAAM;cACtB,IAAI,EAAE,CAAC;cACP,QAAQ,EAAE,MAAM;cAumBQ,mIAAkB;gBACd,QAAQ,EAAE,QAAQ;gBAClB,GAAG,EAAE,IAAI;YAIjB,sGAAM;cACF,MAAM,EAAE,OAAO;cACf,OAAO,EAAE,iBAAiB;cAC1B,OAAO,EAAE,YAAY;cACrB,cAAc,EAAE,MAAM;cACtB,UAAU,EAAE,KAAK;cACjB,IAAI,EAAE,CAAC;cACP,QAAQ,EAAE,MAAM;cAEhB,0GAAI;gBACA,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,YAAY;gBACrB,cAAc,EAAE,MAAM;gBACtB,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,MAAM;QAShC,iFAAW;UACP,MAAM,EAAE,IAAI;UACZ,WAAW,EAAE,IAAI;UAEjB,gGAAe;YACX,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,IAAI;UAErB,4FAAW;YACP,OAAO,EAAE,QAAQ;UAErB,2FAAU;YACN,WAAW,EAAC,IAAI;QAOxB,+EAAS;UACL,IAAI,EAAE,+CAA+C;UACrD,aAAa,EAlqBZ,iBAAiB;UAmqBlB,aAAa,EAAE,IAAI;UAEnB,2FAAY;YACR,UAAU,EAAE,iBAAiB;YAC7B,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;YAEV,uGAAY;cACR,QAAQ,EAAE,QAAQ;cAClB,MAAM,EAAE,YAAY;cACpB,OAAO,EAAE,MAAM;cACf,KAAK,EAAE,IAAI;cACX,WAAW,EAAE,IAAI;cACjB,UAAU,EAAE,MAAM;cAClB,KAAK,EAAE,OAAO;cACd,MAAM,EAAE,OAAO;YAEnB,gHAAqB;cACjB,gBAAgB,EAAE,IAAI;cACtB,MAAM,EAtrBb,iBAAiB;cAurBV,aAAa,EAAE,cAAc;cAC7B,KAAK,EAAE,OAAO;cACd,MAAM,EAAE,OAAO;cACf,sBAAsB,EAAE,GAAG;cAC3B,uBAAuB,EAAE,GAAG;YAGhC,0GAAe;cACX,gBAAgB,EAAE,IAAI;cACtB,KAAK,EAAE,IAAI;IAU/B,gDAAmB;MACf,QAAQ,EAAE,QAAQ;MAClB,GAAG,EAAE,CAAC;MACN,IAAI,EAAE,GAAG;MACT,OAAO,EAAE,CAAC;MACV,UAAU,EAAE,MAAM;MAElB,2EAA2B;QACvB,UAAU,EAAE,6CAA6C;QACzD,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;EAM9B,4BAAkB;IACd,IAAI,EAAE,+CAA+C;IACrD,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,YAAY;IACrB,gBAAgB,EAAE,IAAI;IACtB,MAAM,EAAE,IAAI;IAEZ,2CAAe;MACX,MAAM,EAAE,GAAG;IAGf,0CAAc;MACV,MAAM,EAAE,gBAAgB;EAIhC,4BAAkB;IACd,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,OAAO;EAGnB,2BAAiB;IACb,mBAAmB,EAAE,OAAO;IAC5B,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,iBAAiB;IAC1B,OAAO,EAAE,YAAY;IACrB,cAAc,EAAE,MAAM;IACtB,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,MAAM;EAGpB,qBAAW;IACP,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,iBAAiB;IACzB,gBAAgB,EAAE,OAAO;IACzB,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,wDAAwD;IAEpE,2BAAQ;MACJ,MAAM,EA7wBG,iBAAiB;MA8wB1B,gBAAgB,EAAE,OAAO;EAIjC,yBAAe;IACX,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,GAAG;IACX,UAAU,EAAE,OAAO;IACnB,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,YAAY;IACrB,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,OAAO;IACf,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,YAAY;IAExB,+BAAQ;MACJ,MAAM,EAAE,iBAAiB;MACzB,UAAU,EAAE,IAAI;MAChB,UAAU,EAAE,IAAI;MAChB,OAAO,EAAE,EAAE;;AClyBnB,iCAAY;EAER,UAAU,EAAE,iBAAiB;EAC7B,UAAU,EAAE,gEAAgE;EAC5E,eAAe,EAAE,WAAW;EAC5B,cAAc,EAAE,kBAAkB;EAElC,kDAAiB;IACb,iBAAiB,EAAE,wBAAwB;IAC3C,UAAU,EAAE,kCAAkC;EAGlD,iDAAgB;IACZ,mBAAmB,EAAE,KAAK;EAE9B,kDAAiB;IACb,mBAAmB,EAAE,OAAO;EAEhC,gDAAe;IACX,mBAAmB,EAAE,OAAO;EAEhC,+CAAc;IACV,mBAAmB,EAAE,OAAO;EAGhC,+CAAc;IACV,mBAAmB,EAAE,OAAO;EAGhC,mDAAkB;IACd,mBAAmB,EAAE,QAAQ;EAGjC,8CAAa;IACT,mBAAmB,EAAE,QAAQ;EAGjC,+CAAc;IACV,mBAAmB,EAAE,QAAQ;EAGjC,gDAAe;IACX,mBAAmB,EAAE,QAAQ;EAGjC,oDAAmB;IACf,mBAAmB,EAAE,QAAQ;EAGjC,sDAAqB;IACjB,mBAAmB,EAAE,QAAQ;EAGjC,wDAAuB;IACnB,mBAAmB,EAAE,QAAQ;EAGjC,uDAAsB;IAClB,mBAAmB,EAAE,QAAQ;EAGjC,sDAAqB;IACjB,mBAAmB,EAAE,QAAQ;EAGjC,4DAA2B;IACvB,mBAAmB,EAAE,QAAQ;EAGjC,8DAA6B;IACzB,mBAAmB,EAAE,QAAQ;EAGjC,iDAAgB;IACZ,mBAAmB,EAAE,QAAQ;EAGjC,kDAAiB;IACb,mBAAmB,EAAE,QAAQ;EAGjC,oDAAmB;IACf,mBAAmB,EAAE,QAAQ;EAGjC,sDAAqB;IACjB,mBAAmB,EAAE,QAAQ;EAGjC,+CAAc;IACV,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,+CAAc;IACV,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,sDAAqB;IACjB,mBAAmB,EAAE,QAAQ;EAGjC,mDAAkB;IACd,mBAAmB,EAAE,QAAQ;EAGjC,mDAAkB;IACd,mBAAmB,EAAE,QAAQ;EAGjC,oDAAmB;IACf,mBAAmB,EAAE,QAAQ;EAGjC,sDAAqB;IACjB,mBAAmB,EAAE,QAAQ;EAGjC,+CAAc;IACV,mBAAmB,EAAE,QAAQ;EAGjC,iDAAgB;IACZ,mBAAmB,EAAE,QAAQ;EAGjC,oDAAmB;IACf,mBAAmB,EAAE,QAAQ;EAGjC,wDAAuB;IACnB,mBAAmB,EAAE,QAAQ;EAGjC,uDAAsB;IAClB,mBAAmB,EAAE,QAAQ;EAGjC,gDAAe;IACX,mBAAmB,EAAE,QAAQ;EAGjC,gDAAe;IACX,mBAAmB,EAAE,QAAQ;EAGjC,gDAAe;IACX,mBAAmB,EAAE,QAAQ;EAGjC,8CAAa;IACT,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,kDAAiB;IACb,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,6CAAY;IACR,mBAAmB,EAAE,QAAQ;EAGjC,oDAAmB;IACf,mBAAmB,EAAE,QAAQ;EAGjC,+CAAc;IACV,mBAAmB,EAAE,SAAS;EAGlC,iDAAgB;IACZ,mBAAmB,EAAE,SAAS;EAGlC,qDAAoB;IAChB,mBAAmB,EAAE,QAAQ;EAGjC,gDAAe;IACX,mBAAmB,EAAE,SAAS;EAGlC,gDAAe;IACX,mBAAmB,EAAE,SAAS;EAGlC,qDAAoB;IAChB,mBAAmB,EAAE,QAAQ;EAGjC,oDAAmB;IACf,mBAAmB,EAAE,QAAQ;EAGjC,gDAAe;IACX,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,eAAe;EAG1B,oDAAmB;IACf,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,+CAAc;IACV,mBAAmB,EAAE,QAAQ;EAGjC,8CAAa;IACT,mBAAmB,EAAE,UAAU;IAC/B,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,mDAAkB;IACd,mBAAmB,EAAE,SAAS;EAGlC,qDAAoB;IAChB,mBAAmB,EAAE,QAAQ;EAGjC,oDAAmB;IACf,mBAAmB,EAAE,QAAQ;EAGjC,oDAAmB;IACf,mBAAmB,EAAE,QAAQ;EAGjC,qDAAoB;IAChB,mBAAmB,EAAE,QAAQ;EAGjC,sDAAqB;IACjB,mBAAmB,EAAE,QAAQ;EAGjC,iDAAgB;IACZ,mBAAmB,EAAE,QAAQ;EAGjC,iDAAgB;IACZ,mBAAmB,EAAE,WAAW;IAChC,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,8CAAa;IACT,mBAAmB,EAAE,WAAW;IAChC,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,sDAAqB;IACjB,mBAAmB,EAAE,WAAW;IAChC,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,qDAAoB;IAChB,mBAAmB,EAAE,QAAQ;EAGjC,gDAAe;IACX,mBAAmB,EAAE,QAAQ;;AAKzC;;GAEG;AAKK,iDAAmB;EACf,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;EAClB,QAAQ,EAAE,MAAM;EAEhB,kEAAiB;IDrRzB,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,OAAO;ICiRH,iBAAiB,EAAE,wBAAwB;IAC3C,UAAU,EAAE,kCAAkC;EAGlD,sEAAqB;IACjB,mBAAmB,EAAE,QAAQ;IAC7B,KAAK,EAAE,eAAe;EAG1B,sEAAqB;IACjB,mBAAmB,EAAE,SAAS;EAGlC,6EAA4B;IACxB,mBAAmB,EAAE,SAAS;IAC9B,KAAK,EAAE,eAAe;EAG1B,8EAA6B;IACzB,mBAAmB,EAAE,SAAS;IAC9B,KAAK,EAAE,eAAe;EAG1B,8EAA6B;IACzB,mBAAmB,EAAE,SAAS;IAC9B,KAAK,EAAE,eAAe;EAG1B,8EAA6B;IACzB,mBAAmB,EAAE,SAAS;IAC9B,KAAK,EAAE,eAAe;EAG1B,yEAAwB;IACpB,mBAAmB,EAAE,SAAS;EAGlC,yEAAwB;IACpB,mBAAmB,EAAE,SAAS;EAGlC,wEAAuB;IACnB,mBAAmB,EAAE,SAAS;EAGlC,oEAAmB;IACf,mBAAmB,EAAE,SAAS;EAElC,yEAAwB;IACpB,mBAAmB,EAAE,WAAW;IAChC,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;EAGhB,wEAAuB;IACnB,mBAAmB,EAAE,YAAY;EAGrC,wEAAuB;IACnB,mBAAmB,EAAE,SAAS;EAGlC,wEAAuB;IACnB,mBAAmB,EAAE,YAAY;EAGrC,wEAAuB;IACnB,mBAAmB,EAAE,SAAS;EAIlC,gEAAe;IACX,mBAAmB,EAAE,QAAQ;EAEjC,gEAAe;IACX,mBAAmB,EAAE,QAAQ;EAEjC,gEAAe;IACX,mBAAmB,EAAE,QAAQ;EAEjC,+DAAc;IACV,mBAAmB,EAAE,SAAS;EAGlC,kEAAiB;IACb,mBAAmB,EAAE,SAAS",
+"sources": ["../common/common.scss","editor.scss"],
+"names": [],
+"file": "editor.css"
+}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/primary/editor.min.css b/addons/nkeditor/assets/themes/primary/editor.min.css
new file mode 100644
index 0000000..62d5203
--- /dev/null
+++ b/addons/nkeditor/assets/themes/primary/editor.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ke-clearfix{zoom:1;clear:both}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-dialog-lock{background-color:#fff;opacity:.5;z-index:811213;left:0;top:0;position:absolute}.ke-container{display:block;background-color:#fff;overflow:hidden;margin:0;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16)}.ke-container .ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-container .ke-dialog a,.ke-container .ke-dialog a:hover,.ke-container .ke-menu a,.ke-container .ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-container .ke-toolbar{text-align:left;overflow:hidden;zoom:1;padding:0 5px}.ke-container .ke-toolbar .ke-outline{padding:10px 5px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-container .ke-toolbar .ke-outline .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px}.ke-container .ke-toolbar .ke-on{background:#ebebeb}.ke-container .ke-toolbar .ke-selected{background-color:#ebebeb}.ke-container .ke-toolbar .ke-disabled{cursor:default}.ke-container .ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-container .ke-toolbar .ke-hr{clear:both;height:1px;width:calc(100% - (2 * 2px));background:#ebebeb}.ke-container .ke-edit{padding:0}.ke-container .ke-edit .ke-edit-iframe,.ke-container .ke-edit .ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-container .ke-edit .ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-container .ke-edit .ke-edit-textarea:focus{outline:0}.ke-container .ke-statusbar{position:relative;background-color:#f5f5f5;border-top:1px solid #e1e1e1;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize;display:none}.ke-container .ke-statusbar .ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px}.ke-container .ke-statusbar .ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;width:11px;height:11px}.ke-menu{border:1px solid #ccc;background-color:#f5f5f5;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu .ke-menu-item .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-inline-block .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu .ke-menu-item .ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu .ke-menu-item .ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #e1e1e1;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-menu .ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons{position:relative}.ke-menu .ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img{border:0;margin:0;padding:0}.ke-menu .ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell{margin:0;padding:1px;border:1px solid #f5f5f5;cursor:pointer}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-menu .ke-plugin-emoticons .ke-table .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker .ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f1f1f1;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-dialog{margin:0;padding:0;border:1px solid #ccc;zoom:1;box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden}.ke-dialog .ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom:1px solid #c6c6c6;background:transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.ke-dialog .ke-dialog-header .ke-dialog-icon-close{height:20px;width:20px;cursor:pointer;background:url(../common/icons-all.gif) 0 -59px;position:absolute;right:5px;top:4px}.ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover{background-position:0 -89px}.ke-dialog .ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border:1px solid #ccc}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus{border-color:#66afe9;outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto;border:1px solid #ccc;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number{width:50px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox{position:relative;top:6px}.ke-dialog .ke-dialog-content .ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus{outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text{display:inline-block!important;max-width:400px;height:30px;line-height:30px;border:1px solid #ccc;font-size:14px;margin:0;outline:0;padding:0 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus{border-color:#66afe9}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color{border:1px solid #e1e1e1;background-color:#fff;font-size:12px;width:60px;height:30px;line-height:30px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0;top:-1px;position:relative}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:62px;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common{top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button{padding:8px 15px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner{padding:10px 20px 0 20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row{border:1px solid #fff;margin-bottom:10px;overflow:hidden}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left{float:left;height:30px;line-height:30px;width:60px;text-align:right}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right{float:left;text-align:left}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button{position:relative;top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label{cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header{height:30px;line-height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text{height:22px;line-height:22px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button{padding:3px 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox{margin-left:10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #e1e1e1;margin-bottom:20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul{list-style:none outside none;margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected{background-color:#fff;border:1px solid #e1e1e1;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on{background-color:#fff;color:#000}.ke-dialog .ke-dialog-content .ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat center;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog .ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;height:40px}.ke-dialog .ke-dialog-footer .ke-dialog-yes{margin:5px}.ke-dialog .ke-dialog-footer .ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog .ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-dialog .ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:7px 10px;margin-top:-4px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-dialog .ke-button:hover{border:1px solid #e1e1e1;background-color:#e1e1e1}.ke-dialog .ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog .ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-container-primary .ke-toolbar{border-top:5px solid #009688;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);background-clip:padding-box;text-rendering:optimizelegibility}.ke-container-primary .ke-toolbar .ke-toolbar-icon{background:url(images/nkeditor.svg) no-repeat}.ke-container-primary .ke-toolbar .ke-icon-source{background-position:0 0}.ke-container-primary .ke-toolbar .ke-icon-preview{background-position:0 -63px}.ke-container-primary .ke-toolbar .ke-icon-print{background-position:0 -84px}.ke-container-primary .ke-toolbar .ke-icon-undo{background-position:0 -21px}.ke-container-primary .ke-toolbar .ke-icon-redo{background-position:0 -42px}.ke-container-primary .ke-toolbar .ke-icon-template{background-position:0 -105px}.ke-container-primary .ke-toolbar .ke-icon-cut{background-position:0 -147px}.ke-container-primary .ke-toolbar .ke-icon-copy{background-position:0 -168px}.ke-container-primary .ke-toolbar .ke-icon-paste{background-position:0 -189px}.ke-container-primary .ke-toolbar .ke-icon-selectall{background-position:0 -483px}.ke-container-primary .ke-toolbar .ke-icon-justifyleft{background-position:0 -252px}.ke-container-primary .ke-toolbar .ke-icon-justifycenter{background-position:0 -273px}.ke-container-primary .ke-toolbar .ke-icon-justifyright{background-position:0 -294px}.ke-container-primary .ke-toolbar .ke-icon-justifyfull{background-position:0 -315px}.ke-container-primary .ke-toolbar .ke-icon-insertorderedlist{background-position:0 -336px}.ke-container-primary .ke-toolbar .ke-icon-insertunorderedlist{background-position:0 -357px}.ke-container-primary .ke-toolbar .ke-icon-indent{background-position:0 -378px}.ke-container-primary .ke-toolbar .ke-icon-outdent{background-position:0 -399px}.ke-container-primary .ke-toolbar .ke-icon-subscript{background-position:0 -420px}.ke-container-primary .ke-toolbar .ke-icon-superscript{background-position:0 -441px}.ke-container-primary .ke-toolbar .ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-formatblock{background-position:0 -546px}.ke-container-primary .ke-toolbar .ke-icon-fontname{background-position:0 -567px}.ke-container-primary .ke-toolbar .ke-icon-fontsize{background-position:0 -588px}.ke-container-primary .ke-toolbar .ke-icon-forecolor{background-position:0 -609px}.ke-container-primary .ke-toolbar .ke-icon-hilitecolor{background-position:0 -630px}.ke-container-primary .ke-toolbar .ke-icon-bold{background-position:0 -651px}.ke-container-primary .ke-toolbar .ke-icon-italic{background-position:0 -672px}.ke-container-primary .ke-toolbar .ke-icon-underline{background-position:0 -693px}.ke-container-primary .ke-toolbar .ke-icon-strikethrough{background-position:0 -714px}.ke-container-primary .ke-toolbar .ke-icon-removeformat{background-position:0 -756px}.ke-container-primary .ke-toolbar .ke-icon-image{background-position:0 -777px}.ke-container-primary .ke-toolbar .ke-icon-flash{background-position:0 -840px}.ke-container-primary .ke-toolbar .ke-icon-media{background-position:0 -861px}.ke-container-primary .ke-toolbar .ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-hr{background-position:0 -924px}.ke-container-primary .ke-toolbar .ke-icon-emoticons{background-position:0 -945px}.ke-container-primary .ke-toolbar .ke-icon-link{background-position:0 -1008px}.ke-container-primary .ke-toolbar .ke-icon-unlink{background-position:0 -1029px}.ke-container-primary .ke-toolbar .ke-icon-fullscreen{background-position:0 -525px}.ke-container-primary .ke-toolbar .ke-icon-about{background-position:0 -1092px}.ke-container-primary .ke-toolbar .ke-icon-quote{background-position:0 -1114px}.ke-container-primary .ke-toolbar .ke-icon-plainpaste{background-position:0 -210px}.ke-container-primary .ke-toolbar .ke-icon-wordpaste{background-position:0 -231px}.ke-container-primary .ke-toolbar .ke-icon-table{background-position:0 -903px;width:18px!important}.ke-container-primary .ke-toolbar .ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-code{background-position:0 -126px}.ke-container-primary .ke-toolbar .ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-baidumap{background-position:0 -1050px}.ke-container-primary .ke-toolbar .ke-icon-lineheight{background-position:0 -735px}.ke-container-primary .ke-toolbar .ke-icon-clearhtml{background-position:0 -462px}.ke-container-primary .ke-toolbar .ke-icon-pagebreak{background-position:0 -966px}.ke-container-primary .ke-toolbar .ke-icon-insertfile{background-position:0 -882px}.ke-container-primary .ke-toolbar .ke-icon-quickformat{background-position:0 -504px}.ke-container-primary .ke-toolbar .ke-icon-anchor{background-position:0 -987px}.ke-container-primary .ke-toolbar .ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-multiimage{background-position:0 -798px}.ke-container-primary .ke-toolbar .ke-icon-graft{background-position:0 -819px}.ke-menu-primary .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px;background:url(images/nkeditor.svg) no-repeat}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert{background-position:0 -903px;width:18px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete{background-position:0 -1428px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft{background-position:0 -1176px;width:18px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright{background-position:0 -1323px;width:18px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove{background-position:0 -1302px;width:22px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow{background-position:0 -1155px;width:22px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete{background-position:0 -1239px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete{background-position:0 -1260px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop{background-position:0 -1218px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tableprop{background-position:0 -1134px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge{background-position:-1px -1197px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit{background-position:0 -1344px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge{background-position:-4px -1365px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit{background-position:0 -1344px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-image{background-position:0 -777px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-flash{background-position:0 -840px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-media{background-position:0 -861px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-link{background-position:0 -1008px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-checked{background-position:0 -1407px}
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/primary/editor.scss b/addons/nkeditor/assets/themes/primary/editor.scss
new file mode 100644
index 0000000..c20d945
--- /dev/null
+++ b/addons/nkeditor/assets/themes/primary/editor.scss
@@ -0,0 +1,387 @@
+@import "../common/common";
+
+.ke-container-primary {
+    .ke-toolbar {
+
+        border-top: 5px solid #009688;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+        background-clip: padding-box;
+        text-rendering: optimizelegibility;
+
+        .ke-toolbar-icon {
+            *background-image: url(images/nkeditor.png);
+            background: url(images/nkeditor.svg) no-repeat;
+        }
+
+        .ke-icon-source {
+            background-position: 0 0px;
+        }
+        .ke-icon-preview {
+            background-position: 0 -63px;
+        }
+        .ke-icon-print {
+            background-position: 0 -84px;
+        }
+        .ke-icon-undo {
+            background-position: 0 -21px;
+        }
+
+        .ke-icon-redo {
+            background-position: 0 -42px;
+        }
+
+        .ke-icon-template {
+            background-position: 0 -105px;
+        }
+
+        .ke-icon-cut {
+            background-position: 0 -147px;
+        }
+
+        .ke-icon-copy {
+            background-position: 0 -168px;
+        }
+
+        .ke-icon-paste {
+            background-position: 0 -189px;
+        }
+
+        .ke-icon-selectall {
+            background-position: 0 -483px;
+        }
+
+        .ke-icon-justifyleft {
+            background-position: 0 -252px;
+        }
+
+        .ke-icon-justifycenter {
+            background-position: 0 -273px;
+        }
+
+        .ke-icon-justifyright {
+            background-position: 0 -294px;
+        }
+
+        .ke-icon-justifyfull {
+            background-position: 0 -315px;
+        }
+
+        .ke-icon-insertorderedlist {
+            background-position: 0 -336px;
+        }
+
+        .ke-icon-insertunorderedlist {
+            background-position: 0 -357px;
+        }
+
+        .ke-icon-indent {
+            background-position: 0 -378px;
+        }
+
+        .ke-icon-outdent {
+            background-position: 0 -399px;
+        }
+
+        .ke-icon-subscript {
+            background-position: 0 -420px;
+        }
+
+        .ke-icon-superscript {
+            background-position: 0 -441px;
+        }
+
+        .ke-icon-date {
+            background-position: 0px -304px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-time {
+            background-position: 0px -320px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-formatblock {
+            background-position: 0 -546px;
+        }
+
+        .ke-icon-fontname {
+            background-position: 0 -567px;
+        }
+
+        .ke-icon-fontsize {
+            background-position: 0 -588px;
+        }
+
+        .ke-icon-forecolor {
+            background-position: 0 -609px;
+        }
+
+        .ke-icon-hilitecolor {
+            background-position: 0 -630px;
+        }
+
+        .ke-icon-bold {
+            background-position: 0 -651px;
+        }
+
+        .ke-icon-italic {
+            background-position: 0 -672px;
+        }
+
+        .ke-icon-underline {
+            background-position: 0 -693px;
+        }
+
+        .ke-icon-strikethrough {
+            background-position: 0 -714px;
+        }
+
+        .ke-icon-removeformat {
+            background-position: 0 -756px;
+        }
+
+        .ke-icon-image {
+            background-position: 0 -777px;
+        }
+
+        .ke-icon-flash {
+            background-position: 0 -840px;
+        }
+
+        .ke-icon-media {
+            background-position: 0 -861px;
+        }
+
+        .ke-icon-div {
+            background-position: 0px -544px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-formula {
+            background-position: 0px -576px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-hr {
+            background-position: 0 -924px;
+        }
+
+        .ke-icon-emoticons {
+            background-position: 0 -945px;
+        }
+
+        .ke-icon-link {
+            background-position: 0 -1008px;
+        }
+
+        .ke-icon-unlink {
+            background-position: 0 -1029px;
+        }
+
+        .ke-icon-fullscreen {
+            background-position: 0 -525px;
+        }
+
+        .ke-icon-about {
+            background-position: 0 -1092px;
+        }
+
+        .ke-icon-quote {
+            background-position: 0 -1114px;
+        }
+
+        .ke-icon-plainpaste {
+            background-position: 0 -210px;
+        }
+
+        .ke-icon-wordpaste {
+            background-position: 0 -231px;
+        }
+
+        .ke-icon-table {
+            background-position: 0px -903px;
+            width: 18px !important;
+        }
+
+        .ke-icon-tablemenu {
+            background-position: 0px -768px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-code {
+            background-position: 0 -126px;
+        }
+
+        .ke-icon-map {
+            background-position: 0px -976px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-baidumap {
+            background-position: 0 -1050px;
+        }
+
+        .ke-icon-lineheight {
+            background-position: 0 -735px;
+        }
+
+        .ke-icon-clearhtml {
+            background-position: 0 -462px;
+        }
+
+        .ke-icon-pagebreak {
+            background-position: 0 -966px;
+        }
+
+        .ke-icon-insertfile {
+            background-position: 0 -882px;
+        }
+
+        .ke-icon-quickformat {
+            background-position: 0 -504px;
+        }
+
+        .ke-icon-anchor {
+            background-position: 0 -987px;
+        }
+
+        .ke-icon-search {
+            background-position: 0px -1184px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-new {
+            background-position: 0px -1200px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-specialchar {
+            background-position: 0px -1216px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-multiimage {
+            background-position: 0 -798px;
+        }
+
+        .ke-icon-graft {
+            background-position: 0 -819px;
+        }
+    }
+}
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-primary {
+
+    .ke-menu-item {
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+                *background-image: url(images/nkeditor.png);
+                background: url(images/nkeditor.svg) no-repeat;
+            }
+
+            .ke-icon-tableinsert {
+                background-position: 0 -903px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tabledelete {
+                background-position: 0 -1428px;
+            }
+
+            .ke-icon-tablecolinsertleft {
+                background-position: 0 -1176px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablecolinsertright {
+                background-position: 0 -1323px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablerowinsertabove {
+                background-position: 0 -1302px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablerowinsertbelow {
+                background-position: 0 -1155px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablecoldelete {
+                background-position: 0 -1239px;
+            }
+
+            .ke-icon-tablerowdelete {
+                background-position: 0 -1260px;
+            }
+
+            .ke-icon-tablecellprop {
+                background-position: 0 -1218px;
+            }
+
+            .ke-icon-tableprop {
+                background-position: 0 -1134px;
+            }
+            .ke-icon-tablecellsplit {
+                background-position: 0px -1088px;
+                width: 16px;
+                height: 16px;
+            }
+
+            .ke-icon-tablerowmerge {
+                background-position: -1px -1197px;
+            }
+
+            .ke-icon-tablerowsplit {
+                background-position: 0 -1344px;
+            }
+
+            .ke-icon-tablecolmerge {
+                background-position: -4px -1365px;
+            }
+
+            .ke-icon-tablecolsplit {
+                background-position: 0 -1344px;
+            }
+
+            //图片,视频右键菜单
+            .ke-icon-image {
+                background-position: 0 -777px;
+            }
+            .ke-icon-flash {
+                background-position: 0 -840px;
+            }
+            .ke-icon-media {
+                background-position: 0 -861px;
+            }
+            .ke-icon-link {
+                background-position: 0 -1008px;
+            }
+
+            .ke-icon-checked {
+                background-position: 0 -1407px;
+            }
+
+        }
+    }
+}
+//menu end
\ No newline at end of file
diff --git a/addons/nkeditor/assets/themes/primary/images/nkeditor.png b/addons/nkeditor/assets/themes/primary/images/nkeditor.png
new file mode 100644
index 0000000..2bd53f2
Binary files /dev/null and b/addons/nkeditor/assets/themes/primary/images/nkeditor.png differ
diff --git a/addons/nkeditor/assets/themes/primary/images/nkeditor.svg b/addons/nkeditor/assets/themes/primary/images/nkeditor.svg
new file mode 100644
index 0000000..3c83f02
--- /dev/null
+++ b/addons/nkeditor/assets/themes/primary/images/nkeditor.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="1549" viewBox="0 0 21 1549">
+<svg id="icon-source-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="0">
+<path fill="#009688" d="M14.4 16h-12.8c-0.884 0-1.6-0.716-1.6-1.6v-12.8c0-0.884 0.716-1.6 1.6-1.6h12.8c0.884 0 1.6 0.716 1.6 1.6v12.8c0 0.884-0.716 1.6-1.6 1.6zM14.4 2.4h-12.8v12h12.8v-12zM6.4 5.6l-2.4 3.2 2.4 2.4-0.8 0.8-3.2-3.2 3.2-4 0.8 0.8zM9.6 4l-1.6 8.8h-1.6l1.6-8.8h1.6zM10.4 4.8l3.2 4-3.2 3.2-0.8-0.8 2.4-2.4-2.4-3.2 0.8-0.8z"></path>
+</svg>
+<svg id="icon-undo" width="16" height="16" viewBox="0 0 16 16" x="0" y="21">
+<path fill="#009688" d="M12.161 16c1.777-3.219 2.076-8.13-4.904-7.966v3.966l-6-6 6-6v3.881c8.359-0.218 9.29 7.378 4.904 12.119z"></path>
+</svg>
+<svg id="icon-redo" width="16" height="16" viewBox="0 0 16 16" x="0" y="42">
+<path fill="#009688" d="M9 3.881v-3.881l6 6-6 6v-3.966c-6.981-0.164-6.681 4.747-4.904 7.966-4.386-4.741-3.454-12.337 4.904-12.119z"></path>
+</svg>
+<svg id="icon-preview" width="16" height="16" viewBox="0 0 16 16" x="0" y="63">
+<path fill="#009688" d="M11.566 10.552c1.261-1.733 1.095-4.134-0.425-5.645-0.827-0.827-1.922-1.275-3.089-1.275-1.166 0-2.261 0.456-3.089 1.275-0.811 0.827-1.269 1.922-1.269 3.086s0.456 2.259 1.277 3.086c0.827 0.827 1.922 1.275 3.089 1.275 0.922 0 1.805-0.291 2.561-0.85l2.269 2.259c0.127 0.127 0.292 0.197 0.473 0.197s0.347-0.070 0.473-0.197c0.259-0.259 0.259-0.684 0-0.945l-2.27-2.266zM5.916 10.134c-1.181-1.181-1.181-3.094 0-4.275 0.575-0.575 1.331-0.881 2.142-0.881s1.567 0.316 2.142 0.881c1.181 1.181 1.181 3.094 0 4.275-1.141 1.133-3.142 1.133-4.284 0z"></path>
+<path fill="#009688" d="M11.431 1h-6.855c-1.969 0-3.577 1.598-3.577 3.575v6.85c0 1.969 1.6 3.575 3.577 3.575h3.719c0.37 0 0.67-0.298 0.67-0.669s-0.3-0.669-0.67-0.669h-3.719c-1.23 0-2.23-1-2.23-2.228v-6.852c0-1.228 1-2.228 2.23-2.228h6.855c1.23 0 2.23 1 2.23 2.228v3.645c0 0.37 0.3 0.669 0.67 0.669s0.67-0.298 0.67-0.669v-3.661c-0.002-1.969-1.602-3.567-3.57-3.567z"></path>
+</svg>
+<svg id="icon-print" width="16" height="16" viewBox="0 0 16 16" x="0" y="84">
+<path fill="#009688" d="M4.98 14.938h5.967c0.548 0 0.975-0.461 0.975-1.011v-2.973h-7.922v2.973c0 0.55 0.431 1.011 0.98 1.011zM10.947 1.016h-5.967c-0.548 0-0.98 0.428-0.98 0.978v2.959h7.922v-2.959c0-0.55-0.427-0.978-0.975-0.978z"></path>
+<path fill="#009688" d="M12.922 4.953v1.016h-9.922v-1.016h-1.003c-0.55 0-0.981 0.469-0.981 1.019v6.961c0 0.55 0.431 1.005 0.981 1.005h1.003v-3.984h9.922v3.984h1.008c0.548 0 1.008-0.455 1.008-1.005v-6.961c0-0.55-0.458-1.019-1.008-1.019h-1.008zM12.922 7.984h-2.969v-1.016h2.969v1.016z"></path>
+</svg>
+<svg id="icon-template" width="16" height="16" viewBox="0 0 16 16" x="0" y="105">
+<path fill="#009688" d="M8.824 4.504h-8.504v8.536h8.504v-8.536zM6.632 10.84h-0.68v-3.056l-1.056 3.056h-0.608l-1.048-3.104v3.104h-0.68v-4.28h0.952l0.992 2.976c0.048 0.144 0.088 0.264 0.12 0.376 0.040-0.12 0.088-0.264 0.144-0.424l1-2.92h0.872v4.272zM14.88 2.84l-2.024-2.032c-0.44-0.44-1.312-0.808-1.936-0.808h-6.8c-0.624 0-1.136 0.512-1.136 1.136v2.296h0.904v-2.296c0-0.12 0.104-0.224 0.224-0.224h6.8c0.064 0 0.144 0.008 0.224 0.024v3.616h3.6c0.016 0.080 0.024 0.528 0.024 0.6v9.712c0 0.12-0.104 0.224-0.224 0.224h-10.432c-0.12 0-0.224-0.104-0.224-0.224v-0.76h-0.904v0.76c0 0.624 0.512 1.136 1.136 1.136h10.432c0.624 0 1.136-0.512 1.136-1.136v-9.712c0-0.624-0.36-1.872-0.8-2.312zM12.056 3.64v-2.328c0.064 0.040 0.112 0.088 0.16 0.136l2.024 2.032c0.048 0.048 0.088 0.096 0.136 0.16h-2.32zM9.864 9.6h3.72v-1.064h-3.72v1.064zM9.864 11.736h3.72v-1.064h-3.72v1.064zM13.584 6.4h-3.72v1.064h3.72v-1.064z"></path>
+</svg>
+<svg id="icon-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="126">
+<path fill="#009688" d="M5.015 3.754l-0.708-0.585c-0.215-0.154-0.462-0.123-0.646 0.062l-3.569 4.492c-0.123 0.154-0.123 0.4 0 0.585l3.6 4.462c0.154 0.185 0.431 0.246 0.646 0.062l0.708-0.585c0.215-0.154 0.246-0.462 0.062-0.646l-2.892-3.6 2.923-3.6c0.123-0.185 0.092-0.462-0.123-0.646zM15.908 7.723l-3.6-4.462c-0.154-0.185-0.431-0.246-0.646-0.062l-0.708 0.585c-0.215 0.154-0.246 0.462-0.062 0.646l2.923 3.6-2.923 3.6c-0.154 0.185-0.123 0.492 0.062 0.646l0.708 0.585c0.215 0.154 0.462 0.123 0.646-0.062l3.6-4.492c0.123-0.215 0.123-0.431 0-0.585zM9.723 3.323l-0.923-0.215c-0.246-0.062-0.523 0.092-0.585 0.338l-2.277 8.738c-0.062 0.246 0.092 0.492 0.338 0.554l0.923 0.215c0.246 0.062 0.523-0.092 0.585-0.338l2.277-8.738c0.062-0.277-0.092-0.492-0.338-0.554z"></path>
+</svg>
+<svg id="icon-crop" width="16" height="16" viewBox="0 0 16 16" x="0" y="147">
+<path fill="#009688" d="M13.585 0.288c1.548 1.972 0.581 3.752 0.581 3.752l-6.049 7.649s-4.161-4.761-5.855-7.12c-1.693-2.356 0.099-4.569 0.099-4.569l5.757 7.312 5.467-7.023zM8.074 10.223c0.469 0 0.846-0.378 0.846-0.842 0-0.224-0.090-0.439-0.249-0.597s-0.374-0.246-0.598-0.246c-0.467 0-0.848 0.377-0.848 0.842s0.381 0.842 0.848 0.842zM11.641 10.395c0.746-0.002 1.462 0.292 1.989 0.818s0.827 1.24 0.829 1.985c-0.002 0.746-0.3 1.459-0.829 1.985s-1.244 0.819-1.989 0.817c-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.3-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM11.641 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001zM4.575 10.395c0.746-0.002 1.461 0.292 1.989 0.818s0.826 1.24 0.829 1.985c-0.005 1.552-1.266 2.807-2.818 2.802-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.299-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM4.575 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001z"></path>
+</svg>
+<svg id="icon-copy" width="16" height="16" viewBox="0 0 16 16" x="0" y="168">
+<path fill="#009688" d="M3 10h7v1h-7v-1z"></path>
+<path fill="#009688" d="M3 8h7v1h-7v-1z"></path>
+<path fill="#009688" d="M3 12h4v1h-4v-1z"></path>
+<path fill="#009688" d="M14 0h-9c-1.1 0-2 0.9-2 2h1c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9c0 0.6-0.4 1-1 1v1c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2z"></path>
+<path fill="#009688" d="M3 6h7v1h-7v-1z"></path>
+<path fill="#009688" d="M11 3h-9c-1.1 0-2 0.9-2 2v9c0 1.1 0.9 2 2 2h9c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2zM12 14c0 0.6-0.4 1-1 1h-9c-0.6 0-1-0.4-1-1v-9c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9z"></path>
+</svg>
+<svg id="icon-paste" width="16" height="16" viewBox="0 0 16 16" x="0" y="189">
+<path fill="#009688" d="M13.644 7h-5.288c-1.298 0-2.356 1.056-2.356 2.356v4.288c0 1.298 1.056 2.356 2.356 2.356h5.289c1.298 0 2.356-1.056 2.356-2.356v-4.289c-0.002-1.298-1.058-2.355-2.358-2.355zM15 13.644c0 0.747-0.608 1.356-1.356 1.356h-5.288c-0.747 0-1.356-0.608-1.356-1.356v-4.289c0-0.747 0.608-1.356 1.356-1.356h5.289c0.747 0 1.356 0.608 1.356 1.356v4.289h-0.002z"></path>
+<path fill="#009688" d="M4.453 13h-2.434c-0.561 0-1.019-0.456-1.019-1.019v-9.963c0-0.561 0.456-1.019 1.019-1.019h8.962c0.561 0 1.019 0.456 1.019 1.019v3.497c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-3.497c0-1.112-0.906-2.019-2.019-2.019h-8.963c-1.112 0-2.019 0.905-2.019 2.019v9.962c0 1.113 0.906 2.019 2.019 2.019h2.434c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+<path fill="#009688" d="M10.5 3h-8c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h8c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM5.5 6h-3c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h3c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM4.5 9h-2c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h2c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+</svg>
+<svg id="icon-paste-text" width="16" height="16" viewBox="0 0 16 16" x="0" y="210">
+<path fill="#009688" d="M10.5 2h-2v-1c0-0.551-0.45-1-1-1h-2c-0.549 0-1 0.45-1 1v1h-2v2.278h7.999v-2.278zM7.5 2h-2v-0.998c0.001 0 0.001-0.001 0.002-0.001h1.996c0.001 0 0.001 0.001 0.002 0.001l-0.001 0.998zM8.17 9.529h1.972v3.834h1.005v-3.834h1.967v-1.005h-4.943z"></path>
+<path fill="#009688" d="M12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.816h-0.012v1.928h-8.992v-1.743h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.651c0 0.275 0.225 0.5 0.5 0.5h4.772v1.347l9.727 0.001v-10.118h-3zM6.773 14.999v-8.118h7.726l0.003 8.117-7.729 0.001z"></path>
+</svg>
+<svg id="icon-paste-word" width="16" height="16" viewBox="0 0 16 16" x="0" y="231">
+<path fill="#009688" d="M13.628 8.819v0.146c-0.195 0.017-0.34 0.154-0.437 0.413l-1.238 3.691h-0.17l-1.044-2.865h-0.024l-1.141 2.865h-0.17l-1.311-3.691c-0.081-0.259-0.227-0.396-0.437-0.413v-0.146h1.821v0.146c-0.275 0.017-0.405 0.105-0.389 0.267 0 0.081 0.016 0.154 0.049 0.219l0.59 1.788 0.718-1.799-0.046-0.257c-0.097-0.13-0.251-0.202-0.461-0.219v-0.146h1.942v0.146c-0.032 0.017-0.057 0.024-0.073 0.024-0.276 0-0.397 0.073-0.364 0.219 0 0.033 0.008 0.105 0.025 0.219 0.016 0.065 0.032 0.105 0.048 0.121l0.572 1.679 0.534-1.806c0.016-0.032 0.084-0.421-0.062-0.432-0.017-0.001-0.033-0.008-0.049-0.024v-0.146h1.117zM10.5 2h-2v-1c0-0.55-0.45-1-1-1h-2c-0.55 0-1 0.45-1 1v1h-2v2.278h8v-2.278zM7.5 2h-2v-0.998l0.002-0.002h1.997c0 0.001 0.002 0.001 0.002 0.002l-0 0.998zM12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.815h-0.011v1.928h-8.992v-1.744h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.652c0 0.275 0.225 0.5 0.5 0.5h4.773v1.348l9.727 0.001v-10.118h-3zM6.773 14.999v-8.117h7.727l0.003 8.117h-7.729z"></path>
+</svg>
+<svg id="icon-left-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="252">
+<path fill="#009688" d="M1.148 0h13.704c0.624 0 1.123 0.499 1.123 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.679c-0.649-0.025-1.148-0.524-1.148-1.148 0-0.649 0.499-1.148 1.148-1.148zM1.148 4.568h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 9.136h13.704c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.704c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 13.704h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.649-0.025-1.148-0.524-1.148-1.173 0-0.624 0.499-1.123 1.148-1.123z"></path>
+</svg>
+<svg id="icon-center-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="273">
+<path fill="#009688" d="M1.953 3.11q-0.407 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.281h11.719q0.406 0 0.688 0.281t0.281 0.688-0.281 0.696-0.688 0.289h-11.719zM11.719 5.063q0.406 0 0.688 0.282t0.281 0.688-0.281 0.696-0.688 0.289h-7.813q-0.406 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.282h7.813zM13.672 8.953q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-11.719q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h11.719zM11.719 12.86q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-7.813q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h7.813z"></path>
+</svg>
+<svg id="icon-right-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="294">
+<path fill="#009688" d="M3.497 10.966c-0.249-0.002-0.529-0.062-0.737-0.19-0.382-0.234-0.488-0.667-0.349-1.095 0.142-0.437 0.484-0.671 1.071-0.672 3.574-0.006 7.149-0.006 10.723 0.005 0.236 0.001 0.5 0.070 0.701 0.19 0.374 0.222 0.5 0.672 0.371 1.090-0.132 0.428-0.468 0.674-0.974 0.676-1.822 0.006-3.643 0.002-5.465 0.002-1.78 0-3.561 0.008-5.341-0.008zM14.228 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.795-0 3.589-0.002 5.383 0.001zM9.344 6.983c-1.63 0-3.26 0.004-4.89-0.002-0.662-0.002-1.097-0.402-1.095-0.98 0.001-0.58 0.436-0.993 1.093-0.994 3.26-0.006 6.52-0.008 9.78 0.007 0.245 0.001 0.521 0.098 0.727 0.235 0.35 0.232 0.448 0.677 0.309 1.074-0.144 0.412-0.47 0.654-0.951 0.656-1.658 0.007-3.315 0.003-4.973 0.003v0.002zM14.279 13.022c0.627 0.003 1.053 0.418 1.049 0.983-0.004 0.563-0.437 0.98-1.058 0.981-3.287 0.005-5.935 0.007-9.222-0.008-0.231-0.001-0.492-0.098-0.685-0.23-0.343-0.234-0.441-0.681-0.305-1.078 0.137-0.4 0.477-0.646 0.958-0.648 1.657-0.007 2.675-0.003 4.332-0.003 1.644-0 3.287-0.006 4.931 0.002z"></path>
+</svg>
+<svg id="icon-both-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="315">
+<path fill="#009688" d="M14.148 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 13.040c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 8.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.002 7.105-0.002 1.794-0 3.589-0.002 5.383 0.001zM14.148 4.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001z"></path>
+</svg>
+<svg id="icon-ol" width="16" height="16" viewBox="0 0 16 16" x="0" y="336">
+<path fill="#009688" d="M7.111 1.778h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889z"></path>
+<path fill="#009688" d="M15.111 4.711h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M15.111 9.511h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M15.111 14.222h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M2.578 0.533h-0.8l-1.689 0.889 0.267 0.889 1.244-0.711v3.733h-1.333v0.889h3.556v-0.889h-1.244z"></path>
+<path fill="#009688" d="M2.222 13.956c0.178-0.178 0.444-0.444 0.622-0.622s0.356-0.356 0.444-0.533c0.089-0.178 0.178-0.356 0.267-0.533s0.089-0.356 0.089-0.622c0-0.267-0.089-0.622-0.178-0.8-0.089-0.267-0.267-0.356-0.356-0.533s-0.444-0.267-0.622-0.356c-0.178-0.089-0.444-0.089-0.711-0.089-0.356 0-0.711 0.089-0.978 0.178-0.267 0.178-0.622 0.356-0.8 0.622l0.444 0.622c0.178-0.178 0.356-0.267 0.533-0.444s0.444-0.178 0.622-0.178c0.178 0 0.356 0 0.444 0s0.267 0.089 0.267 0.267 0.178 0.178 0.178 0.356 0.089 0.267 0.089 0.356c0 0.178 0 0.267 0 0.444s-0.089 0.267-0.178 0.356-0.178 0.267-0.356 0.444-0.356 0.444-0.533 0.711l-1.511 1.244v0.889h3.733v-0.889h-2.4l0.889-0.889z"></path>
+</svg>
+<svg id="icon-ul" width="16" height="16" viewBox="0 0 16 16" x="0" y="357">
+<path fill="#009688" d="M15.111 13.333h-8.889c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M6.222 2.667h8.889c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889z"></path>
+<path fill="#009688" d="M15.111 7.111h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M0 1.778c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#009688" d="M0 8c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#009688" d="M0 14.222c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+</svg>
+<svg id="icon-right-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="378">
+<path fill="#009688" d="M0 1.882h17.488v-1.882h-17.488zM7.511 5.412h9.977v-1.883h-9.977zM7.511 8.941h9.977v-1.883h-9.977zM7.511 12.471h9.977v-1.883h-9.977zM0 16h17.488v-1.882h-17.488zM0 11.572v-6.627l4.418 3.314z"></path>
+</svg>
+<svg id="icon-left-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="399">
+<path fill="#009688" d="M0 1.883h17.488v-1.883h-17.488v1.883zM7.511 5.412h9.977v-1.883h-9.977v1.883zM7.511 8.941h9.977v-1.883h-9.977v1.883zM7.511 12.471h9.977v-1.883h-9.977v1.883zM0 16h17.488v-1.883h-17.488v1.883zM4.418 11.572v-6.627l-4.418 3.314 4.418 3.313z"></path>
+</svg>
+<svg id="icon-down-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="420">
+<path fill="#009688" d="M13.331 13.511v1.089h2.669v1.4h-4.001v-3.189l2.664-1.309v-1.089h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-up-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="441">
+<path fill="#009688" d="M13.331 4.492v1.095h2.669v1.394h-4.001v-3.183l2.664-1.309v-1.095h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-clear-format" width="16" height="16" viewBox="0 0 16 16" x="0" y="462">
+<path fill="#009688" d="M11.163 3.197l3.005-1.734 1.43 1.763-2.248 2.491zM8.877 2.251c0.879 0.108 5.156 5.318 5.046 5.904s-2.497 2.206-2.497 2.206l-5.417-6.229c-0 0 1.989-1.988 2.868-1.88zM5.491 4.897l5.23 6.088-3.209 4.173-7.247-9.178s1.436-0.060 2.633-0.374c0.783-0.206 2.593-0.709 2.593-0.709z"></path>
+</svg>
+<svg id="icon-selectall" width="16" height="16" viewBox="0 0 16 16" x="0" y="483">
+<path fill="#009688" d="M7.272 8.96c-0.216 0-0.416-0.080-0.568-0.232l-3.136-3.144c-0.112-0.112-0.176-0.264-0.176-0.416 0-0.16 0.064-0.304 0.176-0.416s0.264-0.176 0.416-0.176c0.16 0 0.304 0.064 0.416 0.176l2.872 2.872 6.104-6.104c0.112-0.112 0.264-0.176 0.416-0.176 0.16 0 0.304 0.064 0.416 0.176 0.232 0.232 0.232 0.608 0 0.84l-6.368 6.368c-0.152 0.152-0.352 0.232-0.568 0.232z"></path>
+<path fill="#009688" d="M2 12.76c-0.256 0-0.496-0.104-0.68-0.28-0.184-0.184-0.28-0.424-0.28-0.68v-9.776c0-0.256 0.104-0.496 0.28-0.68 0.184-0.184 0.424-0.28 0.68-0.28h6.776c0.328 0 0.592 0.264 0.592 0.592s-0.264 0.592-0.592 0.592h-6.552v9.328h8.92v-4.304c0-0.328 0.272-0.6 0.6-0.6s0.6 0.272 0.6 0.6v4.528c0 0.256-0.104 0.496-0.28 0.68-0.184 0.184-0.424 0.28-0.68 0.28h-9.384z"></path>
+<path fill="#009688" d="M5 15.016c-0.328 0-0.592-0.264-0.592-0.592s0.264-0.592 0.592-0.592l8.808-0.008v-7.68c0-0.328 0.264-0.592 0.592-0.592 0.16 0 0.312 0.064 0.424 0.176s0.176 0.264 0.176 0.424l-0.008 8.008c0 0.472-0.384 0.848-0.856 0.848l-9.136 0.008z"></path>
+</svg>
+<svg id="icon-paiban" width="16" height="16" viewBox="0 0 16 16" x="0" y="504">
+<path fill="#009688" d="M15.176 12.792l-5.48-4.8c-0.304-0.264-0.76-0.232-1.024 0.072l-1.552 1.776c-0.264 0.304-0.232 0.76 0.064 1.024l2.16 1.888 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.776 0.68 0.36-0.416 0.424-0.48c0.088-0.104 0.24-0.112 0.344-0.024l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.424 0.48-0.36 0.416 0.776 0.68 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.616 0.544c0.304 0.264 0.76 0.232 1.024-0.072l1.56-1.776c0.264-0.32 0.232-0.776-0.072-1.040zM9.76 9.944c-0.176 0.2-0.488 0.208-0.704 0.024s-0.248-0.496-0.072-0.696c0.176-0.2 0.488-0.208 0.704-0.024s0.248 0.496 0.072 0.696z"></path>
+<path fill="#009688" d="M5.784 10.824h-2.928c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.552 0.552-0.552h3.096l0.944-1.112h-4.040c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.56 0.552-0.56h4.984l0.472-0.56c0.344-0.4 0.952-0.456 1.352-0.112l2.632 2.232v-6.016l-0.072-0.072v-0.008l-2.88-2.88h-7.784c-0.816 0-1.48 0.664-1.48 1.48v10.744c0 0.816 0.664 1.48 1.48 1.48h7.6l-3.144-2.664c-0.096-0.080-0.176-0.184-0.232-0.296zM2.856 3.040h3.704c0.304 0 0.552 0.248 0.552 0.552s-0.248 0.552-0.552 0.552h-3.704c-0.304 0-0.552-0.248-0.552-0.552 0-0.296 0.248-0.552 0.552-0.552zM2.856 5.264h6.664c0.304 0 0.552 0.248 0.552 0.56 0 0.304-0.248 0.552-0.552 0.552h-6.664c-0.304 0-0.552-0.248-0.552-0.552 0-0.312 0.248-0.56 0.552-0.56z"></path>
+</svg>
+<svg id="icon-full-screen" width="16" height="16" viewBox="0 0 16 16" x="0" y="525">
+<path fill="#009688" d="M14.872 1.258c-0.094-0.094-0.219-0.145-0.352-0.145h-0.002l-4.502 0.017c-0.275 0.002-0.497 0.223-0.497 0.5 0.002 0.273 0.223 0.497 0.498 0.497h0.002l3.175-0.013-3.423 3.45c-0.194 0.194-0.192 0.511 0.003 0.705 0.097 0.097 0.223 0.145 0.35 0.145 0.128 0 0.256-0.050 0.353-0.148l3.545-3.572v3.22c0 0.275 0.222 0.498 0.498 0.498 0.275 0 0.498-0.222 0.498-0.498v-4.303c-0.002-0.133-0.055-0.259-0.148-0.353zM1.239 1.238c0.094-0.094 0.219-0.145 0.352-0.145h0.002l4.502 0.019c0.275 0.002 0.497 0.225 0.497 0.5-0.002 0.273-0.223 0.497-0.498 0.497h-0.002l-3.177-0.014 3.425 3.45c0.194 0.194 0.192 0.511-0.003 0.705-0.097 0.097-0.223 0.145-0.35 0.145-0.128 0-0.256-0.050-0.353-0.148l-3.545-3.572v3.22c0 0.275-0.222 0.498-0.498 0.498s-0.498-0.222-0.498-0.498v-4.303c0.002-0.131 0.055-0.259 0.148-0.353zM14.872 14.881c-0.094 0.094-0.219 0.145-0.352 0.145h-0.002l-4.502-0.017c-0.275-0.002-0.497-0.225-0.497-0.5 0.002-0.273 0.223-0.497 0.498-0.497h0.002l3.175 0.012-3.423-3.448c-0.194-0.194-0.192-0.511 0.003-0.705 0.097-0.097 0.223-0.145 0.35-0.145 0.128 0 0.256 0.050 0.353 0.148l3.545 3.57v-3.22c0-0.275 0.222-0.498 0.498-0.498 0.275 0 0.498 0.222 0.498 0.498v4.303c-0.002 0.133-0.055 0.259-0.148 0.353zM1.223 14.886c0.094 0.094 0.219 0.145 0.352 0.145h0.002l4.502-0.017c0.275-0.002 0.497-0.225 0.497-0.5-0.002-0.273-0.223-0.497-0.498-0.497h-0.002l-3.175 0.012 3.425-3.45c0.194-0.194 0.192-0.511-0.003-0.705-0.097-0.097-0.223-0.145-0.35-0.145-0.128 0-0.256 0.050-0.353 0.148l-3.547 3.572v-3.22c0-0.275-0.222-0.498-0.498-0.498s-0.498 0.222-0.498 0.498v4.303c0.002 0.133 0.055 0.259 0.148 0.353z"></path>
+</svg>
+<svg id="icon-title" width="16" height="16" viewBox="0 0 16 16" x="0" y="546">
+<path fill="#009688" d="M1.815 2.089v4.803h1.332v-4.803h1.815v-1.089h-4.962v1.089h1.815zM6.443 1.966v-0.966h-1.205v0.966h1.205zM5.239 2.626v4.267h1.205v-4.267h-1.205zM8.594 2.626v-1.279h-1.205v1.279h-0.73v0.784h0.73v2.517c0 0.215 0.037 0.388 0.11 0.52s0.174 0.234 0.301 0.305c0.127 0.072 0.274 0.12 0.441 0.144s0.344 0.037 0.53 0.037c0.119 0 0.24-0.003 0.365-0.008s0.238-0.016 0.339-0.033v-0.908c-0.057 0.011-0.116 0.019-0.178 0.025s-0.127 0.008-0.195 0.008c-0.204 0-0.339-0.033-0.407-0.099s-0.102-0.198-0.102-0.396v-2.113h0.882v-0.784h-0.882zM9.761 1v5.893h1.205v-5.893h-1.205zM14.541 4.301h-1.96c0.006-0.083 0.024-0.176 0.055-0.281s0.085-0.204 0.161-0.297c0.076-0.094 0.178-0.172 0.305-0.235s0.287-0.095 0.479-0.095c0.294 0 0.513 0.077 0.657 0.231s0.245 0.38 0.301 0.677v0zM12.581 5.044h3.164c0.023-0.33-0.006-0.646-0.085-0.949s-0.208-0.572-0.386-0.809c-0.178-0.237-0.406-0.425-0.683-0.565s-0.602-0.21-0.976-0.21c-0.334 0-0.638 0.058-0.912 0.173s-0.51 0.274-0.708 0.475c-0.198 0.201-0.351 0.439-0.458 0.714s-0.161 0.572-0.161 0.891c0 0.33 0.052 0.633 0.157 0.908s0.253 0.512 0.445 0.71c0.192 0.198 0.427 0.351 0.704 0.458s0.588 0.161 0.933 0.161c0.498 0 0.922-0.11 1.272-0.33s0.611-0.586 0.78-1.098h-1.060c-0.040 0.132-0.147 0.257-0.322 0.376s-0.385 0.177-0.628 0.177c-0.339 0-0.599-0.085-0.78-0.256s-0.28-0.446-0.297-0.825zM0 9h16v1h-16v-1zM0 12h16v1h-16v-1zM0 15h12v1h-12v-1z"></path>
+</svg>
+<svg id="icon-font" width="16" height="16" viewBox="0 0 16 16" x="0" y="567">
+<path fill="#009688" d="M0.32 1.436v3.661h0.448c0.149-0.971 0.523-1.793 1.195-2.316 0.374-0.374 1.046-0.598 2.017-0.598h1.046v10.386c0 0.672-0.075 1.121-0.149 1.27-0.075 0.224-0.224 0.374-0.448 0.448-0.224 0.149-0.598 0.224-0.971 0.224h-0.448v0.374h7.472v-0.374h-0.448c-0.448 0-0.747-0.075-0.971-0.224s-0.374-0.299-0.448-0.448-0.149-0.598-0.149-1.27v-10.386h1.046c0.672 0 1.121 0.075 1.42 0.149 0.448 0.224 0.822 0.523 1.121 0.897s0.523 0.971 0.747 1.793h0.374v-3.586h-12.851z"></path>
+<path fill="#009688" d="M8.533 6.286v2.341h0.254c0.085-0.621 0.296-1.146 0.676-1.481 0.211-0.239 0.592-0.382 1.141-0.382h0.592v6.64c0 0.43-0.042 0.716-0.085 0.812-0.042 0.143-0.127 0.239-0.254 0.287-0.127 0.095-0.338 0.143-0.549 0.143h-0.254v0.239h4.225v-0.239h-0.253c-0.254 0-0.423-0.048-0.549-0.143s-0.211-0.191-0.254-0.287c-0.042-0.095-0.084-0.382-0.084-0.812v-6.64h0.592c0.38 0 0.634 0.048 0.803 0.096 0.255 0.145 0.467 0.338 0.63 0.567l0.004 0.006c0.169 0.239 0.296 0.621 0.423 1.146h0.211v-2.293h-7.268z"></path>
+</svg>
+<svg id="icon-fontsize" width="16" height="16" viewBox="0 0 16 16" x="0" y="588">
+<path fill="#009688" d="M10.75 12.432l2.663 3.141 2.674-3.141z"></path>
+<path fill="#009688" d="M2.979 7.234l1.53-4.933 1.534 4.933h-3.064zM5.888 0.408h-2.332l-3.489 11.051h1.617l0.825-2.63h4.042l0.839 2.63h2.025l-3.527-11.051z"></path>
+<path fill="#009688" d="M9.553 8.899l0.888-2.357 0.888 2.357h-1.776zM11.238 5.444h-1.351l-1.085 2.927 0.47 1.475 0.007-0.021h2.342l0.487 1.522h1.171l-2.041-5.903z"></path>
+</svg>
+<svg id="icon-fontcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="609">
+<path fill="#009688" d="M1.051 12.486v2.105h9.121l2.105-2.105h-11.226zM11.575 14.591h3.508v-3.508l-3.508 3.508z"></path>
+<path fill="#009688" d="M12.338 12.135h-1.766l-1.437-3.369h-4.42l-1.423 3.369h-1.802l4.631-10.705h1.66l4.558 10.705zM8.565 7.275l-1.625-3.615-1.639 3.615h3.264z"></path>
+</svg>
+<svg id="icon-font-bgcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="630">
+<path fill="#009688" d="M4.068 9.652c-0.151 0.146-0.226 0.351-0.226 0.614 0 0.231 0.082 0.42 0.246 0.566s0.38 0.219 0.649 0.219c0.374 0 0.683-0.132 0.926-0.395s0.364-0.594 0.364-0.991v-0.465l-1.136 0.154c-0.398 0.053-0.672 0.152-0.823 0.298zM12.953 1.452h-9.984c-1.103 0-1.997 0.894-1.997 1.997v8.985c0 1.103 0.894 1.997 1.997 1.997h9.984c1.103 0 1.997-0.894 1.997-1.997v-8.985c0-1.103-0.894-1.997-1.997-1.997zM6.879 11.635h-0.851v-0.75h-0.022c-0.336 0.576-0.832 0.864-1.487 0.864-0.471 0-0.845-0.127-1.123-0.382s-0.417-0.598-0.417-1.031c0-0.907 0.537-1.435 1.61-1.584l1.439-0.202c0-0.793-0.328-1.189-0.983-1.189-0.582 0-1.113 0.196-1.593 0.588v-0.829c0.483-0.301 1.040-0.452 1.672-0.452 1.17 0 1.755 0.614 1.755 1.843v3.124zM12.26 11.023c-0.402 0.484-0.938 0.726-1.608 0.726-0.632 0-1.113-0.266-1.443-0.799h-0.018v0.684h-0.86v-7.182h0.86v3.168h0.018c0.38-0.635 0.936-0.952 1.667-0.952 0.608 0 1.092 0.214 1.45 0.643s0.538 1.014 0.538 1.757c0 0.819-0.201 1.47-0.603 1.955zM10.638 7.38c-0.421 0-0.769 0.151-1.042 0.452s-0.41 0.684-0.41 1.15v0.658c0 0.392 0.127 0.723 0.382 0.994s0.573 0.406 0.956 0.406c0.456 0 0.813-0.175 1.071-0.526s0.386-0.836 0.386-1.457c0-0.512-0.12-0.919-0.36-1.222s-0.567-0.454-0.983-0.454z"></path>
+</svg>
+<svg id="icon-b" width="16" height="16" viewBox="0 0 16 16" x="0" y="651">
+<path fill="#009688" d="M12.615 5.846c0-1.846-1.477-3.385-3.231-3.385h-5.077c-0.338 0-0.615 0.277-0.615 0.615v10.154c0 0.338 0.277 0.615 0.615 0.615h5.077c1.754 0 3.231-1.538 3.231-3.385 0-0.892-0.338-1.692-0.892-2.308 0.554-0.615 0.892-1.415 0.892-2.308zM9.385 11.692h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231zM9.385 7.077h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231z"></path>
+</svg>
+<svg id="icon-italic" width="16" height="16" viewBox="0 0 16 16" x="0" y="672">
+<path fill="#009688" d="M11.692 3.785v-0.4c0-0.338-0.277-0.615-0.615-0.615h-4.308c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615 0.523 0 0.923 0.492 0.8 0.985l-1.108 5.415c-0.092 0.4-0.431 0.677-0.8 0.677h-0.738c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615h4.308c0.338 0 0.615-0.277 0.615-0.615v-0.615c0-0.338-0.277-0.615-0.615-0.615-0.523 0-0.923-0.492-0.8-0.985l1.108-5.415c0.092-0.4 0.431-0.677 0.8-0.677h0.523c0.462 0 0.831-0.369 0.831-0.831z"></path>
+</svg>
+<svg id="icon-underline" width="16" height="16" viewBox="0 0 16 16" x="0" y="693">
+<path fill="#009688" d="M13.692 12.923h-11.385c-0.246 0-0.462 0.215-0.462 0.462v0.923c0 0.246 0.215 0.462 0.462 0.462h11.385c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462zM7.785 11.692c-2.308-0.123-4.092-2.123-4.092-4.431v-4.185c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.215c0 1.323 0.985 2.462 2.308 2.554 1.446 0.092 2.615-1.046 2.615-2.462v-4.308c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.308c0 2.462-2.062 4.431-4.523 4.308z"></path>
+</svg>
+<svg id="icon-strickout" width="16" height="16" viewBox="0 0 16 16" x="0" y="714">
+<path fill="#009688" d="M3.723 5.569c-0.062-0.308-0.092-0.677-0.092-1.046 0-0.4 0.092-0.862 0.277-1.292 0.185-0.462 0.462-0.892 0.862-1.262 0.369-0.369 0.892-0.708 1.477-0.954 0.615-0.246 1.323-0.4 2.185-0.4 0.769 0 1.508 0.092 2.215 0.308 0.554 0.185 1.077 0.492 1.538 0.923 0.185 0.185 0.185 0.492-0.031 0.677l-0.831 0.769c-0.185 0.154-0.462 0.185-0.646 0-0.215-0.215-0.462-0.4-0.738-0.554-0.431-0.215-0.923-0.338-1.508-0.338-0.523 0-0.985 0.062-1.323 0.215s-0.646 0.308-0.862 0.554-0.369 0.462-0.462 0.708-0.123 0.492-0.123 0.677c0 0.338 0.062 0.615 0.154 0.862 0.092 0.215-0.062 0.431-0.277 0.431h-1.508c-0.154 0-0.277-0.154-0.308-0.277zM12.277 10.154h-1.538c-0.215 0-0.369 0.215-0.277 0.4s0.123 0.431 0.123 0.677c0 0.369-0.092 0.708-0.246 1.015-0.185 0.308-0.4 0.523-0.677 0.738-0.277 0.185-0.585 0.338-0.923 0.431s-0.646 0.154-0.985 0.154c-0.585 0-1.138-0.123-1.662-0.369-0.4-0.185-0.738-0.431-1.046-0.769-0.154-0.185-0.462-0.215-0.646-0.062l-0.862 0.738c-0.185 0.154-0.215 0.462-0.031 0.646 0.431 0.492 0.985 0.862 1.631 1.108 0.8 0.308 1.662 0.462 2.585 0.462 0.677 0 1.323-0.092 1.908-0.308 0.585-0.185 1.108-0.492 1.569-0.862 0.431-0.369 0.8-0.831 1.046-1.385s0.4-1.138 0.4-1.815c0-0.246 0-0.4-0.031-0.615-0.062-0.062-0.185-0.185-0.338-0.185zM15.354 7.354c-0.062-0.185-0.246-0.277-0.431-0.277h-13.846c-0.215 0-0.369 0.092-0.431 0.277-0.031 0.062-0.031 0.092-0.031 0.154v0.923c0 0.246 0.215 0.492 0.462 0.492h13.846c0.246 0 0.462-0.246 0.462-0.492v-0.923c0-0.062 0-0.092-0.031-0.154z"></path>
+</svg>
+<svg id="icon-line-height" width="16" height="16" viewBox="0 0 16 16" x="0" y="735">
+<path fill="#009688" d="M2.499 11.902v-7.682c-0.166 0-0.326 0.009-0.485-0.002-0.265-0.019-0.339-0.2-0.178-0.467 0.254-0.423 0.52-0.837 0.79-1.245 0.145-0.219 0.377-0.212 0.522 0.009 0.262 0.398 0.521 0.801 0.767 1.214 0.055 0.093 0.087 0.254 0.063 0.359-0.016 0.067-0.153 0.115-0.239 0.126-0.153 0.020-0.308 0.006-0.469 0.006v7.672c0.15 0 0.298-0.017 0.444 0.006 0.097 0.015 0.246 0.062 0.266 0.138 0.027 0.104-0.021 0.274-0.080 0.375-0.236 0.397-0.486 0.781-0.737 1.164-0.17 0.26-0.396 0.258-0.566-0.005-0.25-0.384-0.492-0.775-0.737-1.163-0.022-0.035-0.044-0.075-0.061-0.118l-0.002-0.005c-0.088-0.217-0.034-0.357 0.161-0.375 0.176-0.016 0.353-0.003 0.543-0.003z"></path>
+<path fill="#009688" d="M14.841 0v1.166h-13.69v-1.166zM14.849 14.834v1.166h-13.69v-1.166zM10.056 2.956l4.172 10.602h-1.321l-1.129-2.97h-4.871l-1.128 2.97h-1.307l4.173-10.602zM11.392 9.563l-2.004-5.3h-0.059l-2.034 5.3z"></path>
+</svg>
+<svg id="icon-clear-html" width="16" height="16" viewBox="0 0 16 16" x="0" y="756">
+<path fill="#009688" d="M10.175 3.11c-0.106-0.106-0.279-0.106-0.385 0l-8.625 8.625c-0.106 0.106-0.106 0.279 0 0.385l1.678 1.678c0.106 0.106 0.315 0.192 0.464 0.192h5.374c0.15 0 0.358-0.087 0.464-0.192l5.666-5.666c0.106-0.106 0.106-0.279 0-0.385l-4.636-4.636zM8.612 12.774c-0.106 0.106-0.315 0.192-0.464 0.192h-4.161c-0.15 0-0.358-0.087-0.464-0.192l-0.791-0.791c-0.106-0.106-0.106-0.279 0-0.385l3.162-3.162c0.106-0.106 0.279-0.106 0.385 0l3.143 3.143c0.106 0.106 0.106 0.279 0 0.385l-0.81 0.81z"></path>
+</svg>
+<svg id="icon-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="777">
+<path fill="#009688" d="M15.385 3.077c0-0.677-0.554-1.231-1.231-1.231h-12.308c-0.677 0-1.231 0.554-1.231 1.231v9.846c0 0.677 0.554 1.231 1.231 1.231h12.308c0.677 0 1.231-0.554 1.231-1.231v-9.846zM12.185 11.692h-8.923c-0.369 0-0.585-0.4-0.4-0.708l2.708-4.708c0.123-0.215 0.4-0.215 0.523 0l1.631 2.8c0.123 0.185 0.4 0.215 0.523 0.031l1.323-1.908c0.123-0.185 0.4-0.185 0.523 0l2.431 3.877c0.185 0.277 0 0.615-0.338 0.615zM11.385 6.154c-0.677 0-1.231-0.554-1.231-1.231s0.554-1.231 1.231-1.231 1.231 0.554 1.231 1.231-0.554 1.231-1.231 1.231z"></path>
+</svg>
+<svg id="icon-multiple-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="798">
+<path fill="#009688" d="M13 1v12.033h-12v-12.033h12zM13 0h-12c-0.567 0-1 0.433-1 1v12.033c0 0.567 0.433 1 1 1h12.033c0.567 0 1-0.433 1-1v-12.033c-0.033-0.567-0.467-1-1.033-1z"></path>
+<path fill="#009688" d="M13 12.267c0.567-0.6 0.8-2.3 0.8-3.1 0-2.033-1.6-3.7-3.633-3.7-1.433 0-2.633 0.8-3.233 1.967-0.667 1.033-1.8 1.7-3.1 1.7-1.367 0-2.533-0.733-3.2-1.833-0.333 0.567-0.5 1.2-0.5 1.867 0 0.733 0.2 2.333 0.567 2.9v1.133h1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h2.1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h0.7v-0.933z"></path>
+<path fill="#009688" d="M2.767 4.233c0 0 0 0 0 0 0 0.7 0.567 1.267 1.267 1.267s1.267-0.567 1.267-1.267c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.7-0.567-1.267-1.267-1.267s-1.267 0.567-1.267 1.267c0 0 0 0 0 0v0z"></path>
+<path fill="#009688" d="M15.633 16h-9c-0.267 0-0.5-0.233-0.5-0.5s0.233-0.5 0.5-0.5h8.5v-8.5c0-0.267 0.233-0.5 0.5-0.5s0.5 0.233 0.5 0.5v9c0 0.267-0.233 0.5-0.5 0.5z"></path>
+</svg>
+<svg id="icon-graft" width="17" height="16" viewBox="0 0 17 16" x="0" y="819">
+<path fill="#009688" d="M16.407 3.584c0.106-0.333 0.388-1.214-0.194-1.628-0.171-0.118-0.382-0.188-0.61-0.188-0.013 0-0.026 0-0.039 0.001l0.002-0c-0.449 0-1.133 0.267-1.914 0.713-0.030-0.060-0.067-0.112-0.111-0.157l0 0c-1.435-1.432-3.417-2.318-5.605-2.318-4.379 0-7.93 3.548-7.935 7.926v0c-0 0.009-0 0.020-0 0.031 0 2.264 0.957 4.305 2.489 5.739l0.004 0.004c0.107 0.101 0.251 0.163 0.41 0.163 0.001 0 0.001 0 0.002 0h0.044c-0.291 0.29-0.604 0.557-0.938 0.8l-0.023 0.016c-0.155 0.11-0.255 0.289-0.255 0.491 0 0.279 0.19 0.513 0.448 0.581l0.004 0.001c0.631 0.152 1.356 0.239 2.102 0.239 0.004 0 0.008 0 0.011 0h-0.001c1.236 0 2.256-0.259 3.042-0.777v0.047c0 0.332 0.269 0.601 0.601 0.601v0c4.38-0.005 7.929-3.555 7.935-7.934v-0c0-0.008 0.001-0.018 0.001-0.028 0-0.332-0.269-0.601-0.601-0.601s-0.601 0.269-0.601 0.601c0 0.010 0 0.020 0.001 0.029l-0-0.001c-0.005 3.687-2.969 6.679-6.644 6.731l-0.005 0c0.617-0.614 0.933-1.306 0.906-1.993-0.017-0.336-0.114-0.646-0.272-0.916l0.005 0.009c0.166 0.056 0.358 0.088 0.557 0.088 0.004 0 0.007-0 0.011-0h-0.001c2.749-0.001 6.495-6.143 7.175-8.27zM4.521 13.81c0.268-0.47 1.21-1.992 2.168-1.992 0.209 0.006 0.402 0.071 0.563 0.18l-0.004-0.002c0.265 0.15 0.447 0.419 0.476 0.732l0 0.004c0.021 0.427-0.3 0.928-0.881 1.375s-1.457 0.695-2.549 0.695c-0.181 0-0.369-0.006-0.56-0.021 0.298-0.283 0.558-0.602 0.774-0.952l0.012-0.020zM8.754 9.025c1.072-2.589 5.206-5.632 6.574-6.016-0.129 0.493-0.567 1.583-1.553 3.158-1.643 2.599-3.549 4.486-4.55 4.486-0.003 0-0.007 0-0.010 0-0.167 0-0.317-0.071-0.422-0.185l-0-0c-0.299-0.299-0.312-0.786-0.039-1.443zM1.2 7.933c0-0.002 0-0.004 0-0.006 0-3.717 3.014-6.731 6.731-6.731 1.835 0 3.499 0.734 4.713 1.925l-0.001-0.001c-1.977 1.364-4.207 3.536-4.998 5.444-0.422 1.019-0.327 1.744-0.071 2.246-0.26-0.121-0.564-0.192-0.885-0.193h-0c-1.486 0-2.63 1.588-3.193 2.559-0.021-0.136-0.086-0.254-0.18-0.343l-0-0c-1.303-1.221-2.115-2.952-2.115-4.874 0-0.009 0-0.019 0-0.028v0.001z"></path>
+<path fill="#009688" d="M8.931 4.704c0.858 0 1.553-0.695 1.553-1.553s-0.695-1.553-1.553-1.553c-0.858 0-1.553 0.695-1.553 1.553v0c0 0.858 0.695 1.553 1.553 1.553v0zM8.931 3.504c-0.194 0-0.352-0.158-0.352-0.352s0.158-0.352 0.352-0.352c0.194 0 0.352 0.158 0.352 0.352v0c0 0.194-0.158 0.352-0.352 0.352v0zM5.394 9.012c0-0.858-0.695-1.553-1.553-1.553s-1.553 0.695-1.553 1.553c0 0.858 0.695 1.553 1.553 1.553v0c0.858 0 1.553-0.695 1.553-1.553v0zM3.841 8.659c0.002-0 0.004-0 0.006-0 0.194 0 0.352 0.158 0.352 0.352s-0.158 0.352-0.352 0.352c-0.194 0-0.352-0.158-0.352-0.352v0c0-0 0-0 0-0 0-0.193 0.155-0.349 0.347-0.352h0zM4.977 7.069c1.144 0 2.071-0.927 2.071-2.071s-0.927-2.071-2.071-2.071c-1.144 0-2.071 0.927-2.071 2.071v0c0 1.144 0.927 2.071 2.071 2.071v0zM4.977 4.123c0.482 0 0.872 0.391 0.872 0.872s-0.391 0.872-0.872 0.872c-0.482 0-0.872-0.391-0.872-0.872v0c0.001-0.481 0.391-0.87 0.872-0.871h0z"></path>
+</svg>
+<svg id="icon-flash" width="16" height="16" viewBox="0 0 16 16" x="0" y="840">
+<path fill="#009688" d="M8 0.889c-3.911 0-7.111 3.2-7.111 7.111s3.2 7.111 7.111 7.111 7.111-3.2 7.111-7.111-3.2-7.111-7.111-7.111zM11.556 5.956c-1.244-0.089-1.956 1.244-1.956 1.244l1.422 0.089v1.6h-2.044c-1.067 3.911-3.644 3.2-3.644 3.2v-1.333s1.511 0 2.311-2.756c1.156-4.356 3.911-3.467 3.911-3.467v1.422z"></path>
+</svg>
+<svg id="icon-vedio" width="16" height="16" viewBox="0 0 16 16" x="0" y="861">
+<path fill="#009688" d="M15.385 0.615h-0.615v1.231h-1.846v-1.231h-9.846v1.231h-1.846v-1.231h-0.615c-0.339 0-0.615 0.276-0.615 0.615v13.538c0 0.339 0.276 0.615 0.615 0.615h0.615v-0.615h1.846v0.615h9.846v-0.615h1.846v0.615h0.615c0.339 0 0.615-0.276 0.615-0.615v-13.538c0-0.339-0.276-0.615-0.615-0.615zM3.077 12.923h-1.846v-1.846h1.846v1.846zM3.077 9.231h-1.846v-1.846h1.846v1.846zM3.077 5.538h-1.846v-1.846h1.846v1.846zM10.823 8.404l-4.002 2.334c-0.065 0.033-0.137 0.048-0.207 0.048-0.085 0-0.167-0.023-0.242-0.067-0.135-0.082-0.218-0.228-0.218-0.385v-4.668c0-0.157 0.082-0.303 0.218-0.385 0.137-0.082 0.307-0.090 0.449-0.018l4.002 2.334c0.156 0.077 0.254 0.233 0.254 0.404s-0.098 0.327-0.254 0.404zM14.769 12.923h-1.846v-1.846h1.846v1.846zM14.769 9.231h-1.846v-1.846h1.846v1.846zM14.769 5.538h-1.846v-1.846h1.846v1.846z"></path>
+</svg>
+<svg id="icon-attach" width="16" height="16" viewBox="0 0 16 16" x="0" y="882">
+<path fill="#009688" d="M5.415 11.292c0.185 0.185 0.462 0.154 0.646 0l3.077-3.077c0.215-0.215 0.585-0.246 0.862 0s0.246 0.677 0 0.923l-3.785 3.723c-0.831 0.831-2.215 0.831-3.046 0l-0.031-0.031c-0.831-0.831-0.831-2.215 0-3.046l6.677-6.677c0.831-0.831 2.215-0.831 3.046 0l0.031 0.031c0.831 0.831 0.831 2.215 0 3.046l-0.031 0.031c-0.154 0.154-0.185 0.369-0.062 0.554 0.185 0.338 0.338 0.708 0.431 1.077 0.062 0.246 0.338 0.308 0.523 0.154 0.246-0.246 0.462-0.492 0.462-0.492 1.569-1.569 1.569-4.123 0-5.692h-0.062c-1.569-1.569-4.123-1.569-5.692 0l-6.677 6.646c-1.569 1.569-1.569 4.123 0 5.692l0.062 0.062c1.569 1.569 4.092 1.569 5.662 0l3.815-3.785c0.985-0.985 0.954-2.585-0.062-3.569-0.985-0.954-2.585-0.892-3.538 0.092l-3.015 3.015c-0.185 0.185-0.185 0.492 0 0.677l0.708 0.646z"></path>
+</svg>
+<svg id="icon-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="903">
+<path fill="#009688" d="M17.846 0h-17.231c-0.49 0-0.615 0.129-0.615 0.615v14.769c0 0.486 0.125 0.615 0.615 0.615h17.231c0.49 0 0.615-0.129 0.615-0.615v-14.769c0-0.486-0.125-0.615-0.615-0.615zM5.538 14.769l-4.328 0.051v-3.108l4.328-0.020v3.077zM5.538 10.462h-4.308v-3.077h4.308v3.077zM5.538 6.154h-4.308v-2.462h4.308v2.462zM11.692 14.769h-4.923v-3.077h4.923v3.077zM11.692 10.462h-4.923v-3.077h4.923v3.077zM11.692 6.154h-4.923v-2.462h4.923v2.462zM17.231 14.769h-4.308v-3.077h4.308v3.077zM17.231 10.462h-4.308v-3.077h4.308v3.077zM17.231 6.154h-4.308v-2.462h4.308v2.462z"></path>
+</svg>
+<svg id="icon-split" width="16" height="16" viewBox="0 0 16 16" x="0" y="924">
+<path fill="#009688" d="M14.222 12.412l-1.811 1.811h-1.022l2.833-2.833v1.022zM14.222 13.742v0.48h-0.48l0.48-0.48zM14.222 10.059l-4.164 4.164h-1.022l4.444-4.444h0.741v0.281zM12.15 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM9.796 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM7.444 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM5.091 9.778l-3.313 3.313v-1.012l2.3-2.3h1.013zM2.748 9.778l-0.97 0.97v-0.97h0.97zM14.222 3.078l-2.255 2.255h-1.022l3.277-3.277v1.022zM14.222 4.409v0.924h-0.924l0.924-0.924zM13.17 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM10.817 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM8.462 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM6.11 1.778l-3.556 3.556h-0.777v-0.244l3.311-3.311h1.022zM3.757 1.778l-1.98 1.98v-1.012l0.967-0.967h1.013zM0 7.111h16v0.889h-16v-0.889z"></path>
+</svg>
+<svg id="icon-face" width="16" height="16" viewBox="0 0 16 16" x="0" y="945">
+<path fill="#009688" d="M8 16c-4.417 0-8-3.58-8-7.993s3.583-8.007 8-8.007 8 3.594 8 8.007c0 4.413-3.583 7.993-8 7.993zM8 1c-3.865 0-7 3.145-7 7.006s3.135 6.994 7 6.994 7-3.132 7-6.994c0-3.861-3.135-7.006-7-7.006zM8 13c-2.419 0-4.436-1.718-4.899-4h1.041c0.446 1.722 1.997 3 3.859 3s3.412-1.278 3.858-3h1.041c-0.463 2.282-2.48 4-4.899 4zM11 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1zM5 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1z"></path>
+</svg>
+<svg id="icon-split-page" width="16" height="16" viewBox="0 0 16 16" x="0" y="966">
+<path fill="#009688" d="M14.25 1v4h-12.5v-4h1.042v3h10.417v-3zM1.75 15v-4h12.5v4h-1.041v-3h-10.417v3zM1 7h14v2h-14z"></path>
+</svg>
+<svg id="icon-anchor" width="16" height="16" viewBox="0 0 16 16" x="0" y="987">
+<path fill="#009688" d="M15.297 9.614l-1.117-1.117c-0.075-0.075-0.174-0.116-0.28-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l0.442-0.442c-0.107 1.281-0.667 2.486-1.579 3.399-0.925 0.925-2.149 1.487-3.45 1.583l-0-7.611 3.106-0c0.218 0 0.396-0.178 0.396-0.396s-0.178-0.396-0.396-0.396h-3.106v-4.407l2.781 2.781c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-3.434-3.434c-0.083-0.083-0.198-0.125-0.316-0.114-0.109-0.003-0.214 0.038-0.291 0.116l-3.434 3.434c-0.154 0.154-0.154 0.406 0 0.56 0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l2.781-2.781v4.405h-3.106c-0.218 0-0.396 0.178-0.396 0.396s0.178 0.396 0.396 0.396l3.106-0v7.613c-1.311-0.091-2.546-0.653-3.478-1.585-0.92-0.92-1.481-2.137-1.582-3.43l0.444 0.444c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-1.117-1.117c-0.075-0.075-0.174-0.116-0.279-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28 0.174 0.116 0.28 0.116c0.106 0 0.205-0.041 0.28-0.116l0.475-0.475c0.047 0.697 0.208 1.376 0.48 2.018 0.316 0.748 0.769 1.42 1.346 1.997s1.249 1.030 1.997 1.346c0.775 0.328 1.598 0.494 2.446 0.494s1.671-0.166 2.446-0.494c0.748-0.316 1.42-0.769 1.997-1.346s1.030-1.249 1.346-1.997c0.275-0.651 0.437-1.338 0.481-2.045l0.474 0.474c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116 0.116-0.174 0.116-0.28c0-0.106-0.041-0.205-0.116-0.28z"></path>
+</svg>
+<svg id="icon-link" width="16" height="16" viewBox="0 0 16 16" x="0" y="1008">
+<path fill="#009688" d="M8.369 12.831l-0.646-0.092s-0.431-0.092-0.646-0.185c-0.123-0.031-0.277 0-0.369 0.092l-0.154 0.154c-0.892 0.892-2.338 0.985-3.262 0.185-1.046-0.892-1.077-2.492-0.123-3.446l2.338-2.338c0.308-0.308 0.677-0.492 1.046-0.615 0.492-0.123 1.015-0.092 1.477 0.092 0.277 0.123 0.554 0.277 0.8 0.523 0.123 0.123 0.215 0.246 0.308 0.4 0.123 0.215 0.4 0.246 0.554 0.062l0.862-0.862c0.123-0.123 0.123-0.308 0.031-0.462-0.123-0.185-0.277-0.338-0.431-0.492-0.215-0.215-0.462-0.431-0.738-0.585-0.431-0.277-0.923-0.462-1.446-0.554-0.954-0.185-2-0.031-2.862 0.431-0.338 0.185-0.677 0.431-0.954 0.708l-2.246 2.246c-1.631 1.631-1.754 4.277-0.185 5.938 1.631 1.785 4.4 1.815 6.092 0.123l0.769-0.769c0.215-0.154 0.062-0.523-0.215-0.554zM14.031 1.785c-1.692-1.569-4.338-1.446-5.938 0.185l-0.708 0.677c-0.215 0.215-0.062 0.585 0.215 0.615 0.431 0.031 0.862 0.123 1.292 0.246 0.123 0.031 0.277 0 0.369-0.092l0.154-0.154c0.892-0.892 2.338-0.985 3.262-0.185 1.046 0.892 1.077 2.492 0.123 3.446l-2.338 2.338c-0.308 0.308-0.677 0.492-1.046 0.615-0.492 0.123-1.015 0.092-1.477-0.092-0.277-0.123-0.554-0.277-0.8-0.523-0.123-0.123-0.215-0.246-0.308-0.4-0.123-0.215-0.4-0.246-0.554-0.062l-0.862 0.862c-0.123 0.123-0.123 0.308-0.031 0.462 0.123 0.185 0.277 0.338 0.431 0.492 0.215 0.215 0.492 0.431 0.738 0.585 0.431 0.277 0.923 0.462 1.415 0.554 0.954 0.185 2 0.031 2.862-0.431 0.338-0.185 0.677-0.431 0.954-0.708l2.338-2.338c1.723-1.692 1.662-4.462-0.092-6.092z"></path>
+</svg>
+<svg id="icon-unlink" width="16" height="16" viewBox="0 0 16 16" x="0" y="1029">
+<path fill="#009688" d="M7.385 11.262c-0.185 0-0.369-0.031-0.554-0.092-0.185-0.031-0.4-0.092-0.585-0.154-0.123-0.031-0.246 0-0.308 0.062l-0.123 0.123c-0.769 0.769-2.031 0.862-2.862 0.154-0.892-0.8-0.954-2.185-0.092-3.015l2.031-2.031c0.277-0.277 0.585-0.431 0.923-0.523 0.431-0.123 0.892-0.092 1.292 0.092 0.246 0.092 0.492 0.246 0.677 0.462 0.092 0.092 0.185 0.215 0.277 0.369 0.092 0.185 0.338 0.215 0.492 0.062l0.769-0.769c0.123-0.123 0.123-0.277 0.031-0.4-0.123-0.154-0.246-0.277-0.369-0.431-0.185-0.185-0.431-0.369-0.646-0.523-0.4-0.246-0.8-0.4-1.262-0.492-0.831-0.154-1.723-0.031-2.523 0.4-0.308 0.154-0.585 0.369-0.831 0.615l-1.969 1.969c-1.415 1.415-1.538 3.723-0.154 5.2 1.446 1.538 3.877 1.6 5.354 0.092l0.677-0.677c0.154-0.154 0.031-0.462-0.246-0.492zM12.462 6.923c1.477-1.477 1.446-3.908-0.092-5.354-1.477-1.354-3.785-1.262-5.2 0.154l-0.615 0.615c-0.185 0.185-0.062 0.492 0.185 0.523 0.369 0.031 0.769 0.092 1.138 0.215 0.123 0.031 0.246 0 0.308-0.062l0.123-0.123c0.769-0.769 2.031-0.862 2.862-0.154 0.892 0.8 0.954 2.185 0.092 3.015l-2.031 2.031c-0.277 0.277-0.585 0.431-0.923 0.523-0.431 0.123-0.892 0.092-1.292-0.092-0.246-0.092-0.492-0.246-0.677-0.462-0.092-0.092-0.185-0.215-0.246-0.338-0.092-0.185-0.338-0.215-0.492-0.062l-0.738 0.738c-0.123 0.123-0.123 0.277-0.031 0.4 0.123 0.154 0.215 0.277 0.369 0.431 0.215 0.215 0.431 0.369 0.646 0.523 0.4 0.246 0.8 0.4 1.262 0.492 0.831 0.154 1.723 0.031 2.523-0.4 0.308-0.154 0.585-0.369 0.831-0.615l2-2zM13.877 12.615l1.415-1.415c0.123-0.123 0.123-0.308 0-0.431l-0.862-0.862c-0.123-0.123-0.308-0.123-0.431 0l-1.385 1.446-1.323-1.323c-0.123-0.123-0.308-0.123-0.431 0l-0.862 0.862c-0.123 0.123-0.123 0.308 0 0.431l1.323 1.323-1.292 1.292c-0.123 0.123-0.123 0.308 0 0.431l0.862 0.862c0.123 0.123 0.308 0.123 0.431 0l1.292-1.292 1.385 1.385c0.123 0.123 0.308 0.123 0.431 0l0.862-0.862c0.123-0.123 0.123-0.308 0-0.431l-1.415-1.415z"></path>
+</svg>
+<svg id="icon-baidu-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1050">
+<path fill="#009688" d="M9.473 10.846c0.725-0.156 0.626-1.022 0.605-1.211-0.035-0.292-0.379-0.802-0.845-0.762-0.587 0.053-0.672 0.9-0.672 0.9-0.080 0.392 0.189 1.229 0.913 1.073zM10.243 12.353c-0.021 0.061-0.069 0.217-0.027 0.352 0.081 0.305 0.345 0.318 0.345 0.318h0.379v-0.928h-0.407c-0.183 0.055-0.271 0.197-0.291 0.258zM10.819 9.393c0.401 0 0.724-0.461 0.724-1.031s-0.323-1.030-0.724-1.030c-0.399 0-0.724 0.461-0.724 1.030s0.324 1.031 0.724 1.031zM12.543 9.461c0.535 0.069 0.879-0.501 0.947-0.935 0.070-0.432-0.275-0.935-0.654-1.021-0.379-0.087-0.853 0.521-0.897 0.917-0.052 0.485 0.069 0.969 0.603 1.038zM13.854 12.006s-0.828-0.641-1.311-1.333c-0.655-1.021-1.586-0.605-1.897-0.086-0.31 0.519-0.793 0.847-0.861 0.935-0.069 0.085-1 0.588-0.793 1.505s0.932 0.899 0.932 0.899 0.535 0.053 1.155-0.086c0.621-0.137 1.155 0.035 1.155 0.035s1.449 0.485 1.846-0.449c0.396-0.935-0.224-1.42-0.224-1.42zM11.374 13.397h-0.942c-0.407-0.081-0.569-0.359-0.589-0.406s-0.135-0.271-0.075-0.651c0.176-0.569 0.677-0.61 0.677-0.61h0.501v-0.617l0.427 0.007v2.277zM13.129 13.39h-1.084c-0.42-0.108-0.44-0.407-0.44-0.407v-1.199l0.44-0.007v1.078c0.027 0.115 0.169 0.136 0.169 0.136h0.447v-1.206h0.468v1.605zM14.664 10.189c0-0.207-0.172-0.831-0.81-0.831s-0.725 0.589-0.725 1.005c0 0.397 0.033 0.951 0.827 0.933s0.707-0.899 0.707-1.107zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l0.052-0.111c-0.201-0.083-0.385-0.213-0.533-0.393-0.345-0.423-0.433-0.979-0.368-1.358 0.062-0.522 0.394-1.388 1.275-1.467 0.032-0.003 0.069-0.005 0.106-0.005 0.001 0 0.002 0 0.003 0h-0c0.051 0 0.1 0.003 0.149 0.009 0.061-0.878 0.647-1.546 1.386-1.546 0.072 0 0.14 0.015 0.208 0.027l0.092-0.195c0.143-0.304 0.215-0.692 0.215-1.165 0-0.92-0.325-1.706-0.977-2.357s-1.437-0.977-2.357-0.977-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM8.734 14h-7.401l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h5.811c0.083 0.274 0.202 0.494 0.344 0.667z"></path>
+</svg>
+<svg id="icon-google-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1071">
+<path fill="#009688" d="M10.813 8.519c0 0.622 0.208 1.071 0.618 1.335 0.335 0.216 0.725 0.249 0.927 0.249 0.049 0 0.089-0.002 0.116-0.004 0 0-0.064 0.418 0.246 0.832h-0.014c-0.537 0-2.289 0.112-2.289 1.553 0 1.465 1.609 1.54 1.932 1.54 0.025 0 0.040-0.001 0.040-0.001 0.003 0 0.027 0.001 0.066 0.001 0.207 0 0.743-0.026 1.24-0.268 0.645-0.313 0.972-0.858 0.972-1.619 0-0.735-0.499-1.173-0.863-1.493-0.222-0.195-0.414-0.363-0.414-0.527 0-0.167 0.14-0.292 0.317-0.451 0.287-0.257 0.557-0.622 0.557-1.313 0-0.607-0.079-1.015-0.564-1.273 0.051-0.026 0.229-0.045 0.318-0.057 0.263-0.036 0.647-0.077 0.647-0.291v-0.041h-1.916c-0.019-0.001-1.937 0.071-1.937 1.827zM13.906 12.274c0.037 0.586-0.465 1.019-1.217 1.073-0.765 0.056-1.394-0.288-1.431-0.873-0.018-0.281 0.106-0.557 0.348-0.777 0.245-0.223 0.583-0.359 0.949-0.387 0.043-0.003 0.086-0.005 0.129-0.005 0.707 0 1.187 0.416 1.221 0.968zM13.405 8.118c0.188 0.661-0.096 1.353-0.548 1.48-0.048 0.014-0.103 0.022-0.16 0.022-0 0-0 0-0 0h0c-0.415 0-0.825-0.419-0.977-0.997-0.085-0.325-0.078-0.608 0.019-0.881 0.096-0.268 0.268-0.449 0.485-0.511 0.048-0.014 0.103-0.022 0.16-0.022 0 0 0 0 0 0h-0c0.501 0 0.823 0.207 1.021 0.908zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l1.275-2.711c-0.009-0.099-0.017-0.199-0.017-0.308 0-1.052 0.509-1.742 1.153-2.151 0.109-0.284 0.174-0.621 0.174-1.034 0-0.92-0.325-1.706-0.977-2.357-0.651-0.652-1.437-0.977-2.357-0.977s-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM9.895 10.667l0.313-0.667h0.225c0.137 0.189 0.299 0.35 0.483 0.48l0.006 0.004c-0.115 0.055-0.221 0.116-0.322 0.182h-0.705zM10.184 14h-8.851l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h7.195c0.099 0.255 0.235 0.479 0.411 0.667z"></path>
+</svg>
+<svg id="icon-about" width="16" height="16" viewBox="0 0 16 16" x="0" y="1092">
+<path fill="#009688" d="M8.011 0.991c-3.868 0-7.003 3.135-7.003 7.003s3.135 7.003 7.003 7.003 7.003-3.136 7.003-7.003c0-3.868-3.135-7.003-7.003-7.003zM7.984 11.487c-0.399 0-0.723-0.333-0.723-0.743s0.324-0.743 0.723-0.743c0.399 0 0.723 0.333 0.723 0.743s-0.324 0.743-0.723 0.743zM10.003 6.816c-0.1 0.192-0.218 0.357-0.355 0.496s-0.384 0.374-0.739 0.704c-0.098 0.093-0.177 0.174-0.236 0.245s-0.103 0.134-0.132 0.193c-0.026 0.050-0.049 0.108-0.066 0.168l-0.002 0.007c-0.016 0.059-0.040 0.161-0.072 0.308-0.055 0.312-0.227 0.467-0.516 0.467-0.15 0-0.277-0.051-0.379-0.153s-0.154-0.253-0.154-0.454c0-0.251 0.037-0.47 0.113-0.654s0.175-0.347 0.299-0.486c0.124-0.139 0.292-0.305 0.503-0.497 0.185-0.168 0.319-0.294 0.401-0.38 0.080-0.083 0.149-0.176 0.205-0.279l0.003-0.007c0.056-0.105 0.085-0.219 0.085-0.341 0-0.24-0.086-0.442-0.258-0.607s-0.394-0.247-0.666-0.247c-0.318 0-0.552 0.083-0.702 0.25s-0.277 0.411-0.382 0.735c-0.098 0.339-0.285 0.508-0.559 0.508-0.162 0-0.298-0.059-0.41-0.178s-0.167-0.247-0.167-0.384c0-0.285 0.088-0.573 0.264-0.866s0.434-0.534 0.772-0.726c0.338-0.192 0.733-0.288 1.183-0.288 0.419 0 0.789 0.080 1.11 0.24s0.569 0.378 0.743 0.654c0.175 0.276 0.262 0.576 0.262 0.899 0 0.255-0.050 0.478-0.15 0.67z"></path>
+</svg>
+<svg id="icon-blockquote" width="16" height="16" viewBox="0 0 16 16" x="0" y="1113">
+<path fill="#009688" d="M13.631 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8zM6 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8z"></path>
+</svg>
+<svg id="icon-table-attr" width="16" height="16" viewBox="0 0 16 16" x="0" y="1134">
+<path fill="#009688" d="M15.204 1.055h-14.364c-0.41 0-0.743 0.333-0.743 0.743v12.383c0 0.41 0.333 0.743 0.743 0.743h14.364c0.41 0 0.743-0.333 0.743-0.743v-12.383c0-0.41-0.333-0.743-0.743-0.743l-0-0zM15.204 4.027v2.903h-4.293v-2.903h4.293zM5.875 10.563v-2.889h4.293v2.889h-4.293zM10.168 11.306v2.875h-4.293v-2.875h4.293zM5.132 10.563h-4.293v-2.889h4.293v2.889zM10.168 4.027v2.903h-4.293v-2.903h4.293zM10.911 7.674h4.293v2.889h-4.293v-2.889zM6.040 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM3.811 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 4.027h3.55v2.903h-4.293l0-2.903h0.743zM0.839 11.306h4.293v2.875h-4.293v-2.875zM10.911 14.181v-2.875h4.293v2.875h-4.293z"></path>
+</svg>
+<svg id="icon-insert-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1155">
+<path fill="#009688" d="M14 0h-2s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h2c0.552 0 1-0.448 1-1v-10c0-0.552-0.448-1-1-1zM14 11h-2v-3h2v3zM14 7h-2v-2h2v2zM14 4h-2v-3h2v3zM9 13l-2 3h5l-2-3h-1zM8 11v-10c0-0.552-0.448-1-1-1h-5s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h5c0.552 0 1-0.448 1-1zM7 7h-2v-2h2v2zM7 1v3h-2v-3h2zM4 11h-2v-3h2v3zM4 7h-2v-2h2v2zM4 4h-2v-3h2v3zM5 8h2v3h-2v-3z"></path>
+</svg>
+<svg id="icon-insert-row" width="18" height="16" viewBox="0 0 18 16" x="0" y="1176">
+<path fill="#009688" d="M17.143 16h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143zM9.143 9.143h-3.429v2.286h3.429v-2.286zM9.143 12.571h-3.429v2.286h3.429v-2.286zM12.571 9.143h-2.286v2.286h2.286v-2.286zM12.571 12.571h-2.286v2.286h2.286v-2.286zM17.143 9.143h-3.429v2.286h3.429v-2.286zM13.714 12.571v2.286h3.429v-2.286h-3.429zM17.143 4.571h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143zM9.143 1.143h-3.429v2.286h3.429v-2.286zM12.571 1.143h-2.286v2.286h2.286v-2.286zM17.143 1.143h-3.429v2.286h3.429v-2.286zM0 3.429l3.429 2.286v1.143l-3.429 2.286v-5.714z"></path>
+</svg>
+<svg id="icon-merge-table" width="21" height="16" viewBox="0 0 21 16" x="0" y="1197">
+<path fill="#009688" d="M1.484 2.296c0-0.615 0.242-1.198 0.682-1.63 0.43-0.432 1.005-0.666 1.62-0.666h0.016l10.845 0.059c0.615 0 1.198 0.242 1.63 0.682s0.666 1.021 0.666 1.637l-0.059 10.845c0 0.615-0.242 1.198-0.682 1.63-0.432 0.432-1.007 0.666-1.622 0.666h-0.016l-10.845-0.059c-0.615 0-1.198-0.242-1.63-0.682s-0.666-1.023-0.666-1.639l0.061-10.843zM6.199 1.048l-2.412-0.016c-0.333 0-0.65 0.134-0.897 0.374-0.242 0.242-0.374 0.556-0.374 0.897l-0.016 2.461h3.7v-3.716zM10.98 1.072l-3.742-0.024v3.718h3.742v-3.693zM12.020 14.463l2.552 0.016c0.341 0 0.658-0.124 0.897-0.365 0.242-0.242 0.374-0.556 0.374-0.897l0.016-2.579h-3.842v3.825zM12.020 9.598h3.844l0.016-3.793h-3.868v3.793h0.008zM12.020 4.765h3.868l0.016-2.396c0-0.333-0.124-0.658-0.365-0.897-0.242-0.242-0.556-0.374-0.897-0.374l-2.619-0.016v3.683z"></path>
+<path fill="#009688" d="M5.005 1.478c0.008 0 0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-merge-td" width="16" height="16" viewBox="0 0 16 16" x="0" y="1218">
+<path fill="#009688" d="M11.371 9.493h2.837v-2.987h-12.416v2.987h9.579zM0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333z"></path>
+</svg>
+<svg id="icon-remove-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1239">
+<path fill="#009688" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM7 12h1v1h-1s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h5c0.552 0 1 0.448 1 1v7h-1v-3h-2v3h-1v-3h-2v3h1v1h-1v3zM10 4h2v-3h-2v3zM9 4v-3h-2v3h2zM1 13s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h2c0.552 0 1 0.448 1 1v12h-3zM3 1h-2v3h2v-3zM3 5h-2v3h2v-3zM3 9h-2v3h2v-3z"></path>
+</svg>
+<svg id="icon-remove-row" width="16" height="16" viewBox="0 0 16 16" x="0" y="1260">
+<path fill="#009688" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM9 8h-4v2h1.667l0.333 1h-2v2h2.667l0.333 1h-7c-0.552 0-1-0.448-1-1v-5s0.448-1 1-1h12v1h-4zM4 8h-3v2h3v-2zM4 11h-3v2h3v-2zM1 4c-0.552 0-1-0.448-1-1v-2s0.448-1 1-1h11c0.552 0 1 0.448 1 1v3h-12zM4 1h-3v2h3v-2zM8 1h-3v2h3v-2zM12 1h-3v2h3v-2z"></path>
+</svg>
+<svg id="icon-remove-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="1281">
+<path fill="#009688" d="M14.857 16v-3.429l3.429-2.286v3.429l-3.429 2.286zM8 11.429l4.571-3.429h5.714l-4.571 3.429h-5.714zM13.714 4.571h-3.429v3.429h-4.571v2.286h1.143v1.143h-5.714c-0.631 0-1.143-0.512-1.143-1.143v-9.143c0-0.631 0.512-1.143 1.143-1.143h12.571c0.631 0 1.143 0.512 1.143 1.143v5.714h-1.143v-2.286zM4.571 1.143h-3.429v2.286h3.429v-2.286zM4.571 4.571h-3.429v2.286h3.429v-2.286zM4.571 8h-3.429v2.286h3.429v-2.286zM9.143 1.143h-3.429v2.286h3.429v-2.286zM9.143 4.571h-3.429v2.286h3.429v-2.286zM13.714 1.143h-3.429v2.286h3.429v-2.286zM13.714 16h-5.714v-3.429h5.714v3.429z"></path>
+</svg>
+<svg id="icon-insert-col2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1302">
+<path fill="#009688" d="M2 16h2s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v10c0 0.552 0.448 1 1 1zM2 5h2v3h-2v-3zM2 9h2v2h-2v-2zM2 12h2v3h-2v-3zM7 3l2-3h-5l2 3h1zM8 5v10c0 0.552 0.448 1 1 1h5s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-5c-0.552 0-1 0.448-1 1zM9 9h2v2h-2v-2zM9 15v-3h2v3h-2zM12 5h2v3h-2v-3zM12 9h2v2h-2v-2zM12 12h2v3h-2v-3zM11 8h-2v-3h2v3z"></path>
+</svg>
+<svg id="icon-insert-row2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1323">
+<path fill="#009688" d="M1.154 0h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143zM9.154 6.857h3.429v-2.286h-3.429v2.286zM9.154 3.429h3.429v-2.286h-3.429v2.286zM5.725 6.857h2.286v-2.286h-2.286v2.286zM5.725 3.429h2.286v-2.286h-2.286v2.286zM1.154 6.857h3.429v-2.286h-3.429v2.286zM4.583 3.429v-2.286h-3.429v2.286h3.429zM1.154 11.429h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143zM9.154 14.857h3.429v-2.286h-3.429v2.286zM5.725 14.857h2.286v-2.286h-2.286v2.286zM1.154 14.857h3.429v-2.286h-3.429v2.286zM18.297 12.571l-3.429-2.286v-1.143l3.429-2.286v5.714z"></path>
+</svg>
+<svg id="icon-split-table" width="16" height="16" viewBox="0 0 16 16" x="0" y="1344">
+<path fill="#009688" d="M0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333zM10.667 9.493v-2.987h-1.792v2.987h1.792zM14.208 9.493v-2.987h-1.792v2.987h1.792zM3.584 9.493v-2.987h-1.792v2.987h1.792zM7.125 9.493v-2.987h-1.792v2.987h1.792z"></path>
+</svg>
+<svg id="icon-merge-table2" width="21" height="16" viewBox="0 0 21 16" x="0" y="1365">
+<path fill="#009688" d="M19.297 2.296c0-0.615-0.242-1.198-0.682-1.63-0.43-0.432-1.005-0.666-1.62-0.666h-0.016l-10.845 0.059c-0.615 0-1.198 0.242-1.63 0.682s-0.666 1.021-0.666 1.637l0.059 10.845c0 0.615 0.242 1.198 0.682 1.63 0.432 0.432 1.007 0.666 1.622 0.666h0.016l10.845-0.059c0.615 0 1.198-0.242 1.63-0.682s0.666-1.023 0.666-1.639l-0.061-10.843zM14.583 1.048l2.412-0.016c0.333 0 0.65 0.134 0.897 0.374 0.242 0.242 0.374 0.556 0.374 0.897l0.016 2.461h-3.7v-3.716zM9.801 1.072l3.742-0.024v3.718h-3.742v-3.693zM8.761 14.463l-2.552 0.016c-0.341 0-0.658-0.124-0.897-0.365-0.242-0.242-0.374-0.556-0.374-0.897l-0.016-2.579h3.842v3.825zM8.761 9.598h-3.844l-0.016-3.793h3.868v3.793h-0.008zM8.761 4.765h-3.868l-0.016-2.396c0-0.333 0.124-0.658 0.365-0.897 0.242-0.242 0.556-0.374 0.897-0.374l2.619-0.016v3.683z"></path>
+<path fill="#009688" d="M15.777 1.478c-0.008 0-0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-remove2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1386">
+<path fill="#009688" d="M6.214 13.804c0.401 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726zM15.299 1.464h-6.178v-0.726c0-0.401-0.325-0.726-0.727-0.726h-0.727c-0.401 0-0.727 0.325-0.727 0.726v0.726h-6.177c-0.008-0-0.017-0-0.026-0-0.401 0-0.726 0.325-0.726 0.726s0.325 0.726 0.726 0.726c0.009 0 0.018-0 0.027-0.001l-0.001 0h1.090v11.615c0.001 0.802 0.651 1.452 1.453 1.452 0 0 0.001 0 0.001 0h9.448c0 0 0.001 0 0.001 0 0.802 0 1.452-0.65 1.453-1.452v-11.615h1.090c0.008 0 0.017 0 0.026 0 0.401 0 0.726-0.325 0.726-0.726s-0.325-0.726-0.726-0.726c-0.009 0-0.018 0-0.027 0l0.001-0zM12.755 13.804c0 0.401-0.325 0.726-0.727 0.726h-7.994c-0.401 0-0.727-0.325-0.727-0.726v-10.889h9.448v10.889zM9.847 13.804c0.402 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726z"></path>
+</svg>
+<svg id="icon-ok" width="16" height="16" viewBox="0 0 16 16" x="0" y="1407">
+<path fill="#009688" d="M8 16c-4.418 0-8-3.582-8-8s3.582-8 8-8c4.418 0 8 3.582 8 8s-3.582 8-8 8zM12.177 4.986l-4.894 4.894-3.364-3.365-0.918 0.918 4.282 4.283 5.811-5.812-0.917-0.918z"></path>
+</svg>
+<svg id="icon-remove" width="16" height="16" viewBox="0 0 16 16" x="0" y="1428">
+<path fill="#009688" d="M8 1c-3.867 0-7 3.133-7 7s3.133 7 7 7 7-3.133 7-7c0-3.867-3.133-7-7-7zM11.167 10.7c0.133 0.133 0.133 0.333 0 0.467s-0.333 0.133-0.467 0l-2.7-2.7-2.7 2.7c-0.133 0.133-0.333 0.133-0.467 0s-0.133-0.333 0-0.467l2.7-2.7-2.7-2.7c-0.133-0.133-0.133-0.333 0-0.467s0.333-0.133 0.467 0l2.7 2.7 2.7-2.7c0.133-0.133 0.333-0.133 0.467 0s0.133 0.333 0 0.467l-2.7 2.7 2.7 2.7z"></path>
+</svg>
+<svg id="icon-graft2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1449">
+<path fill="#009688" d="M11.658 0.504c0.216-0.218 0.516-0.354 0.848-0.354s0.631 0.135 0.847 0.354l1.664 1.664c0.217 0.217 0.351 0.517 0.351 0.848s-0.134 0.631-0.351 0.848l-9.336 9.336c-0.468 0.468-1.365 0.954-2.024 1.089l-3.048 0.625 0.625-3.048c0.133-0.65 0.62-1.557 1.088-2.025l9.336-9.336zM9.96 2.202l-0.848 0.849 3.358 3.359 0.849-0.849-3.359-3.359zM12.184 12.804c0.905-0.457 1.054-0.865 0.639-1.526-0.338-0.537-1.675-0.285-1.797 0.805-0.044 0.398 0.117 0.753 0.421 1.026 0.28-0.096 0.525-0.197 0.737-0.305zM13.063 13.682c-0.092 0.059-0.206 0.124-0.322 0.183l-0.025 0.012c-0.396 0.201-0.877 0.38-1.442 0.54-1.27 0.36-2.968 0.617-5.104 0.781-0.013 0.001-0.028 0.002-0.043 0.002-0.314 0-0.572-0.243-0.594-0.552l-0-0.002c-0.001-0.014-0.002-0.031-0.002-0.048 0-0.313 0.24-0.57 0.547-0.596l0.002-0c1.652-0.127 3.021-0.311 4.101-0.548 0.479-0.104 0.901-0.22 1.266-0.345 0.367 0.331 0.943 0.544 1.616 0.573 0.981 0.043 2.17-0.303 3.22-1.242 0.104-0.093 0.242-0.15 0.393-0.15 0.177 0 0.336 0.078 0.444 0.202l0.001 0.001c0.093 0.106 0.149 0.245 0.149 0.398 0 0.178-0.077 0.338-0.2 0.449l-0.001 0c-1.888 1.687-4.29 1.855-5.796 1.079-0.462-0.238-0.84-0.565-1.093-0.964-0.221-0.346-0.353-0.767-0.353-1.219 0-0.101 0.007-0.2 0.019-0.297l-0.001 0.011c0.25-2.25 3.058-2.78 3.979-1.315 0.752 1.197 0.45 2.291-0.762 3.048z"></path>
+</svg>
+<svg id="icon-func" width="17" height="16" viewBox="0 0 17 16" x="0" y="1470">
+<path fill="#009688" d="M0.531 15.51v-2.065h4.213c-1.236-0.919-2.162-1.924-2.78-3.018-0.582-1.007-0.926-2.215-0.926-3.503 0-0.014 0-0.029 0-0.043l-0 0.002c0-1.992 0.695-3.612 2.086-4.861 1.39-1.25 3.193-1.874 5.406-1.874 2.215 0 4.017 0.625 5.408 1.874s2.086 2.869 2.086 4.86c0 1.263-0.309 2.441-0.927 3.535s-1.544 2.103-2.78 3.028h4.213v2.065h-6.854v-2.065c1.012-0.756 1.772-1.663 2.278-2.72 0.506-1.056 0.76-2.263 0.76-3.62 0-1.519-0.373-2.715-1.12-3.59-0.745-0.874-1.767-1.31-3.063-1.31s-2.317 0.438-3.063 1.316c-0.746 0.877-1.119 2.076-1.119 3.595 0 1.356 0.253 2.562 0.76 3.615s1.265 1.958 2.278 2.714v2.065h-6.857z"></path>
+</svg>
+<svg id="icon-find" width="16" height="16" viewBox="0 0 16 16" x="0" y="1491">
+<path fill="#009688" d="M1 0h6v1h-6zM9 0h6v1h-6zM14.875 5h-0.875v-4h-4v4h-4v-4h-4v4h-0.875c-0.619 0-1.125 0.506-1.125 1.125v8.75c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-5.875h2v5.875c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-8.75c0-0.619-0.506-1.125-1.125-1.125zM5.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5zM8.5 8h-1c-0.275 0-0.5-0.225-0.5-0.5s0.225-0.5 0.5-0.5h1c0.275 0 0.5 0.225 0.5 0.5s-0.225 0.5-0.5 0.5zM14.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5z"></path>
+</svg>
+<svg id="icon-date" width="16" height="16" viewBox="0 0 16 16" x="0" y="1512">
+<path fill="#009688" d="M13.597 2.081h-0.584v2.837c0 0.603-0.489 1.093-1.093 1.093s-1.092-0.49-1.092-1.093v-2.837h-5.64v2.83c0 0.604-0.49 1.094-1.094 1.094-0.603 0-1.092-0.49-1.092-1.094v-2.83h-0.6c-0.775 0-1.402 0.628-1.402 1.402v3.070h14v-3.070c0-0.774-0.627-1.402-1.403-1.402zM4.927 4.612c0 0.463-0.376 0.837-0.837 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.375-0.837 0.837-0.837v0c0.461 0 0.837 0.374 0.837 0.837v2.76zM12.78 4.612c0 0.463-0.374 0.837-0.838 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.374-0.837 0.837-0.837v0c0.464 0 0.838 0.374 0.838 0.837v2.76zM14.182 7.133v5.608c0 0.774-0.627 1.401-1.401 1.401h-9.573c-0.774 0-1.401-0.627-1.401-1.401v-5.608h-0.807v6.45c0 0.774 0.627 1.403 1.403 1.403h11.193c0.776 0 1.403-0.629 1.403-1.403v-6.45h-0.817zM8.393 11.198h1.101c0.109 0.504 0.389 0.649 0.662 0.649 0.405 0 0.651-0.262 0.651-0.723 0-0.26-0.097-0.626-0.651-0.64h-0.351v-0.69h0.159c0.554-0.014 0.687-0.241 0.687-0.66 0-0.271-0.201-0.468-0.526-0.477-0.426-0.011-0.491 0.185-0.598 0.443l-1.031 0.002c0.239-0.793 0.793-1.196 1.661-1.21 1.052 0.028 1.597 0.453 1.635 1.274 0 0.403-0.232 0.708-0.692 0.909 0.589 0.202 0.885 0.563 0.885 1.080-0.037 0.865-0.646 1.319-1.827 1.362-0.998 0.001-1.599-0.483-1.765-1.319zM7.633 11.479v0.975h-3.543v-0.629c0.386-0.605 0.771-1.059 1.492-1.52 0.663-0.433 0.894-0.763 0.894-1.080 0-0.070 0.003-0.433-0.531-0.433-0.372 0.014-0.645 0.182-0.645 0.565l-1.128 0.007c0.065-1.087 0.95-1.473 1.856-1.473 1.032 0.043 1.586 0.482 1.66 1.317 0.037 0.563-0.28 1.101-1.148 1.634-0.48 0.287-0.523 0.319-0.817 0.636h1.91z"></path>
+</svg>
+<svg id="icon-clock" width="16" height="16" viewBox="0 0 16 16" x="0" y="1533">
+<path fill="#009688" d="M11.331 7.805h-2.732v-2.199c0-0.333-0.267-0.6-0.6-0.6s-0.6 0.267-0.6 0.6v2.932c0.067 0.267 0.267 0.466 0.533 0.466h3.398c0.333 0 0.6-0.267 0.6-0.6s-0.267-0.6-0.6-0.6zM13.53 3.074c-1.399-1.399-3.331-2.199-5.53-2.199-2.132 0-4.131 0.866-5.53 2.199-1.399 1.399-2.265 3.265-2.265 5.33s0.866 3.998 2.265 5.33c1.399 1.399 3.331 2.199 5.53 2.199 2.132 0 4.131-0.866 5.53-2.199 1.399-1.399 2.265-3.265 2.265-5.33s-0.866-3.998-2.265-5.33zM12.664 12.935c-1.199 1.133-2.865 1.866-4.664 1.866s-3.465-0.733-4.664-1.866c-1.199-1.133-1.932-2.732-1.932-4.531s0.733-3.398 1.932-4.531c1.199-1.133 2.865-1.866 4.664-1.866s3.465 0.733 4.664 1.866c1.199 1.133 1.932 2.798 1.932 4.531 0 1.799-0.733 3.398-1.932 4.531zM1.271 2.874l2.332-1.866c0.267-0.2 0.267-0.6 0.067-0.8-0.2-0.267-0.6-0.267-0.866-0.067l-2.332 1.866c-0.267 0.2-0.333 0.6-0.067 0.8 0.2 0.267 0.6 0.267 0.866 0.067zM14.729 2.874c0.267 0.2 0.666 0.133 0.866-0.067 0.2-0.267 0.133-0.6-0.067-0.8l-2.332-1.866c-0.267-0.2-0.666-0.133-0.866 0.067-0.2 0.267-0.2 0.6 0.067 0.8l2.332 1.866z"></path>
+</svg>
+</svg>
diff --git a/addons/nkeditor/bootstrap.js b/addons/nkeditor/bootstrap.js
new file mode 100644
index 0000000..213550a
--- /dev/null
+++ b/addons/nkeditor/bootstrap.js
@@ -0,0 +1,285 @@
+require.config({
+    paths: {
+        'nkeditor': '../addons/nkeditor/js/customplugin',
+        'nkeditor-core': '../addons/nkeditor/nkeditor.min',
+        'nkeditor-lang': '../addons/nkeditor/lang/zh-CN',
+    },
+    shim: {
+        'nkeditor': {
+            deps: [
+                'nkeditor-core',
+                'nkeditor-lang'
+            ]
+        },
+        'nkeditor-core': {
+            deps: [
+                'css!../addons/nkeditor/themes/black/editor.min.css',
+                'css!../addons/nkeditor/css/common.css'
+            ],
+            exports: 'window.KindEditor'
+        },
+        'nkeditor-lang': {
+            deps: [
+                'nkeditor-core'
+            ]
+        }
+    }
+});
+require(['form'], function (Form) {
+    var _bindevent = Form.events.bindevent;
+    Form.events.bindevent = function (form) {
+        _bindevent.apply(this, [form]);
+        if ($(".editor", form).size() > 0) {
+            require(['nkeditor', 'upload'], function (Nkeditor, Upload) {
+                var getImageFromClipboard, getImageFromDrop, getFileFromBase64;
+                getImageFromClipboard = function (data) {
+                    var i, item;
+                    i = 0;
+                    while (i < data.clipboardData.items.length) {
+                        item = data.clipboardData.items[i];
+                        if (item.type.indexOf("image") !== -1) {
+                            return item.getAsFile() || false;
+                        }
+                        i++;
+                    }
+                    return false;
+                };
+                getImageFromDrop = function (data) {
+                    var i, item, images;
+                    i = 0;
+                    images = [];
+                    while (i < data.dataTransfer.files.length) {
+                        item = data.dataTransfer.files[i];
+                        if (item.type.indexOf("image") !== -1) {
+                            images.push(item);
+                        }
+                        i++;
+                    }
+                    return images;
+                };
+                getFileFromBase64 = function (data, url) {
+                    var arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1],
+                        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
+                    while (n--) {
+                        u8arr[n] = bstr.charCodeAt(n);
+                    }
+                    var filename, suffix;
+                    if (typeof url != 'undefined') {
+                        var urlArr = url.split('.');
+                        filename = url.substr(url.lastIndexOf('/') + 1);
+                        suffix = urlArr.pop();
+                    } else {
+                        filename = Math.random().toString(36).substring(5, 15);
+                    }
+                    console.log(filename);
+                    if (!suffix) {
+                        suffix = data.substring("data:image/".length, data.indexOf(";base64"));
+                    }
+
+                    var exp = new RegExp("\\." + suffix + "$", "i");
+                    filename = exp.test(filename) ? filename : filename + "." + suffix;
+                    var file = new File([u8arr], filename, {type: mime});
+                    return file;
+                };
+
+                var getImageFromUrl = function (url, callback, outputFormat) {
+                    var canvas = document.createElement('CANVAS'),
+                        ctx = canvas.getContext('2d'),
+                        img = new Image;
+                    img.crossOrigin = 'Anonymous';
+                    img.onload = function () {
+                        var urlArr = url.split('.');
+                        var suffix = urlArr.pop();
+                        suffix = suffix.match(/^(jpg|png|gif|bmp|jpeg)$/i) ? suffix : 'png';
+
+                        try {
+                            canvas.height = img.height;
+                            canvas.width = img.width;
+                            ctx.drawImage(img, 0, 0);
+                            var dataURL = canvas.toDataURL(outputFormat || 'image/' + suffix);
+                            var file = getFileFromBase64(dataURL, url);
+                        } catch (e) {
+                            callback.call(this, null);
+                        }
+
+                        callback.call(this, file);
+                        canvas = null;
+                    };
+                    img.onerror = function (e) {
+                        callback.call(this, null);
+                    };
+                    img.src = url;
+                };
+                //上传Word图片
+                Nkeditor.uploadwordimage = function (index, image) {
+                    var that = this;
+                    (function () {
+                        var file = getFileFromBase64(image);
+                        var placeholder = new RegExp("##" + index + "##", "g");
+                        Upload.api.send(file, function (data) {
+                            that.html(that.html().replace(placeholder, Fast.api.cdnurl(data.url)));
+                        }, function (data) {
+                            that.html(that.html().replace(placeholder, ""));
+                        });
+                    }(index, image));
+                };
+
+                Nkeditor.lang({
+                    remoteimage: '下载远程图片'
+                });
+                //远程下载图片
+                Nkeditor.plugin('remoteimage', function (K) {
+                    var editor = this, name = 'remoteimage';
+                    editor.plugin.remoteimage = {
+                        download: function (e) {
+                            var that = this;
+                            var html = that.html();
+                            var staging = {}, orgined = {}, index = 0, images = 0, completed = 0, failured = 0;
+                            var checkrestore = function () {
+                                if (completed + failured >= images) {
+                                    $.each(staging, function (i, j) {
+                                        that.html(that.html().replace("<code>" + i + "</code>", j));
+                                    });
+                                }
+                            };
+                            html.replace(/<code>([\s\S]*?)<\/code>/g, function (code) {
+                                    staging[index] = code;
+                                    return "<code>" + index + "</code>";
+                                }
+                            );
+                            html = html.replace(/<img([\s\S]*?)\ssrc\s*=\s*('|")((http(s?):)([\s\S]*?))('|")([\s\S]*?)[\/]?>/g, function () {
+                                images++;
+                                var url = arguments[3];
+                                var placeholder = '<img src="' + Fast.api.cdnurl("/assets/addons/nkeditor/img/downloading.png") + '" data-index="' + index + '" />';
+                                //如果是云存储的链接,则忽略
+                                if (Config.upload.cdnurl && url.indexOf(Config.upload.cdnurl) > -1) {
+                                    completed++;
+                                    return arguments[0];
+                                } else {
+                                    orgined[index] = arguments[0];
+                                }
+                                //下载远程图片
+                                (function (index, url, placeholder) {
+                                    getImageFromUrl(url, function (file) {
+                                        if (!file) {
+                                            failured++;
+                                            that.html(that.html().replace(placeholder, orgined[index]));
+                                            checkrestore();
+                                        } else {
+                                            Upload.api.send(file, function (data) {
+                                                completed++;
+                                                that.html(that.html().replace(placeholder, '<img src="' + Fast.api.cdnurl(data.url) + '" />'));
+                                                checkrestore();
+                                            }, function (data) {
+                                                failured++;
+                                                that.html(that.html().replace(placeholder, orgined[index]));
+                                                checkrestore();
+                                            });
+                                        }
+                                    });
+                                })(index, url, placeholder);
+                                index++;
+                                return placeholder;
+                            });
+                            if (index > 0) {
+                                that.html(html);
+                            } else {
+                                Toastr.info("没有需要下载的远程图片");
+                            }
+                        }
+                    };
+                    // 点击图标时执行
+                    editor.clickToolbar(name, editor.plugin.remoteimage.download);
+                });
+
+                $(".editor", form).each(function () {
+                    var that = this;
+                    Nkeditor.create(that, {
+                        width: '100%',
+                        filterMode: false,
+                        wellFormatMode: false,
+                        allowMediaUpload: true, //是否允许媒体上传
+                        allowFileManager: true,
+                        allowImageUpload: true,
+                        wordImageServer: typeof Config.nkeditor != 'undefined' && Config.nkeditor.wordimageserver ? "127.0.0.1:10101" : "", //word图片替换服务器的IP和端口
+                        urlType: Config.upload.cdnurl ? 'domain' : '',//给图片加前缀
+                        cssPath: Fast.api.cdnurl('/assets/addons/nkeditor/plugins/code/prism.css'),
+                        cssData: "body {font-size: 13px}",
+                        fillDescAfterUploadImage: false, //是否在上传后继续添加描述信息
+                        themeType: typeof Config.nkeditor != 'undefined' ? Config.nkeditor.theme : 'black', //编辑器皮肤,这个值从后台获取
+                        fileManagerJson: Fast.api.fixurl("/addons/nkeditor/index/attachment/module/" + Config.modulename),
+                        items: [
+                            'source', 'undo', 'redo', 'preview', 'print', 'template', 'code', 'quote', 'cut', 'copy', 'paste',
+                            'plainpaste', 'wordpaste', 'justifyleft', 'justifycenter', 'justifyright',
+                            'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
+                            'superscript', 'clearhtml', 'quickformat', 'selectall',
+                            'formatblock', 'fontname', 'fontsize', 'forecolor', 'hilitecolor', 'bold',
+                            'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', 'image', 'multiimage', 'graft',
+                            'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
+                            'anchor', 'link', 'unlink', 'remoteimage', 'about', 'fullscreen'
+                        ],
+                        afterCreate: function () {
+                            var self = this;
+                            //Ctrl+回车提交
+                            Nkeditor.ctrl(document, 13, function () {
+                                self.sync();
+                                $(that).closest("form").submit();
+                            });
+                            Nkeditor.ctrl(self.edit.doc, 13, function () {
+                                self.sync();
+                                $(that).closest("form").submit();
+                            });
+                            //粘贴上传
+                            $("body", self.edit.doc).bind('paste', function (event) {
+                                var image, pasteEvent;
+                                pasteEvent = event.originalEvent;
+                                if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
+                                    image = getImageFromClipboard(pasteEvent);
+                                    if (image) {
+                                        event.preventDefault();
+                                        Upload.api.send(image, function (data) {
+                                            self.exec("insertimage", Fast.api.cdnurl(data.url));
+                                        });
+                                    }
+                                }
+                            });
+                            //挺拽上传
+                            $("body", self.edit.doc).bind('drop', function (event) {
+                                var image, pasteEvent;
+                                pasteEvent = event.originalEvent;
+                                if (pasteEvent.dataTransfer && pasteEvent.dataTransfer.files) {
+                                    images = getImageFromDrop(pasteEvent);
+                                    if (images.length > 0) {
+                                        event.preventDefault();
+                                        $.each(images, function (i, image) {
+                                            Upload.api.send(image, function (data) {
+                                                self.exec("insertimage", Fast.api.cdnurl(data.url));
+                                            });
+                                        });
+                                    }
+                                }
+                            });
+                        },
+                        //FastAdmin自定义处理
+                        beforeUpload: function (callback, file) {
+                            var file = file ? file : $("input.ke-upload-file", this.form).prop('files')[0];
+                            Upload.api.send(file, function (data) {
+                                var data = {code: '000', data: {url: Fast.api.cdnurl(data.url)}, title: '', width: '', height: '', border: '', align: ''};
+                                callback(data);
+                            });
+
+                        },
+                        //错误处理 handler
+                        errorMsgHandler: function (message, type) {
+                            try {
+                                console.log(message, type);
+                            } catch (Error) {
+                                alert(message);
+                            }
+                        }
+                    });
+                });
+            });
+        }
+    }
+});
diff --git a/addons/nkeditor/config.php b/addons/nkeditor/config.php
new file mode 100644
index 0000000..6c44fa4
--- /dev/null
+++ b/addons/nkeditor/config.php
@@ -0,0 +1,78 @@
+<?php
+
+return [
+    [
+        //配置唯一标识
+        'name'    => 'theme',
+        //显示的标题
+        'title'   => '编辑器主题',
+        //类型
+        'type'    => 'select',
+        //数据字典
+        'content' => [
+            'default' => '经典主题',
+            'black'   => '雅黑主题',
+            'blue'    => '淡蓝主题',
+            'grey'    => '深灰主题',
+            'primary' => '深绿主题',
+        ],
+        //值
+        'value'   => 'black',
+        //验证规则 
+        'rule'    => 'required',
+        //错误消息
+        'msg'     => '',
+        //提示消息
+        'tip'     => '',
+        //成功消息
+        'ok'      => '',
+        //扩展信息
+        'extend'  => ''
+    ],
+    [
+        'name'    => 'wordimageserver',
+        'title'   => '启用word图片替换服务器',
+        'type'    => 'radio',
+        'content' => [
+            '1' => '是',
+            '0' => '否',
+        ],
+        'value'   => '0',
+        'rule'    => 'required',
+        'msg'     => '',
+        'tip'     => '如果启用,请务必先运行word.exe',
+        'ok'      => '',
+        'extend'  => ''
+    ],
+    [
+        'name'    => 'attachmentmode_admin',
+        'title'   => '管理员附件选择模式',
+        'type'    => 'select',
+        'content' => [
+            'all'      => '任何管理员均可以查看全部上传的文件',
+            'auth'     => '仅可以查看自己及所有子管理员上传的文件',
+            'personal' => '仅可以查看选择自己上传的文件',
+        ],
+        'value'   => 'all',
+        'rule'    => 'required',
+        'msg'     => '',
+        'tip'     => '',
+        'ok'      => '',
+        'extend'  => ''
+    ],
+    [
+        'name'    => 'attachmentmode_index',
+        'title'   => '后台附件选择模式',
+        'type'    => 'select',
+        'content' => [
+            'all'      => '任何会员均可以查看全部上传的文件',
+            'personal' => '仅可以查看选择自己上传的文件',
+        ],
+        'value'   => 'all',
+        'rule'    => 'required',
+        'msg'     => '',
+        'tip'     => '',
+        'ok'      => '',
+        'extend'  => ''
+    ],
+];
diff --git a/addons/nkeditor/controller/Index.php b/addons/nkeditor/controller/Index.php
new file mode 100644
index 0000000..82c7edc
--- /dev/null
+++ b/addons/nkeditor/controller/Index.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace addons\nkeditor\controller;
+
+use app\common\model\Attachment;
+use think\addons\Controller;
+
+class Index extends Controller
+{
+
+    public function index()
+    {
+        $this->error('该插件暂无前台页面');
+    }
+
+    /**
+     * 文件列表
+     */
+    public function attachment()
+    {
+        $model = new Attachment;
+        $page = $this->request->request('page');
+        $fileType = $this->request->request('fileType');
+        $module = $this->request->param('module');
+        $pagesize = 15;
+        $config = get_addon_config('nkeditor');
+        $type = [];
+        $imageSuffix = ['png', 'jpg', 'jpeg', 'gif', 'bmp'];
+        if ($fileType == 'image') {
+            $type = $imageSuffix;
+        } else if ($fileType == 'flash') {
+            $type = ['swf', 'flv'];
+        } else if ($fileType == 'media') {
+            $type = ['swf', 'flv'];
+        } else if ($fileType == 'file') {
+
+        }
+        if ($module == 'admin') {
+            $auth = \app\admin\library\Auth::instance();
+            if (!$auth->id) {
+                $this->error('请登录后再操作!');
+            } else {
+                $mode = $config['attachmentmode_admin'];
+            }
+            if ($mode == 'all') {
+
+            } else {
+                if (!$auth->isSuperAdmin()) {
+                    $adminIds = $mode == 'auth' ? $auth->getChildrenAdminIds(true) : [$auth->id];
+                    $model->where('admin_id', 'in', $adminIds);
+                }
+            }
+        } else {
+            if (!$this->auth->id) {
+                $this->error('请登录后再操作!');
+            } else {
+                $mode = $config['attachmentmode_index'];
+            }
+            if ($mode == 'all') {
+
+            } else {
+                $model->where('user_id', 'in', [$this->auth->id]);
+            }
+        }
+
+        if ($type) {
+            $model->where('imagetype', 'in', $type);
+        }
+
+        $list = $model
+            ->order('id', 'desc')
+            ->paginate($pagesize);
+
+        $items = $list->items();
+        $data = [];
+        $cdnurl = preg_replace("/\/(\w+)\.php$/i", '', $this->request->root());
+        foreach ($items as $k => &$v) {
+            $v['fullurl'] = $v['storage'] == 'local' ? $cdnurl . $v['url'] : cdnurl($v['url']);
+            $v['imagetype'] = strtolower($v['imagetype']);
+            $data[] = [
+                'width'    => $v['imagewidth'],
+                'height'   => $v['imageheight'],
+                'filesize' => $v['filesize'],
+                'oriURL'   => $v['fullurl'],
+                'thumbURL' => !in_array($v['imagetype'], $imageSuffix) ? "https://tool.fastadmin.net/icon/{$v['imagetype']}.png" : $v['fullurl'],
+            ];
+        }
+        $result = [
+            'code'     => '000',
+            'count'    => $list->total(),
+            'page'     => $page,
+            'pagesize' => $pagesize,
+            'extra'    => '',
+            'data'     => $data
+        ];
+        return json($result);
+    }
+
+}
diff --git a/addons/nkeditor/info.ini b/addons/nkeditor/info.ini
new file mode 100644
index 0000000..54d2797
--- /dev/null
+++ b/addons/nkeditor/info.ini
@@ -0,0 +1,8 @@
+name = nkeditor
+title = 简洁强大的富文本编辑器
+intro = 一款基于Kindeditor二次开发的编辑器
+author = Karson
+website = https://www.fastadmin.net
+version = 1.0.8
+state = 1
+url = /addons/nkeditor.html
diff --git a/addons/nkeditor/license.txt b/addons/nkeditor/license.txt
new file mode 100644
index 0000000..f166cc5
--- /dev/null
+++ b/addons/nkeditor/license.txt
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
\ No newline at end of file
diff --git a/addons/nkeditor/nodejs/word.js b/addons/nkeditor/nodejs/word.js
new file mode 100644
index 0000000..5d11ede
--- /dev/null
+++ b/addons/nkeditor/nodejs/word.js
@@ -0,0 +1,91 @@
+/**
+ * 代码来源:http://www.thinkphp.cn/topic/27567.html
+ * 如需编译请使用 pkg -t node12-win word.js 命令编译成word.exe文件
+ */
+var service = {
+    http: require('http'),
+    url: require('url'),
+    querystring: require('querystring'),
+    fs: require('fs'),
+    config: {
+        timeout: 60000,
+        charset: 'utf8',
+        port: 10101,
+        host: '127.0.0.1'
+    },
+    router: {
+        index: function (res, query) {
+            res.end('Server is running!');
+        },
+        check: function (res, query) {
+            var result = {status: 1, info: 'success'};
+            result = JSON.stringify(result);
+            if (typeof query.callback == 'string') {
+                result = query.callback + '(' + result + ')';
+            }
+            res.end(result);
+        },
+        word: function (res, query) {
+            var _this = service;
+            var result = {status: 0, info: 'error'};
+            if (typeof query.file == 'string') {
+                var img = query.file.match(/file:\/\/+(localhost)?(\S+\.(png|jpg|jpeg|gif|bmp))/i);
+                console.log(img);
+                if (img) {
+                    var base64 = _this.base64_encode(img[2]);
+                    result.status = 1;
+                    result.index = query.index;
+                    result.info = 'data:image/' + img[3] + ';base64,' + base64;
+                }
+            }
+            result = JSON.stringify(result);
+            if (typeof query.callback == 'string') {
+                result = query.callback + '(' + result + ')';
+            }
+            res.end(result);
+        }
+    },
+    start: function () {
+        var _this = this;
+        var Server = _this.http.createServer(function (req, res) {
+            var URL = _this.url.parse(req.url);
+            var receive = [];
+            var router = null;
+            switch (URL.pathname) {
+                case '/word':
+                    router = _this.router.word;
+                    break;
+                case '/check':
+                    router = _this.router.check;
+                    break;
+                default:
+                    router = _this.router.index;
+            }
+            req.setEncoding(_this.config.charset);
+            req.addListener('data', function (data) {
+                receive.push(data);
+            });
+            res.writeHead(200, {'Content-Type': 'text/plain'});
+            res.on("close", function () {
+                console.log("res closed");
+            });
+            req.on("close", function () {
+                console.log("req closed");
+            });
+            req.addListener('end', function () {
+                router(res, _this.querystring.parse(URL.query));
+            });
+        });
+        Server.listen(_this.config.port, _this.config.host, 1024);
+        Server.setTimeout(_this.config.timeout, function (cli) {
+            cli.end('timeout\n');
+        });
+        console.log('Server running at http://' + _this.config.host + ':' + _this.config.port);
+    },
+    //base64
+    base64_encode: function (file) {
+        var bitmap = this.fs.readFileSync(file);
+        return new Buffer(bitmap).toString('base64');
+    }
+};
+service.start();
\ No newline at end of file
diff --git a/addons/qiniu/Qiniu.php b/addons/qiniu/Qiniu.php
new file mode 100644
index 0000000..d304a56
--- /dev/null
+++ b/addons/qiniu/Qiniu.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace addons\qiniu;
+
+use addons\qiniu\library\Auth;
+use fast\Http;
+use think\Addons;
+
+/**
+ * 七牛上传插件
+ */
+class Qiniu extends Addons
+{
+
+    /**
+     * 插件安装方法
+     * @return bool
+     */
+    public function install()
+    {
+        return true;
+    }
+
+    /**
+     * 插件卸载方法
+     * @return bool
+     */
+    public function uninstall()
+    {
+        return true;
+    }
+
+    /**
+     * 上传初始化时
+     */
+    public function uploadConfigInit(&$upload)
+    {
+        $config = $this->getConfig();
+
+        $policy = array(
+            'saveKey' => ltrim($config['savekey'], '/'),
+        );
+        //如果启用服务端回调
+        if ($config['notifyenabled']) {
+            $policy = array_merge($policy, [
+                'callbackUrl'  => $config['notifyurl'],
+                'callbackBody' => 'filename=$(fname)&key=$(key)&imageInfo=$(imageInfo)&filesize=$(fsize)&admin=$(x:admin)&user=$(x:user)'
+            ]);
+        }
+
+        if ($config['uploadmode'] == 'client') {
+            $auth = new Auth($config['app_key'], $config['secret_key']);
+            $multipart['token'] = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy);
+            $multipart['x:admin'] = (int)session('admin.id');
+            $multipart['x:user'] = (int)cookie('uid');
+            $upload = [
+                'cdnurl'    => $config['cdnurl'],
+                'uploadurl' => $config['uploadurl'],
+                'bucket'    => $config['bucket'],
+                'maxsize'   => $config['maxsize'],
+                'mimetype'  => $config['mimetype'],
+                'multipart' => $multipart,
+                'multiple'  => $config['multiple'] ? true : false,
+            ];
+        } else {
+            $upload = array_merge($upload, [
+                'cdnurl'    => $config['cdnurl'],
+                'uploadurl' => addon_url('qiniu/index/upload'),
+                'maxsize'   => $config['maxsize'],
+                'mimetype'  => $config['mimetype'],
+                'multiple'  => $config['multiple'] ? true : false,
+            ]);
+        }
+    }
+
+    /**
+     * 附件删除后
+     */
+    public function uploadDelete($attachment)
+    {
+        $config = $this->getConfig();
+        if ($attachment['storage'] == 'qiniu' && isset($config['syncdelete']) && $config['syncdelete']) {
+            $auth = new Auth($config['app_key'], $config['secret_key']);
+            $entry = $config['bucket'] . ':' . ltrim($attachment->url, '/');
+            $encodedEntryURI = $auth->base64_urlSafeEncode($entry);
+            $url = 'http://rs.qiniu.com/delete/' . $encodedEntryURI;
+            $headers = $auth->authorization($url);
+            //删除云储存文件
+            $ret = Http::sendRequest($url, [], 'POST', [CURLOPT_HTTPHEADER => ['Authorization: ' . $headers['Authorization']]]);
+            //如果是服务端中转,还需要删除本地文件
+            if ($config['uploadmode'] == 'server') {
+                $filePath = ROOT_PATH . 'public' . str_replace('/', DS, $attachment->url);
+                if ($filePath) {
+                    @unlink($filePath);
+                }
+            }
+        }
+        return true;
+    }
+
+}
diff --git a/addons/qiniu/bootstrap.js b/addons/qiniu/bootstrap.js
new file mode 100644
index 0000000..8f88115
--- /dev/null
+++ b/addons/qiniu/bootstrap.js
@@ -0,0 +1,21 @@
+//修改上传的接口调用
+require(['upload'], function (Upload) {
+    var _onUploadResponse = Upload.events.onUploadResponse;
+    Upload.events.onUploadResponse = function (response) {
+        try {
+            var ret = typeof response === 'object' ? response : JSON.parse(response);
+            if (ret.hasOwnProperty("code") && ret.hasOwnProperty("data")) {
+                return _onUploadResponse.call(this, response);
+            } else if (ret.hasOwnProperty("key") && !ret.hasOwnProperty("err_code")) {
+                ret.code = 1;
+                ret.data = {
+                    url: '/' + ret.key
+                };
+                return _onUploadResponse.call(this, JSON.stringify(ret));
+            }
+        } catch (e) {
+        }
+        return _onUploadResponse.call(this, response);
+
+    };
+});
\ No newline at end of file
diff --git a/addons/qiniu/config.php b/addons/qiniu/config.php
new file mode 100644
index 0000000..bd45ec1
--- /dev/null
+++ b/addons/qiniu/config.php
@@ -0,0 +1,236 @@
+<?php
+
+return array (
+  0 => 
+  array (
+    'name' => 'app_key',
+    'title' => 'app_key',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => 'm92odJHsEMRW6ZZzpwwCHRejn2kgK8Y4jEiMSlXk',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '请在个人中心 > 密钥管理中获取 > AK',
+    'ok' => '',
+    'extend' => '',
+  ),
+  1 => 
+  array (
+    'name' => 'secret_key',
+    'title' => 'secret_key',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => 'YxYBAjxBLZTC1N9crjzwLkWTBxKi_MIv9pUHK0IS',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '请在个人中心 > 密钥管理中获取 > SK',
+    'ok' => '',
+    'extend' => '',
+  ),
+  2 => 
+  array (
+    'name' => 'bucket',
+    'title' => 'bucket',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => 'jinglong',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '存储空间名称',
+    'ok' => '',
+    'extend' => '',
+  ),
+  3 => 
+  array (
+    'name' => 'uploadurl',
+    'title' => '上传接口地址',
+    'type' => 'select',
+    'content' => 
+    array (
+      'https://upload-z0.qiniup.com' => '华东 https://upload-z0.qiniup.com',
+      'https://upload-z1.qiniup.com' => '华北 https://upload-z1.qiniup.com',
+      'https://upload-z2.qiniup.com' => '华南 https://upload-z2.qiniup.com',
+      'https://upload-na0.qiniup.com' => '北美 https://upload-na0.qiniup.com',
+      'https://upload-as0.qiniup.com' => '东南亚 https://upload-as0.qiniup.com',
+    ),
+    'value' => 'https://upload-z1.qiniup.com',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '推荐选择最近的地址',
+    'ok' => '',
+    'extend' => '',
+  ),
+  4 => 
+  array (
+    'name' => 'cdnurl',
+    'title' => 'CDN地址',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => 'http://jinglong.springchunjia.cn',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '未绑定CDN的话可使用七牛分配的测试域名',
+    'ok' => '',
+    'extend' => '',
+  ),
+  5 => 
+  array (
+    'name' => 'notifyenabled',
+    'title' => '启用服务端回调',
+    'type' => 'bool',
+    'content' => 
+    array (
+    ),
+    'value' => '0',
+    'rule' => '',
+    'msg' => '',
+    'tip' => '本地开发请禁用服务端回调',
+    'ok' => '',
+    'extend' => '',
+  ),
+  6 => 
+  array (
+    'name' => 'notifyurl',
+    'title' => '回调通知地址',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => 'http://www.yoursite.com/addons/qiniu/index/notify',
+    'rule' => '',
+    'msg' => '',
+    'tip' => '',
+    'ok' => '',
+    'extend' => '',
+  ),
+  7 => 
+  array (
+    'name' => 'uploadmode',
+    'title' => '上传模式',
+    'type' => 'select',
+    'content' => 
+    array (
+      'client' => '客户端直传(速度快,无备份)',
+      'server' => '服务器中转(占用服务器带宽,有备份)',
+    ),
+    'value' => 'server',
+    'rule' => '',
+    'msg' => '',
+    'tip' => '启用服务器中转时务必配置操作员和密码',
+    'ok' => '',
+    'extend' => '',
+  ),
+  8 => 
+  array (
+    'name' => 'savekey',
+    'title' => '保存文件名',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => '/uploads/$(year)$(mon)$(day)/$(etag)$(ext)',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '',
+    'ok' => '',
+    'extend' => '',
+  ),
+  9 => 
+  array (
+    'name' => 'expire',
+    'title' => '上传有效时长',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => '600',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '',
+    'ok' => '',
+    'extend' => '',
+  ),
+  10 => 
+  array (
+    'name' => 'maxsize',
+    'title' => '最大可上传',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => '100M',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '',
+    'ok' => '',
+    'extend' => '',
+  ),
+  11 => 
+  array (
+    'name' => 'mimetype',
+    'title' => '可上传后缀格式',
+    'type' => 'string',
+    'content' => 
+    array (
+    ),
+    'value' => 'jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '',
+    'ok' => '',
+    'extend' => '',
+  ),
+  12 => 
+  array (
+    'name' => 'multiple',
+    'title' => '多文件上传',
+    'type' => 'bool',
+    'content' => 
+    array (
+    ),
+    'value' => '1',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '',
+    'ok' => '',
+    'extend' => '',
+  ),
+  13 => 
+  array (
+    'name' => 'syncdelete',
+    'title' => '附件删除时是否同步删除文件',
+    'type' => 'bool',
+    'content' => 
+    array (
+    ),
+    'value' => '0',
+    'rule' => 'required',
+    'msg' => '',
+    'tip' => '',
+    'ok' => '',
+    'extend' => '',
+  ),
+  14 => 
+  array (
+    'name' => '__tips__',
+    'title' => '温馨提示',
+    'type' => '',
+    'content' => 
+    array (
+    ),
+    'value' => '在使用之前请注册七牛账号并进行认证,注册链接:<a href="https://portal.qiniu.com/signup?code=3l79xtos9w9qq" target="_blank">https://portal.qiniu.com/signup?code=3l79xtos9w9qq</a>',
+    'rule' => '',
+    'msg' => '',
+    'tip' => '',
+    'ok' => '',
+    'extend' => '',
+  ),
+);
diff --git a/addons/qiniu/controller/Index.php b/addons/qiniu/controller/Index.php
new file mode 100644
index 0000000..9417d53
--- /dev/null
+++ b/addons/qiniu/controller/Index.php
@@ -0,0 +1,202 @@
+<?php
+
+namespace addons\qiniu\controller;
+
+use addons\qiniu\library\Auth;
+use app\common\model\Attachment;
+use think\addons\Controller;
+use think\Config;
+
+/**
+ * 七牛管理
+ *
+ */
+class Index extends Controller
+{
+    public function index()
+    {
+        $this->error("当前插件暂无前台页面");
+    }
+
+    /**
+     * 上传接口
+     */
+    public function upload()
+    {
+        Config::set('default_return_type', 'json');
+        if (!session('admin') && !$this->auth->id) {
+            $this->error("请登录后再进行操作");
+        }
+        $config = get_addon_config('qiniu');
+
+        $file = $this->request->file('file');
+        if (!$file || !$file->isValid()) {
+            $this->error("请上传有效的文件");
+        }
+        $fileInfo = $file->getInfo();
+
+        $filePath = $file->getRealPath() ?: $file->getPathname();
+
+        preg_match('/(\d+)(\w+)/', $config['maxsize'], $matches);
+        $type = strtolower($matches[2]);
+        $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
+        $size = (int)$config['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0);
+
+        $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
+        $suffix = $suffix ? $suffix : 'file';
+
+        $md5 = md5_file($filePath);
+        $search = ['$(year)', '$(mon)', '$(day)', '$(etag)', '$(ext)'];
+        $replace = [date("Y"), date("m"), date("d"), $md5, '.' . $suffix];
+        $object = ltrim(str_replace($search, $replace, $config['savekey']), '/');
+
+        $mimetypeArr = explode(',', strtolower($config['mimetype']));
+        $typeArr = explode('/', $fileInfo['type']);
+
+        //检查文件大小
+        if (!$file->checkSize($size)) {
+            $this->error("起过最大可上传文件限制");
+        }
+
+        //验证文件后缀
+        if ($config['mimetype'] !== '*' &&
+            (
+                !in_array($suffix, $mimetypeArr)
+                || (stripos($typeArr[0] . '/', $config['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr)))
+            )
+        ) {
+            $this->error(__('上传格式限制'));
+        }
+
+        $savekey = '/' . $object;
+
+        $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);
+        $fileName = substr($savekey, strripos($savekey, '/') + 1);
+        //先上传到本地
+        $splInfo = $file->move(ROOT_PATH . '/public' . $uploadDir, $fileName);
+        if ($splInfo) {
+            $extparam = $this->request->post();
+            $filePath = $splInfo->getRealPath() ?: $splInfo->getPathname();
+
+            $sha1 = sha1_file($filePath);
+            $imagewidth = $imageheight = 0;
+            if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf'])) {
+                $imgInfo = getimagesize($splInfo->getPathname());
+                $imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
+                $imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
+            }
+            $params = array(
+                'admin_id'    => session('admin.id'),
+                'user_id'     => $this->auth->id,
+                'filesize'    => $fileInfo['size'],
+                'imagewidth'  => $imagewidth,
+                'imageheight' => $imageheight,
+                'imagetype'   => $suffix,
+                'imageframes' => 0,
+                'mimetype'    => $fileInfo['type'],
+                'url'         => $uploadDir . $splInfo->getSaveName(),
+                'uploadtime'  => time(),
+                'storage'     => 'local',
+                'sha1'        => $sha1,
+                'extparam'    => json_encode($extparam),
+            );
+            $attachment = Attachment::create(array_filter($params), true);
+            $policy = array(
+                'saveKey' => ltrim($savekey, '/'),
+            );
+            $auth = new Auth($config['app_key'], $config['secret_key']);
+            $token = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy);
+            $multipart = [
+                ['name' => 'token', 'contents' => $token],
+                [
+                    'name'     => 'file',
+                    'contents' => fopen($filePath, 'r'),
+                    'filename' => $fileName,
+                ]
+            ];
+            try {
+                $client = new \GuzzleHttp\Client();
+                $res = $client->request('POST', $config['uploadurl'], [
+                    'multipart' => $multipart
+                ]);
+                $code = $res->getStatusCode();
+                $operation = $this->getOperateSys();
+                if($operation == 'Linux'){
+                    unlink($filePath);
+                }
+                //成功不做任何操作
+            } catch (\GuzzleHttp\Exception\ClientException $e) {
+                $attachment->delete();
+                unlink($filePath);
+                $this->error("上传失败");
+            }
+
+            $url = '/' . $object;
+
+            //上传成功后将存储变更为qiniu
+            $attachment->storage = 'qiniu';
+            $attachment->save();
+
+            $this->success("上传成功", null, ['url' => $url]);
+        } else {
+            $this->error('上传失败');
+        }
+        return;
+    }
+
+    //判断当前操作系统
+    public function getOperateSys(){
+        $os_name = php_uname('s');
+        //判断
+        if(strpos($os_name,"Linux")!==false){
+            $os_str="Linux";
+        }else if(strpos($os_name,"Windows")!==false){
+            $os_str="Windows";
+        }else{
+            $os_str='';
+        }
+        return $os_str;
+    }
+
+    /**
+     * 通知回调
+     */
+    public function notify()
+    {
+        $config = get_addon_config('qiniu');
+        $auth = new Auth($config['app_key'], $config['secret_key']);
+        $contentType = 'application/x-www-form-urlencoded';
+        $authorization = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : '';
+        if (!$authorization && function_exists('apache_request_headers')) {
+            $headers = apache_request_headers();
+            $authorization = isset($headers['Authorization']) ? $headers['Authorization'] : '';
+        }
+
+        $url = $config['notifyurl'];
+        $body = file_get_contents('php://input');
+        $ret = $auth->verifyCallback($contentType, $authorization, $url, $body);
+        if ($ret) {
+            parse_str($body, $arr);
+            $admin_id = isset($arr['admin']) ? $arr['admin'] : 0;
+            $user_id = isset($arr['user']) ? $arr['user'] : 0;
+            $imageInfo = json_decode($arr['imageInfo'], true);
+            $params = array(
+                'admin_id'    => (int)$admin_id,
+                'user_id'     => (int)$user_id,
+                'filesize'    => $arr['filesize'],
+                'imagewidth'  => isset($imageInfo['width']) ? $imageInfo['width'] : 0,
+                'imageheight' => isset($imageInfo['height']) ? $imageInfo['height'] : 0,
+                'imagetype'   => isset($imageInfo['format']) ? $imageInfo['format'] : '',
+                'imageframes' => 1,
+                'mimetype'    => "image/" . (isset($imageInfo['format']) ? $imageInfo['format'] : ''),
+                'extparam'    => '',
+                'url'         => '/' . $arr['key'],
+                'uploadtime'  => time(),
+                'storage'     => 'qiniu'
+            );
+            Attachment::create($params);
+            return json(['ret' => 'success', 'code' => 1, 'data' => ['url' => $params['url']]]);
+        }
+        return json(['ret' => 'failed']);
+    }
+}
diff --git a/addons/qiniu/info.ini b/addons/qiniu/info.ini
new file mode 100644
index 0000000..517fe29
--- /dev/null
+++ b/addons/qiniu/info.ini
@@ -0,0 +1,8 @@
+name = qiniu
+title = 七牛上传
+intro = 使用七牛云存储,上传时直传七牛
+author = Karson
+website = https://www.fastadmin.net
+version = 1.0.5
+state = 1
+url = /addons/qiniu.html
diff --git a/addons/qiniu/library/Auth.php b/addons/qiniu/library/Auth.php
new file mode 100644
index 0000000..b5bbe39
--- /dev/null
+++ b/addons/qiniu/library/Auth.php
@@ -0,0 +1,160 @@
+<?php
+
+namespace addons\qiniu\library;
+
+final class Auth
+{
+
+    private $accessKey;
+    private $secretKey;
+
+    public function __construct($accessKey, $secretKey)
+    {
+        $this->accessKey = $accessKey;
+        $this->secretKey = $secretKey;
+    }
+
+    public function getAccessKey()
+    {
+        return $this->accessKey;
+    }
+
+    public function sign($data)
+    {
+        $hmac = hash_hmac('sha1', $data, $this->secretKey, true);
+        return $this->accessKey . ':' . $this->base64_urlSafeEncode($hmac);
+    }
+
+    public function signWithData($data)
+    {
+        $encodedData = $this->base64_urlSafeEncode($data);
+        return $this->sign($encodedData) . ':' . $encodedData;
+    }
+
+    public function signRequest($urlString, $body, $contentType = null)
+    {
+        $url = parse_url($urlString);
+        $data = '';
+        if (array_key_exists('path', $url)) {
+            $data = $url['path'];
+        }
+        if (array_key_exists('query', $url)) {
+            $data .= '?' . $url['query'];
+        }
+        $data .= "\n";
+        if ($body !== null && $contentType === 'application/x-www-form-urlencoded') {
+            $data .= $body;
+        }
+        return $this->sign($data);
+    }
+
+    public function verifyCallback($contentType, $originAuthorization, $url, $body)
+    {
+        $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType);
+        return $originAuthorization === $authorization;
+    }
+
+    public function privateDownloadUrl($baseUrl, $expires = 3600)
+    {
+        $deadline = time() + $expires;
+        $pos = strpos($baseUrl, '?');
+        if ($pos !== false) {
+            $baseUrl .= '&e=';
+        } else {
+            $baseUrl .= '?e=';
+        }
+        $baseUrl .= $deadline;
+        $token = $this->sign($baseUrl);
+        return "$baseUrl&token=$token";
+    }
+
+    public function uploadToken($bucket, $key = null, $expires = 3600, $policy = null, $strictPolicy = true)
+    {
+        $deadline = time() + $expires;
+        $scope = $bucket;
+        if ($key !== null) {
+            $scope .= ':' . $key;
+        }
+        $args = self::copyPolicy($args, $policy, $strictPolicy);
+        $args['scope'] = $scope;
+        $args['deadline'] = $deadline;
+        $b = json_encode($args);
+        return $this->signWithData($b);
+    }
+
+    /**
+     * 上传策略,参数规格详见
+     * http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html
+     */
+    private static $policyFields = array(
+        'callbackUrl',
+        'callbackBody',
+        'callbackHost',
+        'callbackBodyType',
+        'callbackFetchKey',
+        'returnUrl',
+        'returnBody',
+        'endUser',
+        'saveKey',
+        'insertOnly',
+        'detectMime',
+        'mimeLimit',
+        'fsizeMin',
+        'fsizeLimit',
+        'persistentOps',
+        'persistentNotifyUrl',
+        'persistentPipeline',
+        'deleteAfterDays',
+        'fileType',
+        'upHosts',
+    );
+
+    private static function copyPolicy(&$policy, $originPolicy, $strictPolicy)
+    {
+        if ($originPolicy === null) {
+            return array();
+        }
+        foreach ($originPolicy as $key => $value) {
+            if (!$strictPolicy || in_array((string)$key, self::$policyFields, true)) {
+                $policy[$key] = $value;
+            }
+        }
+        return $policy;
+    }
+
+    public function authorization($url, $body = null, $contentType = null)
+    {
+        $authorization = 'QBox ' . $this->signRequest($url, $body, $contentType);
+        return array('Authorization' => $authorization);
+    }
+
+    /**
+     * 对提供的数据进行urlsafe的base64编码。
+     *
+     * @param string $data 待编码的数据,一般为字符串
+     *
+     * @return string 编码后的字符串
+     * @link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64
+     */
+    function base64_urlSafeEncode($data)
+    {
+        $find = array('+', '/');
+        $replace = array('-', '_');
+        return str_replace($find, $replace, base64_encode($data));
+    }
+
+    /**
+     * 对提供的urlsafe的base64编码的数据进行解码
+     *
+     * @param string $str 待解码的数据,一般为字符串
+     *
+     * @return string 解码后的字符串
+     */
+    function base64_urlSafeDecode($str)
+    {
+        $find = array('-', '_');
+        $replace = array('+', '/');
+        return base64_decode(str_replace($find, $replace, $str));
+    }
+
+}
diff --git a/application/admin/command/Install/install.lock b/application/admin/command/Install/install.lock
new file mode 100644
index 0000000..56a6051
--- /dev/null
+++ b/application/admin/command/Install/install.lock
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/application/admin/controller/Banner.php b/application/admin/controller/Banner.php
new file mode 100644
index 0000000..9838a83
--- /dev/null
+++ b/application/admin/controller/Banner.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\common\controller\Backend;
+
+/**
+ * 首页轮播图
+ *
+ * @icon fa fa-circle-o
+ */
+class Banner extends Backend
+{
+    
+    /**
+     * Banner模型对象
+     * @var \app\admin\model\Banner
+     */
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = new \app\admin\model\Banner;
+
+    }
+    
+    /**
+     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
+     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
+     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+     */
+    
+
+    /**
+     * 查看
+     */
+    public function index()
+    {
+        //当前是否为关联查询
+        $this->relationSearch = false;
+        //设置过滤方法
+        $this->request->filter(['strip_tags', 'trim']);
+        if ($this->request->isAjax())
+        {
+            //如果发送的来源是Selectpage,则转发到Selectpage
+            if ($this->request->request('keyField'))
+            {
+                return $this->selectpage();
+            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+            $total = $this->model
+                    
+                    ->where($where)
+                    ->order($sort, $order)
+                    ->count();
+
+            $list = $this->model
+                    
+                    ->where($where)
+                    ->order($sort, $order)
+                    ->limit($offset, $limit)
+                    ->select();
+
+            foreach ($list as $row) {
+                $row->visible(['id','image','createtime']);
+                
+            }
+            $list = collection($list)->toArray();
+            $result = array("total" => $total, "rows" => $list);
+
+            return json($result);
+        }
+        return $this->view->fetch();
+    }
+}
diff --git a/application/admin/controller/Command.php b/application/admin/controller/Command.php
new file mode 100644
index 0000000..64669b6
--- /dev/null
+++ b/application/admin/controller/Command.php
@@ -0,0 +1,219 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\common\controller\Backend;
+use think\Config;
+use think\console\Input;
+use think\Db;
+use think\Exception;
+
+/**
+ * 在线命令管理
+ *
+ * @icon fa fa-circle-o
+ */
+class Command extends Backend
+{
+
+    /**
+     * Command模型对象
+     */
+    protected $model = null;
+    protected $noNeedRight = ['get_controller_list', 'get_field_list'];
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('Command');
+        $this->view->assign("statusList", $this->model->getStatusList());
+    }
+
+    /**
+     * 添加
+     */
+    public function add()
+    {
+
+        $tableList = [];
+        $list = \think\Db::query("SHOW TABLES");
+        foreach ($list as $key => $row) {
+            $tableList[reset($row)] = reset($row);
+        }
+
+        $this->view->assign("tableList", $tableList);
+        return $this->view->fetch();
+    }
+
+    /**
+     * 获取字段列表
+     * @internal
+     */
+    public function get_field_list()
+    {
+        $dbname = Config::get('database.database');
+        $prefix = Config::get('database.prefix');
+        $table = $this->request->request('table');
+        //从数据库中获取表字段信息
+        $sql = "SELECT * FROM `information_schema`.`columns` "
+            . "WHERE TABLE_SCHEMA = ? AND table_name = ? "
+            . "ORDER BY ORDINAL_POSITION";
+        //加载主表的列
+        $columnList = Db::query($sql, [$dbname, $table]);
+        $fieldlist = [];
+        foreach ($columnList as $index => $item) {
+            $fieldlist[] = $item['COLUMN_NAME'];
+        }
+        $this->success("", null, ['fieldlist' => $fieldlist]);
+    }
+
+    /**
+     * 获取控制器列表
+     * @internal
+     */
+    public function get_controller_list()
+    {
+        $adminPath = dirname(__DIR__) . DS;
+        $controllerDir = $adminPath . 'controller' . DS;
+        $files = new \RecursiveIteratorIterator(
+            new \RecursiveDirectoryIterator($controllerDir), \RecursiveIteratorIterator::LEAVES_ONLY
+        );
+        $list = [];
+        foreach ($files as $name => $file) {
+            if (!$file->isDir()) {
+                $filePath = $file->getRealPath();
+                $name = str_replace($controllerDir, '', $filePath);
+                $name = str_replace(DS, "/", $name);
+                $list[] = ['id' => $name, 'name' => $name];
+            }
+        }
+        $pageNumber = $this->request->request("pageNumber");
+        $pageSize = $this->request->request("pageSize");
+        return json(['list' => array_slice($list, ($pageNumber - 1) * $pageSize, $pageSize), 'total' => count($list)]);
+    }
+
+    /**
+     * 详情
+     */
+    public function detail($ids)
+    {
+        $row = $this->model->get($ids);
+        if (!$row)
+            $this->error(__('No Results were found'));
+        $this->view->assign("row", $row);
+        return $this->view->fetch();
+    }
+
+    /**
+     * 执行
+     */
+    public function execute($ids)
+    {
+        $row = $this->model->get($ids);
+        if (!$row)
+            $this->error(__('No Results were found'));
+        $result = $this->doexecute($row['type'], json_decode($row['params'], true));
+        $this->success("", null, ['result' => $result]);
+    }
+
+    /**
+     * 执行命令
+     */
+    public function command($action = '')
+    {
+        $commandtype = $this->request->request("commandtype");
+        $params = $this->request->request();
+        $allowfields = [
+            'crud' => 'table,controller,model,fields,force,local,delete,menu',
+            'menu' => 'controller,delete',
+            'min'  => 'module,resource,optimize',
+            'api'  => 'url,module,output,template,force,title,author,class,language',
+        ];
+        $argv = [];
+        $allowfields = isset($allowfields[$commandtype]) ? explode(',', $allowfields[$commandtype]) : [];
+        $allowfields = array_filter(array_intersect_key($params, array_flip($allowfields)));
+        if (isset($params['local']) && !$params['local']) {
+            $allowfields['local'] = $params['local'];
+        } else {
+            unset($allowfields['local']);
+        }
+        foreach ($allowfields as $key => $param) {
+            $argv[] = "--{$key}=" . (is_array($param) ? implode(',', $param) : $param);
+        }
+        if ($commandtype == 'crud') {
+            $extend = 'setcheckboxsuffix,enumradiosuffix,imagefield,filefield,intdatesuffix,switchsuffix,citysuffix,selectpagesuffix,selectpagessuffix,ignorefields,sortfield,editorsuffix,headingfilterfield';
+            $extendArr = explode(',', $extend);
+            foreach ($params as $index => $item) {
+                if (in_array($index, $extendArr)) {
+                    foreach (explode(',', $item) as $key => $value) {
+                        if ($value) {
+                            $argv[] = "--{$index}={$value}";
+                        }
+                    }
+                }
+            }
+            $isrelation = (int)$this->request->request('isrelation');
+            if ($isrelation && isset($params['relation'])) {
+                foreach ($params['relation'] as $index => $relation) {
+                    foreach ($relation as $key => $value) {
+                        $argv[] = "--{$key}=" . (is_array($value) ? implode(',', $value) : $value);
+                    }
+                }
+            }
+        } else if ($commandtype == 'menu') {
+            if (isset($params['allcontroller']) && $params['allcontroller']) {
+                $argv[] = "--controller=all-controller";
+            } else {
+                foreach (explode(',', $params['controllerfile']) as $index => $param) {
+                    if ($param) {
+                        $argv[] = "--controller=" . substr($param, 0, -4);
+                    }
+                }
+            }
+        } else if ($commandtype == 'min') {
+
+        } else if ($commandtype == 'api') {
+
+        } else {
+
+        }
+        if ($action == 'execute') {
+            $result = $this->doexecute($commandtype, $argv);
+            $this->success("", null, ['result' => $result]);
+        } else {
+            $this->success("", null, ['command' => "php think {$commandtype} " . implode(' ', $argv)]);
+        }
+
+        return;
+    }
+
+    protected function doexecute($commandtype, $argv)
+    {
+        $commandName = "\\app\\admin\\command\\" . ucfirst($commandtype);
+        $input = new Input($argv);
+        $output = new \addons\command\library\Output();
+        $command = new $commandName($commandtype);
+        $data = [
+            'type'        => $commandtype,
+            'params'      => json_encode($argv),
+            'command'     => "php think {$commandtype} " . implode(' ', $argv),
+            'executetime' => time(),
+        ];
+        $this->model->save($data);
+        try {
+            $command->run($input, $output);
+            $result = implode("\n", $output->getMessage());
+            $this->model->status = 'successed';
+        } catch (Exception $e) {
+            $result = implode("\n", $output->getMessage()) . "\n";
+            $result .= $e->getMessage();
+            $this->model->status = 'failured';
+        }
+        $result = trim($result);
+        $this->model->content = $result;
+        $this->model->save();
+        return $result;
+    }
+
+
+}
diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php
index 185200e..eabdf96 100644
--- a/application/admin/controller/Index.php
+++ b/application/admin/controller/Index.php
@@ -33,10 +33,10 @@ class Index extends Backend
     {
         //左侧菜单
         list($menulist, $navlist, $fixedmenu, $referermenu) = $this->auth->getSidebar([
-            'dashboard' => 'hot',
-            'addon'     => ['new', 'red', 'badge'],
-            'auth/rule' => __('Menu'),
-            'general'   => ['new', 'purple'],
+            'dashboard' => '',
+            'addon'     => ['', 'red', 'badge'],
+            'auth/rule' => __(''),
+            'general'   => ['', 'purple'],
         ], $this->view->site['fixedpage']);
         $action = $this->request->request('action');
         if ($this->request->isPost()) {
diff --git a/application/admin/lang/zh-cn/banner.php b/application/admin/lang/zh-cn/banner.php
new file mode 100644
index 0000000..fa72ab4
--- /dev/null
+++ b/application/admin/lang/zh-cn/banner.php
@@ -0,0 +1,8 @@
+<?php
+
+return [
+    'Id'         => 'ID',
+    'Image'      => '轮播图',
+    'Createtime' => '创建时间',
+    'Updatetime' => '更新时间'
+];
diff --git a/application/admin/lang/zh-cn/command.php b/application/admin/lang/zh-cn/command.php
new file mode 100644
index 0000000..b010250
--- /dev/null
+++ b/application/admin/lang/zh-cn/command.php
@@ -0,0 +1,16 @@
+<?php
+
+return [
+    'Id'            => 'ID',
+    'Type'          => '类型',
+    'Params'        => '参数',
+    'Command'       => '命令',
+    'Content'       => '返回结果',
+    'Executetime'   => '执行时间',
+    'Createtime'    => '创建时间',
+    'Updatetime'    => '更新时间',
+    'Execute again' => '再次执行',
+    'Successed'     => '成功',
+    'Failured'      => '失败',
+    'Status'        => '状态'
+];
diff --git a/application/admin/model/Banner.php b/application/admin/model/Banner.php
new file mode 100644
index 0000000..0c58b2a
--- /dev/null
+++ b/application/admin/model/Banner.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace app\admin\model;
+
+use think\Model;
+
+
+class Banner extends Model
+{
+
+    
+
+    
+
+    // 表名
+    protected $name = 'banner';
+    
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    protected $deleteTime = false;
+
+    // 追加属性
+    protected $append = [
+
+    ];
+    
+
+    
+
+
+
+
+
+
+
+}
diff --git a/application/admin/model/Command.php b/application/admin/model/Command.php
new file mode 100644
index 0000000..131e0bd
--- /dev/null
+++ b/application/admin/model/Command.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace app\admin\model;
+
+use think\Model;
+
+class Command extends Model
+{
+    // 表名
+    protected $name = 'command';
+
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+
+    // 追加属性
+    protected $append = [
+        'executetime_text',
+        'type_text',
+        'status_text'
+    ];
+
+
+    public function getStatusList()
+    {
+        return ['successed' => __('Successed'), 'failured' => __('Failured')];
+    }
+
+
+    public function getExecutetimeTextAttr($value, $data)
+    {
+        $value = $value ? $value : $data['executetime'];
+        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
+    }
+
+    public function getTypeTextAttr($value, $data)
+    {
+        $value = $value ? $value : $data['type'];
+        $list = ['crud' => '一键生成CRUD', 'menu' => '一键生成菜单', 'min' => '一键压缩打包', 'api' => '一键生成文档'];
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+    public function getStatusTextAttr($value, $data)
+    {
+        $value = $value ? $value : $data['status'];
+        $list = $this->getStatusList();
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+    protected function setExecutetimeAttr($value)
+    {
+        return $value && !is_numeric($value) ? strtotime($value) : $value;
+    }
+
+
+}
diff --git a/application/admin/validate/Banner.php b/application/admin/validate/Banner.php
new file mode 100644
index 0000000..f817f5d
--- /dev/null
+++ b/application/admin/validate/Banner.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\validate;
+
+use think\Validate;
+
+class Banner extends Validate
+{
+    /**
+     * 验证规则
+     */
+    protected $rule = [
+    ];
+    /**
+     * 提示消息
+     */
+    protected $message = [
+    ];
+    /**
+     * 验证场景
+     */
+    protected $scene = [
+        'add'  => [],
+        'edit' => [],
+    ];
+    
+}
diff --git a/application/admin/validate/Command.php b/application/admin/validate/Command.php
new file mode 100644
index 0000000..9da8fa6
--- /dev/null
+++ b/application/admin/validate/Command.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\validate;
+
+use think\Validate;
+
+class Command extends Validate
+{
+    /**
+     * 验证规则
+     */
+    protected $rule = [
+    ];
+    /**
+     * 提示消息
+     */
+    protected $message = [
+    ];
+    /**
+     * 验证场景
+     */
+    protected $scene = [
+        'add'  => [],
+        'edit' => [],
+    ];
+
+}
diff --git a/application/admin/view/banner/add.html b/application/admin/view/banner/add.html
new file mode 100644
index 0000000..378894b
--- /dev/null
+++ b/application/admin/view/banner/add.html
@@ -0,0 +1,24 @@
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class="input-group">
+                <input id="c-image" data-rule="required" class="form-control" size="50" name="row[image]" type="text">
+                <div class="input-group-addon no-border no-padding">
+                    <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
+                    <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
+                </div>
+                <span class="msg-box n-right" for="c-image"></span>
+            </div>
+            <ul class="row list-inline plupload-preview" id="p-image"></ul>
+        </div>
+    </div>
+    <div class="form-group layer-footer">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>
diff --git a/application/admin/view/banner/edit.html b/application/admin/view/banner/edit.html
new file mode 100644
index 0000000..41b1126
--- /dev/null
+++ b/application/admin/view/banner/edit.html
@@ -0,0 +1,24 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class="input-group">
+                <input id="c-image" data-rule="required" class="form-control" size="50" name="row[image]" type="text" value="{$row.image|htmlentities}">
+                <div class="input-group-addon no-border no-padding">
+                    <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
+                    <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
+                </div>
+                <span class="msg-box n-right" for="c-image"></span>
+            </div>
+            <ul class="row list-inline plupload-preview" id="p-image"></ul>
+        </div>
+    </div>
+    <div class="form-group layer-footer">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>
diff --git a/application/admin/view/banner/index.html b/application/admin/view/banner/index.html
new file mode 100644
index 0000000..8365745
--- /dev/null
+++ b/application/admin/view/banner/index.html
@@ -0,0 +1,35 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
+                        <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('banner/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
+                        <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('banner/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
+                        <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('banner/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                        <!--<a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('banner/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>-->
+
+                        <!--<div class="dropdown btn-group {:$auth->check('banner/multi')?'':'hide'}">-->
+                            <!--<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>-->
+                            <!--<ul class="dropdown-menu text-left" role="menu">-->
+                                <!--<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>-->
+                                <!--<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>-->
+                            <!--</ul>-->
+                        <!--</div>-->
+
+                        
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                           data-operate-edit="{:$auth->check('banner/edit')}" 
+                           data-operate-del="{:$auth->check('banner/del')}" 
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
diff --git a/application/admin/view/command/add.html b/application/admin/view/command/add.html
new file mode 100644
index 0000000..bb69b43
--- /dev/null
+++ b/application/admin/view/command/add.html
@@ -0,0 +1,400 @@
+<style>
+    .relation-item {margin-top:10px;}
+    legend {padding-bottom:5px;font-size:14px;font-weight:600;}
+    label {font-weight:normal;}
+    .form-control{padding:6px 8px;}
+    #extend-zone .col-xs-2 {margin-top:10px;padding-right:0;}
+    #extend-zone .col-xs-2:nth-child(6n+0) {padding-right:15px;}
+</style>
+<div class="panel panel-default panel-intro">
+    <div class="panel-heading">
+        <ul class="nav nav-tabs">
+            <li class="active"><a href="#crud" data-toggle="tab">{:__('一键生成CRUD')}</a></li>
+            <li><a href="#menu" data-toggle="tab">{:__('一键生成菜单')}</a></li>
+            <li><a href="#min" data-toggle="tab">{:__('一键压缩打包')}</a></li>
+            <li><a href="#api" data-toggle="tab">{:__('一键生成API文档')}</a></li>
+        </ul>
+    </div>
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="crud">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <form role="form">
+                            <input type="hidden" name="commandtype" value="crud" />
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <input checked="" name="isrelation" type="hidden" value="0">
+                                        <label class="control-label" data-toggle="tooltip" title="当前只支持生成1对1关联模型,选中后请配置关联表和字段">
+                                            <input name="isrelation" type="checkbox" value="1">
+                                            关联模型
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="local" type="hidden" value="1">
+                                        <label class="control-label" data-toggle="tooltip" title="默认模型生成在application/admin/model目录下,选中后将生成在application/common/model目录下">
+                                            <input name="local" type="checkbox" value="0"> 全局模型类
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="delete" type="hidden" value="0">
+                                        <label class="control-label" data-toggle="tooltip" title="删除CRUD生成的相关文件">
+                                            <input name="delete" type="checkbox" value="1"> 删除模式
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="force" type="hidden" value="0">
+                                        <label class="control-label" data-toggle="tooltip" title="选中后,如果已经存在同名文件将被覆盖。如果是删除将不再提醒">
+                                            <input name="force" type="checkbox" value="1">
+                                            强制覆盖模式
+                                        </label>
+                                    </div>
+                                    <!--
+                                    <div class="col-xs-3">
+                                        <input checked="" name="menu" type="hidden" value="0">
+                                        <label class="control-label" data-toggle="tooltip" title="选中后,将同时生成后台菜单规则">
+                                            <input name="menu" type="checkbox" value="1">
+                                            生成菜单
+                                        </label>
+                                    </div>
+                                    -->
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <legend>主表设置</legend>
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <label>请选择主表</label>
+                                        {:build_select('table',$tableList,null,['class'=>'form-control selectpicker']);}
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>自定义控制器名</label>
+                                        <input type="text" class="form-control" name="controller" data-toggle="tooltip" title="默认根据表名自动生成,如果需要放在二级目录请手动填写" placeholder="支持目录层级,以/分隔">
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>自定义模型名</label>
+                                        <input type="text" class="form-control" name="model" data-toggle="tooltip" title="默认根据表名自动生成" placeholder="不支持目录层级">
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>请选择显示字段(默认全部)</label>
+                                        <select name="fields[]" id="fields" multiple style="height:30px;" class="form-control selectpicker"></select>
+                                    </div>
+
+                                </div>
+
+                            </div>
+
+                            <div class="form-group hide" id="relation-zone">
+                                <legend>关联表设置</legend>
+
+                                <div class="row" style="margin-top:15px;">
+                                    <div class="col-xs-12">
+                                        <a href="javascript:;" class="btn btn-primary btn-sm btn-newrelation" data-index="1">追加关联模型</a>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <hr>
+                            <div class="form-group" id="extend-zone">
+                                <legend>字段识别设置 <span style="font-size:12px;font-weight: normal;">(与之匹配的字段都将生成相应组件)</span></legend>
+                                <div class="row">
+                                    <div class="col-xs-2">
+                                        <label>复选框后缀</label>
+                                        <input type="text" class="form-control" name="setcheckboxsuffix" placeholder="默认为set类型" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>单选框后缀</label>
+                                        <input type="text" class="form-control" name="enumradiosuffix" placeholder="默认为enum类型" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>图片类型后缀</label>
+                                        <input type="text" class="form-control" name="imagefield" placeholder="默认为image,images,avatar,avatars" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>文件类型后缀</label>
+                                        <input type="text" class="form-control" name="filefield" placeholder="默认为file,files" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>日期时间后缀</label>
+                                        <input type="text" class="form-control" name="intdatesuffix" placeholder="默认为time" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>开关后缀</label>
+                                        <input type="text" class="form-control" name="switchsuffix" placeholder="默认为switch" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>城市选择后缀</label>
+                                        <input type="text" class="form-control" name="citysuffix" placeholder="默认为city" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>动态下拉后缀(单)</label>
+                                        <input type="text" class="form-control" name="selectpagesuffix" placeholder="默认为_id" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>动态下拉后缀(多)</label>
+                                        <input type="text" class="form-control" name="selectpagessuffix" placeholder="默认为_ids" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>忽略的字段</label>
+                                        <input type="text" class="form-control" name="ignorefields" placeholder="默认无" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>排序字段</label>
+                                        <input type="text" class="form-control" name="sortfield" placeholder="默认为weigh" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>富文本编辑器</label>
+                                        <input type="text" class="form-control" name="editorsuffix" placeholder="默认为content" />
+                                    </div>
+                                    <div class="col-xs-2">
+                                        <label>选项卡过滤字段</label>
+                                        <input type="text" class="form-control" name="headingfilterfield" placeholder="默认为status" />
+                                    </div>
+
+                                </div>
+
+                            </div>
+
+                            <div class="form-group">
+                                <legend>生成命令行</legend>
+                                <textarea class="form-control" data-toggle="tooltip" title="如果在线执行命令失败,可以将命令复制到命令行进行执行" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>返回结果</legend>
+                                <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                    <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
+                                    <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
+                            </div>
+
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="tab-pane fade" id="menu">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <form role="form">
+                            <input type="hidden" name="commandtype" value="menu" />
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <input checked="" name="allcontroller" type="hidden" value="0">
+                                        <label class="control-label">
+                                            <input name="allcontroller" data-toggle="collapse" data-target="#controller" type="checkbox" value="1"> 一键生成全部控制器
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="delete" type="hidden" value="0">
+                                        <label class="control-label">
+                                            <input name="delete" type="checkbox" value="1"> 删除模式
+                                        </label>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <input checked="" name="force" type="hidden" value="0">
+                                        <label class="control-label">
+                                            <input name="force" type="checkbox" value="1"> 强制覆盖模式
+                                        </label>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group in" id="controller">
+                                <legend>控制器设置</legend>
+
+                                <div class="row" style="margin-top:15px;">
+                                    <div class="col-xs-12">
+                                        <input type="text" name="controllerfile" class="form-control selectpage" style="width:720px;" data-source="command/get_controller_list" data-multiple="true" name="controller" placeholder="请选择控制器" />
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>生成命令行</legend>
+                                <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>返回结果</legend>
+                                <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
+                                <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
+                            </div>
+
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="tab-pane fade" id="min">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <form role="form">
+                            <input type="hidden" name="commandtype" value="min" />
+                            <div class="form-group">
+                                <legend>基础设置</legend>
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <label>请选择压缩模块</label>
+                                        <select name="module" class="form-control selectpicker">
+                                            <option value="all" selected>全部</option>
+                                            <option value="backend">后台Backend</option>
+                                            <option value="frontend">前台Frontend</option>
+                                        </select>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>请选择压缩资源</label>
+                                        <select name="resource" class="form-control selectpicker">
+                                            <option value="all" selected>全部</option>
+                                            <option value="js">JS</option>
+                                            <option value="css">CSS</option>
+                                        </select>
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>请选择压缩模式</label>
+                                        <select name="optimize" class="form-control selectpicker">
+                                            <option value="">无</option>
+                                            <option value="uglify">uglify</option>
+                                            <option value="closure">closure</option>
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group in">
+                                <legend>控制器设置</legend>
+
+                                <div class="row" style="margin-top:15px;">
+                                    <div class="col-xs-12">
+
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>生成命令行</legend>
+                                <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>返回结果</legend>
+                                <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
+                                <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
+                            </div>
+
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="tab-pane fade" id="api">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <form role="form">
+                            <input type="hidden" name="commandtype" value="api" />
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <input checked="" name="force" type="hidden" value="0">
+                                        <label class="control-label">
+                                            <input name="force" type="checkbox" value="1">
+                                            覆盖模式
+                                        </label>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <legend>文档设置</legend>
+                                <div class="row">
+                                    <div class="col-xs-3">
+                                        <label>请输入接口URL</label>
+                                        <input type="text" name="url" class="form-control" placeholder="API URL,可留空" />
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>接口生成文件</label>
+                                        <input type="text" name="output" class="form-control" placeholder="留空则使用api.html" />
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>模板文件</label>
+                                        <input type="text" name="template" class="form-control" placeholder="如果不清楚请留空" />
+                                    </div>
+                                </div>
+                                <div class="row" style="margin-top:10px;">
+                                    <div class="col-xs-3">
+                                        <label>文档标题</label>
+                                        <input type="text" name="title" class="form-control" placeholder="默认为FastAdmin" />
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>文档作者</label>
+                                        <input type="text" name="author" class="form-control" placeholder="默认为FastAdmin" />
+                                    </div>
+                                    <div class="col-xs-3">
+                                        <label>文档语言</label>
+                                        <select name="language" class="form-control">
+                                            <option value="" selected>请选择语言</option>
+                                            <option value="zh-cn">中文</option>
+                                            <option value="en">英文</option>
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>生成命令行</legend>
+                                <textarea class="form-control" rel="command" rows="1" placeholder="请点击生成命令行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <legend>返回结果</legend>
+                                <textarea class="form-control" rel="result" rows="5" placeholder="请点击立即执行"></textarea>
+                            </div>
+
+                            <div class="form-group">
+                                <button type="button" class="btn btn-info btn-embossed btn-command">{:__('生成命令行')}</button>
+                                <button type="button" class="btn btn-success btn-embossed btn-execute">{:__('立即执行')}</button>
+                            </div>
+
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script id="relationtpl" type="text/html">
+    <div class="row relation-item">
+        <div class="col-xs-2">
+            <label>请选择关联表</label>
+            <select name="relation[<%=index%>][relation]" class="form-control relationtable"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>请选择关联类型</label>
+            <select name="relation[<%=index%>][relationmode]" class="form-control relationmode"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>关联外键</label>
+            <select name="relation[<%=index%>][relationforeignkey]" class="form-control relationforeignkey"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>关联主键</label>
+            <select name="relation[<%=index%>][relationprimarykey]" class="form-control relationprimarykey"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>请选择显示字段</label>
+            <select name="relation[<%=index%>][relationfields][]" multiple class="form-control relationfields"></select>
+        </div>
+        <div class="col-xs-2">
+            <label>&nbsp;</label>
+            <a href="javascript:;" class="btn btn-danger btn-block btn-removerelation">移除</a>
+        </div>
+    </div>
+</script>
\ No newline at end of file
diff --git a/application/admin/view/command/detail.html b/application/admin/view/command/detail.html
new file mode 100644
index 0000000..24bf12d
--- /dev/null
+++ b/application/admin/view/command/detail.html
@@ -0,0 +1,42 @@
+<table class="table table-striped">
+    <thead>
+    <tr>
+        <th>{:__('Title')}</th>
+        <th>{:__('Content')}</th>
+    </tr>
+    </thead>
+    <tbody>
+    <tr>
+        <td>{:__('Type')}</td>
+        <td>{$row.type}({$row.type_text})</td>
+    </tr>
+    <tr>
+        <td>{:__('Params')}</td>
+        <td>{$row.params}</td>
+    </tr>
+    <tr>
+        <td>{:__('Command')}</td>
+        <td>{$row.command}</td>
+    </tr>
+    <tr>
+        <td>{:__('Content')}</td>
+        <td>
+            <textarea class="form-control" name="" id="" cols="60" rows="10">{$row.content}</textarea>
+        </td>
+    </tr>
+    <tr>
+        <td>{:__('Executetime')}</td>
+        <td>{$row.executetime|datetime}</td>
+    </tr>
+    <tr>
+        <td>{:__('Status')}</td>
+        <td>{$row.status_text}</td>
+    </tr>
+    </tbody>
+</table>
+<div class="hide layer-footer">
+    <label class="control-label col-xs-12 col-sm-2"></label>
+    <div class="col-xs-12 col-sm-8">
+        <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
+    </div>
+</div>
\ No newline at end of file
diff --git a/application/admin/view/command/index.html b/application/admin/view/command/index.html
new file mode 100644
index 0000000..3b4f823
--- /dev/null
+++ b/application/admin/view/command/index.html
@@ -0,0 +1,25 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
+                        <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('command/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
+                        <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('command/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover" 
+                           data-operate-detail="{:$auth->check('command/detail')}"
+                           data-operate-execute="{:$auth->check('command/execute')}"
+                           data-operate-del="{:$auth->check('command/del')}"
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
diff --git a/application/admin/view/common/menu.html b/application/admin/view/common/menu.html
index da037c0..146e1e4 100644
--- a/application/admin/view/common/menu.html
+++ b/application/admin/view/common/menu.html
@@ -36,9 +36,9 @@
         {$menulist}
 
         <!--以下4行可以删除或改成自己的链接,但建议你在你的网站上添加一个FastAdmin的链接-->
-        <li class="header" data-rel="external">{:__('Links')}</li>
-        <li data-rel="external"><a href="https://doc.fastadmin.net" target="_blank"><i class="fa fa-list text-red"></i> <span>{:__('Docs')}</span></a></li>
-        <li data-rel="external"><a href="https://forum.fastadmin.net" target="_blank"><i class="fa fa-comment text-yellow"></i> <span>{:__('Forum')}</span></a></li>
-        <li data-rel="external"><a href="https://jq.qq.com/?_wv=1027&k=487PNBb" target="_blank"><i class="fa fa-qq text-aqua"></i> <span>{:__('QQ qun')}</span></a></li>
+        <!--<li class="header" data-rel="external">{:__('Links')}</li>-->
+        <!--<li data-rel="external"><a href="https://doc.fastadmin.net" target="_blank"><i class="fa fa-list text-red"></i> <span>{:__('Docs')}</span></a></li>-->
+        <!--<li data-rel="external"><a href="https://forum.fastadmin.net" target="_blank"><i class="fa fa-comment text-yellow"></i> <span>{:__('Forum')}</span></a></li>-->
+        <!--<li data-rel="external"><a href="https://jq.qq.com/?_wv=1027&k=487PNBb" target="_blank"><i class="fa fa-qq text-aqua"></i> <span>{:__('QQ qun')}</span></a></li>-->
     </ul>
 </section>
\ No newline at end of file
diff --git a/application/config.php b/application/config.php
index 64fda49..987a814 100644
--- a/application/config.php
+++ b/application/config.php
@@ -18,7 +18,7 @@ return [
     // 应用命名空间
     'app_namespace'          => 'app',
     // 应用调试模式
-    'app_debug'              => Env::get('app.debug', false),
+    'app_debug'              => Env::get('app.debug', true),
     // 应用Trace
     'app_trace'              => Env::get('app.trace', false),
     // 应用模式状态
diff --git a/application/database.php b/application/database.php
index 607dee7..3460c46 100644
--- a/application/database.php
+++ b/application/database.php
@@ -16,13 +16,13 @@ return [
     // 数据库类型
     'type'            => Env::get('database.type', 'mysql'),
     // 服务器地址
-    'hostname'        => Env::get('database.hostname', '127.0.0.1'),
+    'hostname'        => Env::get('database.hostname', '39.107.114.243'),
     // 数据库名
-    'database'        => Env::get('database.database', 'fastadmin'),
+    'database'        => Env::get('database.database', 'feifangu'),
     // 用户名
     'username'        => Env::get('database.username', 'root'),
     // 密码
-    'password'        => Env::get('database.password', ''),
+    'password'        => Env::get('database.password', 'jinglong743558'),
     // 端口
     'hostport'        => Env::get('database.hostport', ''),
     // 连接dsn
@@ -32,7 +32,7 @@ return [
     // 数据库编码默认采用utf8
     'charset'         => Env::get('database.charset', 'utf8'),
     // 数据库表前缀
-    'prefix'          => Env::get('database.prefix', 'fa_'),
+    'prefix'          => Env::get('database.prefix', 'ffg_'),
     // 数据库调试模式
     'debug'           => Env::get('database.debug', true),
     // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
diff --git a/application/extra/addons.php b/application/extra/addons.php
index e74b2f9..4db2c84 100644
--- a/application/extra/addons.php
+++ b/application/extra/addons.php
@@ -4,6 +4,18 @@ return array (
   'autoload' => false,
   'hooks' => 
   array (
+    'config_init' => 
+    array (
+      0 => 'nkeditor',
+    ),
+    'upload_config_init' => 
+    array (
+      0 => 'qiniu',
+    ),
+    'upload_delete' => 
+    array (
+      0 => 'qiniu',
+    ),
   ),
   'route' => 
   array (
diff --git a/public/XzuemHTJfG.php b/public/XzuemHTJfG.php
new file mode 100644
index 0000000..a1c1350
--- /dev/null
+++ b/public/XzuemHTJfG.php
@@ -0,0 +1,38 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st <liu21st@gmail.com>
+// +----------------------------------------------------------------------
+// [ 后台入口文件 ]
+// 使用此文件可以达到隐藏admin模块的效果
+// 建议将admin.php改成其它任意的文件名,同时修改config.php中的'deny_module_list',把admin模块也添加进去
+// 定义应用目录
+define('APP_PATH', __DIR__ . '/../application/');
+
+// 判断是否安装FastAdmin
+if (!is_file(APP_PATH . 'admin/command/Install/install.lock'))
+{
+    header("location:./install.php");
+    exit;
+}
+
+// 加载框架引导文件
+require __DIR__ . '/../thinkphp/base.php';
+
+// 绑定到admin模块
+\think\Route::bind('admin');
+
+// 关闭路由
+\think\App::route(false);
+
+// 设置根url
+\think\Url::root('');
+
+// 执行应用
+\think\App::run()->send();
diff --git a/public/admin.php b/public/admin.php
deleted file mode 100644
index a1c1350..0000000
--- a/public/admin.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-// [ 后台入口文件 ]
-// 使用此文件可以达到隐藏admin模块的效果
-// 建议将admin.php改成其它任意的文件名,同时修改config.php中的'deny_module_list',把admin模块也添加进去
-// 定义应用目录
-define('APP_PATH', __DIR__ . '/../application/');
-
-// 判断是否安装FastAdmin
-if (!is_file(APP_PATH . 'admin/command/Install/install.lock'))
-{
-    header("location:./install.php");
-    exit;
-}
-
-// 加载框架引导文件
-require __DIR__ . '/../thinkphp/base.php';
-
-// 绑定到admin模块
-\think\Route::bind('admin');
-
-// 关闭路由
-\think\App::route(false);
-
-// 设置根url
-\think\Url::root('');
-
-// 执行应用
-\think\App::run()->send();
diff --git a/public/assets/addons/nkeditor/css/common.css b/public/assets/addons/nkeditor/css/common.css
new file mode 100644
index 0000000..12fa84e
--- /dev/null
+++ b/public/assets/addons/nkeditor/css/common.css
@@ -0,0 +1,5 @@
+
+.ke-container-black .ke-toolbar .ke-icon-remoteimage {
+    background-image: url(../img/download.png);
+    background-size: 16px 16px;
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/img/download.png b/public/assets/addons/nkeditor/img/download.png
new file mode 100644
index 0000000..1945ae7
Binary files /dev/null and b/public/assets/addons/nkeditor/img/download.png differ
diff --git a/public/assets/addons/nkeditor/img/downloading.png b/public/assets/addons/nkeditor/img/downloading.png
new file mode 100644
index 0000000..1d6cbd1
Binary files /dev/null and b/public/assets/addons/nkeditor/img/downloading.png differ
diff --git a/public/assets/addons/nkeditor/js/customplugin.js b/public/assets/addons/nkeditor/js/customplugin.js
new file mode 100644
index 0000000..79075e9
--- /dev/null
+++ b/public/assets/addons/nkeditor/js/customplugin.js
@@ -0,0 +1,74 @@
+define(['nkeditor-core'], function (Nkeditor) {
+    Nkeditor.plugin('multiimage', function (K) {
+        var self = this, name = 'multiimage', lang = self.lang(name + '.'),
+            allowImages = K.undef(self.allowImages, false);
+
+        var click = function () {
+
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<div class=""><div class="ke-inline-block ke-upload-button">' +
+                '<form class="ke-upload-area ke-form nice-validator n-default" method="post" enctype="multipart/form-data" style="width: 266px;margin:50px auto;">' +
+                '<span class="ke-button-common"><input type="button" class="ke-button-common ke-button" value="批量上传图片" style="width:128px;"></span><input type="file" class="ke-upload-file" name="imgFiles" multiple style="width:128px;left:0;right:inherit" tabindex="-1">' +
+                '<span class="ke-button-common" style="margin-left:10px;"><input type="button" class="ke-button-common ke-button ke-select-image" style="width:128px;" value="从图片空间选择"></span>' +
+                '</form>' +
+                '</div></span></div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 450,
+                    height: 260,
+                    title: self.lang(name),
+                    body: html,
+                    noBtn: {
+                        name: self.lang('no'),
+                        click: function (e) {
+                            self.hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div;
+            $("input[name=imgFiles]", div).change(function () {
+                dialog.showLoading();
+                var files = $(this).prop('files');
+                $.each(files, function (i, file) {
+                    self.beforeUpload.call(self, function (data) {
+                        self.exec('insertimage', Fast.api.cdnurl(data.data.url));
+                    }, file);
+                });
+                setTimeout(function () {
+                    self.hideDialog().focus();
+                }, 0);
+            });
+            $(".ke-select-image", div).click(function () {
+                self.loadPlugin('filemanager', function () {
+                    self.plugin.filemanagerDialog({
+                        dirName: 'image',
+                        multiple: true,
+                        clickFn: function (urls) {
+                            $.each(urls, function(i, url){
+                                self.exec('insertimage', url);
+                            });
+                        }
+                    });
+                });
+                self.hideDialog().focus();
+                // parent.Fast.api.open("general/attachment/select?element_id=&multiple=true&mimetype=*", __('Choose'), {
+                //     callback: function (data) {
+                //         var urlArr = data.url.split(/\,/);
+                //         $.each(urlArr, function () {
+                //             var url = Fast.api.cdnurl(this);
+                //             self.exec('insertimage', url);
+                //         });
+                //     }
+                // });
+            });
+        };
+        self.clickToolbar(name, click);
+    });
+
+    return Nkeditor;
+});
diff --git a/public/assets/addons/nkeditor/lang/ar.js b/public/assets/addons/nkeditor/lang/ar.js
new file mode 100644
index 0000000..6eb4b7e
--- /dev/null
+++ b/public/assets/addons/nkeditor/lang/ar.js
@@ -0,0 +1,242 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* Arabic Translation By daif alotaibi (http://daif.net/)
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'عرض المصدر',
+	preview : 'معاينة الصفحة',
+	undo : 'تراجع(Ctrl+Z)',
+	redo : 'إعادة التراجع(Ctrl+Y)',
+	cut : 'قص(Ctrl+X)',
+	copy : 'نسخ(Ctrl+C)',
+	paste : 'لصق(Ctrl+V)',
+	plainpaste : 'لصق كنص عادي',
+	wordpaste : 'لصق من مايكروسفت ورد',
+	selectall : 'تحديد الكل',
+	justifyleft : 'محاذاه لليسار',
+	justifycenter : 'محاذاه للوسط',
+	justifyright : 'محاذاه لليمين',
+	justifyfull : 'محاذاه تلقائية',
+	insertorderedlist : 'قائمة مرقمه',
+	insertunorderedlist : 'قائمة نقطية',
+	indent : 'إزاحه النص',
+	outdent : 'إلغاء الازاحة',
+	subscript : 'أسفل النص',
+	superscript : 'أعلى النص',
+	formatblock : 'Paragraph format',
+	fontname : 'نوع الخط',
+	fontsize : 'حجم الخط',
+	forecolor : 'لون النص',
+	hilitecolor : 'لون خلفية النص',
+	bold : 'عريض(Ctrl+B)',
+	italic : 'مائل(Ctrl+I)',
+	underline : 'خط تحت النص(Ctrl+U)',
+	strikethrough : 'خط على النص',
+	removeformat : 'إزالة التنسيق',
+	image : 'إدراج صورة',
+	multiimage : 'Multi image',
+	flash : 'إدراج فلاش',
+	media : 'إدراج وسائط متعددة',
+	table : 'إدراج جدول',
+	tablecell : 'خلية',
+	hr : 'إدراج خط أفقي',
+	emoticons : 'إدراج وجه ضاحك',
+	link : 'رابط',
+	unlink : 'إزالة الرابط',
+	fullscreen : 'محرر ملئ الشاشة',
+	about : 'حول',
+	print : 'طباعة',
+	filemanager : 'مدير الملفات',
+	code : 'إدراج نص برمجي',
+	map : 'خرائط قووقل',
+	baidumap : 'خرائط قووقل',
+	lineheight : 'إرتفاع السطر',
+	clearhtml : 'مسح كود HTML',
+	pagebreak : 'إدراج فاصل صفحات',
+	quickformat : 'تنسيق سريع',
+	insertfile : 'إدراج ملف',
+	template : 'إدراج قالب',
+	anchor : 'رابط',
+	yes : 'موافق',
+	no : 'إلغاء',
+	close : 'إغلاق',
+	editImage : 'خصائص الصورة',
+	deleteImage : 'حذفالصورة',
+	editFlash : 'خصائص الفلاش',
+	deleteFlash : 'حذف الفلاش',
+	editMedia : 'خصائص الوسائط',
+	deleteMedia : 'حذف الوسائط',
+	editLink : 'خصائص الرابط',
+	deleteLink : 'إزالة الرابط',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'خصائص الجدول',
+	tablecellprop : 'خصائص الخلية',
+	tableinsert : 'إدراج جدول',
+	tabledelete : 'حذف جدول',
+	tablecolinsertleft : 'إدراج عمود لليسار',
+	tablecolinsertright : 'إدراج عمود لليسار',
+	tablerowinsertabove : 'إدراج صف للأعلى',
+	tablerowinsertbelow : 'إدراج صف للأسفل',
+	tablerowmerge : 'دمج للأسفل',
+	tablecolmerge : 'دمج لليمين',
+	tablerowsplit : 'تقسم الصف',
+	tablecolsplit : 'تقسيم العمود',
+	tablecoldelete : 'حذف العمود',
+	tablerowdelete : 'حذف الصف',
+	noColor : 'إفتراضي',
+	pleaseSelectFile : 'Please select file.',
+	invalidImg : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: jpg,gif,bmp,png",
+	invalidMedia : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "العرض يجب أن يكون رقم.",
+	invalidHeight : "الإرتفاع يجب أن يكون رقم.",
+	invalidBorder : "عرض الحد يجب أن يكون رقم.",
+	invalidUrl : "الرجاء إدخال رابط حيح.",
+	invalidRows : 'صفوف غير صحيح.',
+	invalidCols : 'أعمدة غير صحيحة.',
+	invalidPadding : 'The padding must be number.',
+	invalidSpacing : 'The spacing must be number.',
+	invalidJson : 'Invalid JSON string.',
+	uploadSuccess : 'تم رفع الملف بنجاح.',
+	cutError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+X).',
+	copyError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+C).',
+	pasteError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+V).',
+	ajaxLoading : 'Loading ...',
+	uploadLoading : 'Uploading ...',
+	uploadError : 'Upload Error',
+	'plainpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.',
+	'wordpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'الرابط',
+	'link.linkType' : 'الهدف',
+	'link.newWindow' : 'نافذة جديدة',
+	'link.selfWindow' : 'نفس النافذة',
+	'flash.url' : 'الرابط',
+	'flash.width' : 'العرض',
+	'flash.height' : 'الإرتفاع',
+	'flash.upload' : 'رفع',
+	'flash.viewServer' : 'أستعراض',
+	'media.url' : 'الرابط',
+	'media.width' : 'العرض',
+	'media.height' : 'الإرتفاع',
+	'media.autostart' : 'تشغيل تلقائي',
+	'media.upload' : 'رفع',
+	'media.viewServer' : 'أستعراض',
+	'image.remoteImage' : 'إدراج الرابط',
+	'image.localImage' : 'رفع',
+	'image.remoteUrl' : 'الرابط',
+	'image.localUrl' : 'الملف',
+	'image.size' : 'الحجم',
+	'image.width' : 'العرض',
+	'image.height' : 'الإرتفاع',
+	'image.resetSize' : 'إستعادة الأبعاد',
+	'image.align' : 'محاذاة',
+	'image.defaultAlign' : 'الإفتراضي',
+	'image.leftAlign' : 'اليسار',
+	'image.rightAlign' : 'اليمين',
+	'image.imgTitle' : 'العنوان',
+	'image.upload' : 'أستعراض',
+	'image.viewServer' : 'أستعراض',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : 'فارغ',
+	'filemanager.moveup' : 'المجلد الأب',
+	'filemanager.viewType' : 'العرض: ',
+	'filemanager.viewImage' : 'مصغرات',
+	'filemanager.listImage' : 'قائمة',
+	'filemanager.orderType' : 'الترتيب: ',
+	'filemanager.fileName' : 'بالإسم',
+	'filemanager.fileSize' : 'بالحجم',
+	'filemanager.fileType' : 'بالنوع',
+	'insertfile.url' : 'الرابط',
+	'insertfile.title' : 'العنوان',
+	'insertfile.upload' : 'رفع',
+	'insertfile.viewServer' : 'أستعراض',
+	'table.cells' : 'خلايا',
+	'table.rows' : 'صفوف',
+	'table.cols' : 'أعمدة',
+	'table.size' : 'الأبعاد',
+	'table.width' : 'العرض',
+	'table.height' : 'الإرتفاع',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'الخارج',
+	'table.padding' : 'الداخل',
+	'table.spacing' : 'الفراغات',
+	'table.align' : 'محاذاه',
+	'table.textAlign' : 'افقى',
+	'table.verticalAlign' : 'رأسي',
+	'table.alignDefault' : 'إفتراضي',
+	'table.alignLeft' : 'يسار',
+	'table.alignCenter' : 'وسط',
+	'table.alignRight' : 'يمين',
+	'table.alignTop' : 'أعلى',
+	'table.alignMiddle' : 'منتصف',
+	'table.alignBottom' : 'أسفل',
+	'table.alignBaseline' : 'Baseline',
+	'table.border' : 'الحدود',
+	'table.borderWidth' : 'العرض',
+	'table.borderColor' : 'اللون',
+	'table.backgroundColor' : 'الخلفية',
+	'map.address' : 'العنوان: ',
+	'map.search' : 'بحث',
+	'baidumap.address' : 'العنوان: ',
+	'baidumap.search' : 'بحث',
+	'baidumap.insertDynamicMap' : 'Dynamic Map',
+	'anchor.name' : 'إسم الرابط',
+	'formatblock.formatBlock' : {
+		h1 : 'عنوان 1',
+		h2 : 'عنوان 2',
+		h3 : 'عنوان 3',
+		h4 : 'عنوان 4',
+		p : 'عادي'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : 'إرتفاع السطر 1'},
+		{'1.5' : 'إرتفاع السطر 1.5'},
+		{'2' : 'إرتفاع السطر 2'},
+		{'2.5' : 'إرتفاع السطر 2.5'},
+		{'3' : 'إرتفاع السطر 3'}
+	],
+	'template.selectTemplate' : 'قالب',
+	'template.replaceContent' : 'إستبدال المحتوى الحالي',
+	'template.fileList' : {
+		'1.html' : 'صورة ونص',
+		'2.html' : 'جدول',
+		'3.html' : 'قائمة'
+	}
+}, 'ar');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ar';
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/lang/en.js b/public/assets/addons/nkeditor/lang/en.js
new file mode 100644
index 0000000..dbaa616
--- /dev/null
+++ b/public/assets/addons/nkeditor/lang/en.js
@@ -0,0 +1,243 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'Source',
+	preview : 'Preview',
+	undo : 'Undo(Ctrl+Z)',
+	redo : 'Redo(Ctrl+Y)',
+	cut : 'Cut(Ctrl+X)',
+	copy : 'Copy(Ctrl+C)',
+	paste : 'Paste(Ctrl+V)',
+	plainpaste : 'Paste as plain text',
+	wordpaste : 'Paste from Word',
+	selectall : 'Select all',
+	justifyleft : 'Align left',
+	justifycenter : 'Align center',
+	justifyright : 'Align right',
+	justifyfull : 'Align full',
+	insertorderedlist : 'Ordered list',
+	insertunorderedlist : 'Unordered list',
+	indent : 'Increase indent',
+	outdent : 'Decrease indent',
+	subscript : 'Subscript',
+	superscript : 'Superscript',
+	formatblock : 'Paragraph format',
+	fontname : 'Font family',
+	fontsize : 'Font size',
+	forecolor : 'Text color',
+	hilitecolor : 'Highlight color',
+	bold : 'Bold(Ctrl+B)',
+	italic : 'Italic(Ctrl+I)',
+	underline : 'Underline(Ctrl+U)',
+	strikethrough : 'Strikethrough',
+	removeformat : 'Remove format',
+	image : 'Image',
+	multiimage : 'Multi image',
+	flash : 'Flash',
+	media : 'Embeded media',
+	table : 'Table',
+	tablecell : 'Cell',
+	hr : 'Insert horizontal line',
+	emoticons : 'Insert emoticon',
+	link : 'Link',
+	unlink : 'Unlink',
+	fullscreen : 'Toggle fullscreen mode',
+	about : 'About',
+	print : 'Print',
+	filemanager : 'File Manager',
+	code : 'Insert code',
+	map : 'Google Maps',
+	baidumap : 'Baidu Maps',
+	lineheight : 'Line height',
+	clearhtml : 'Clear HTML code',
+	pagebreak : 'Insert Page Break',
+	quickformat : 'Quick Format',
+	insertfile : 'Insert file',
+	template : 'Insert Template',
+	anchor : 'Anchor',
+	yes : 'OK',
+	no : 'Cancel',
+	close : 'Close',
+	editImage : 'Image properties',
+	deleteImage : 'Delete image',
+	editFlash : 'Flash properties',
+	deleteFlash : 'Delete flash',
+	editMedia : 'Media properties',
+	deleteMedia : 'Delete media',
+	editLink : 'Link properties',
+	deleteLink : 'Unlink',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'Table properties',
+	tablecellprop : 'Cell properties',
+	tableinsert : 'Insert table',
+	tabledelete : 'Delete table',
+	tablecolinsertleft : 'Insert column left',
+	tablecolinsertright : 'Insert column right',
+	tablerowinsertabove : 'Insert row above',
+	tablerowinsertbelow : 'Insert row below',
+	tablerowmerge : 'Merge down',
+	tablecolmerge : 'Merge right',
+	tablerowsplit : 'Split row',
+	tablecolsplit : 'Split column',
+	tablecoldelete : 'Delete column',
+	tablerowdelete : 'Delete row',
+	noColor : 'Default',
+	pleaseSelectFile : 'Please select file.',
+	invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png",
+	invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "The width must be number.",
+	invalidHeight : "The height must be number.",
+	invalidBorder : "The border must be number.",
+	invalidUrl : "Please type valid URL.",
+	invalidRows : 'Invalid rows.',
+	invalidCols : 'Invalid columns.',
+	invalidPadding : 'The padding must be number.',
+	invalidSpacing : 'The spacing must be number.',
+	invalidJson : 'Invalid JSON string.',
+	uploadSuccess : 'Upload success.',
+	cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.',
+	copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.',
+	pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.',
+	ajaxLoading : 'Loading ...',
+	uploadLoading : 'Uploading ...',
+	uploadError : 'Upload Error',
+	'plainpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
+	'wordpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'URL',
+	'link.linkType' : 'Target',
+	'link.newWindow' : 'New window',
+	'link.selfWindow' : 'Same window',
+	'flash.url' : 'URL',
+	'flash.width' : 'Width',
+	'flash.height' : 'Height',
+	'flash.upload' : 'Upload',
+	'flash.viewServer' : 'Browse',
+	'media.url' : 'URL',
+	'media.width' : 'Width',
+	'media.height' : 'Height',
+	'media.autostart' : 'Auto start',
+	'media.upload' : 'Upload',
+	'media.viewServer' : 'Browse',
+	'image.remoteImage' : 'Insert URL',
+	'image.localImage' : 'Upload',
+	'image.remoteUrl' : 'URL',
+	'image.localUrl' : 'File',
+	'image.size' : 'Size',
+	'image.width' : 'Width',
+	'image.height' : 'Height',
+	'image.resetSize' : 'Reset dimensions',
+	'image.align' : 'Align',
+	'image.defaultAlign' : 'Default',
+	'image.leftAlign' : 'Left',
+	'image.rightAlign' : 'Right',
+	'image.imgTitle' : 'Title',
+	'image.upload' : 'Browse',
+	'image.viewServer' : 'Browse',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : 'Blank',
+	'filemanager.moveup' : 'Parent folder',
+	'filemanager.viewType' : 'Display: ',
+	'filemanager.viewImage' : 'Thumbnails',
+	'filemanager.listImage' : 'List',
+	'filemanager.orderType' : 'Sorting: ',
+	'filemanager.fileName' : 'By name',
+	'filemanager.fileSize' : 'By size',
+	'filemanager.fileType' : 'By type',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'Title',
+	'insertfile.upload' : 'Upload',
+	'insertfile.viewServer' : 'Browse',
+	'table.cells' : 'Cells',
+	'table.rows' : 'Rows',
+	'table.cols' : 'Columns',
+	'table.size' : 'Dimensions',
+	'table.width' : 'Width',
+	'table.height' : 'Height',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'Space',
+	'table.padding' : 'Padding',
+	'table.spacing' : 'Spacing',
+	'table.align' : 'Align',
+	'table.textAlign' : 'Horizontal',
+	'table.verticalAlign' : 'Vertical',
+	'table.alignDefault' : 'Default',
+	'table.alignLeft' : 'Left',
+	'table.alignCenter' : 'Center',
+	'table.alignRight' : 'Right',
+	'table.alignTop' : 'Top',
+	'table.alignMiddle' : 'Middle',
+	'table.alignBottom' : 'Bottom',
+	'table.alignBaseline' : 'Baseline',
+	'table.border' : 'Border',
+	'table.borderWidth' : 'Width',
+	'table.borderColor' : 'Color',
+	'table.backgroundColor' : 'Background',
+	'map.address' : 'Address: ',
+	'map.search' : 'Search',
+	'baidumap.address' : 'Address: ',
+	'baidumap.search' : 'Search',
+	'baidumap.insertDynamicMap' : 'Dynamic Map',
+	'anchor.name' : 'Anchor name',
+	'formatblock.formatBlock' : {
+		h1 : 'Heading 1',
+		h2 : 'Heading 2',
+		h3 : 'Heading 3',
+		h4 : 'Heading 4',
+		p : 'Normal'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : 'Line height 1'},
+		{'1.5' : 'Line height 1.5'},
+		{'2' : 'Line height 2'},
+		{'2.5' : 'Line height 2.5'},
+		{'3' : 'Line height 3'}
+	],
+	'template.selectTemplate' : 'Template',
+	'template.replaceContent' : 'Replace current content',
+	'template.fileList' : {
+		'1.html' : 'Image and Text',
+		'2.html' : 'Table',
+		'3.html' : 'List'
+	}
+}, 'en');
+
+//自动加载代码美化的js插件
+// KindEditor.loadScript(KindEditor.options.pluginsPath+"code/prettify.js");
+// KindEditor.each(KindEditor.options.items, function(i, name) {
+// 	if (name == 'code') {
+// 		KindEditor.options.items[i] = 'map';
+// 	}
+// });
+KindEditor.options.langType = 'en';
diff --git a/public/assets/addons/nkeditor/lang/ja-JP.js b/public/assets/addons/nkeditor/lang/ja-JP.js
new file mode 100644
index 0000000..7806d08
--- /dev/null
+++ b/public/assets/addons/nkeditor/lang/ja-JP.js
@@ -0,0 +1,234 @@
+/*******************************************************************************
+* @author 您的名字 お名前
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'HTMLコード',
+	preview : 'プレビュー',
+	undo : '戻る(Ctrl+Z)',
+	redo : '進む(Ctrl+Y)',
+	cut : 'カット(Ctrl+X)',
+	copy : 'コピー(Ctrl+C)',
+	paste : '貼り付け(Ctrl+V)',
+	plainpaste : 'フォーマットされていないテキストとして貼り付ける',
+	wordpaste : '「word」ドからペースト',
+	selectall : 'すべて選択(Ctrl+A)',
+	justifyleft : '左揃え',
+	justifycenter : '中央揃え',
+	justifyright : '右揃え',
+	justifyfull : '両端揃え',
+	insertorderedlist : '番号',
+	insertunorderedlist : '箇条書き',
+	indent : 'インデントを増やす',
+	outdent : 'インデントを減らす',
+	subscript : '下付き',
+	superscript : '上付き',
+	formatblock : '段落',
+	fontname : 'フォント',
+	fontsize : 'フォントサイズ',
+	forecolor : 'フォントカラー',
+	hilitecolor : 'テキストの背景',
+	bold : '太字(Ctrl+B)',
+	italic : '斜体(Ctrl+I)',
+	underline : '下線(Ctrl+U)',
+	strikethrough : '取り消し線',
+	removeformat : 'フォーマットを削除',
+	image : '画像',
+	multiimage : '一括画像アップロード',
+	flash : 'Flash',
+	media : 'ビデオとオーディオ',
+	table : 'テーブル',
+	tablecell : 'セル',
+	hr : '水平線を挿入する',
+	emoticons : '絵文字を挿入する',
+	link : 'ハイパーリンク',
+	unlink : 'ハイパーリンクをキャンセル',
+	fullscreen : 'フルスクリーン表示',
+	about : 'について',
+	print : 'プリント(Ctrl+P)',
+	filemanager : 'ファイルスペース',
+	code : 'プログラムコードを挿入',
+	map : 'Googleマップ',
+	baidumap : 'Baiduマップ',
+	lineheight : '行間隔',
+	clearhtml : 'HTMLコードをクリア',
+	pagebreak : 'ページ区切りの挿入',
+	quickformat : 'ワンクリックレイアウト',
+	insertfile : 'ファイルの挿入',
+	template : 'テンプレートの挿入',
+	anchor : 'アンカー',
+	yes : 'はい',
+	no : 'いいえ',
+	close : '閉じる',
+	editImage : 'イメージプロパティ',
+	deleteImage : 'イメージを削除',
+	editFlash : 'Flashプロパティ',
+	deleteFlash : 'Flashを削除',
+	editMedia : 'ビデオとオーディオのプロパティ',
+	deleteMedia : 'ビデオとオーディオを削除',
+	editLink : 'ハイパーリンク属性',
+	deleteLink : 'ハイパーリンクを削除',
+	editAnchor : 'アンカー属性',
+	deleteAnchor : 'アンカーを削除',
+	tableprop : 'テーブル属性',
+	tablecellprop : 'セル属性',
+	tableinsert : 'テーブルを挿入',
+	tabledelete : 'テーブルを削除',
+	tablecolinsertleft : '左に列を挿入する',
+	tablecolinsertright : '右に列を挿入する',
+	tablerowinsertabove : '上に行を挿入する',
+	tablerowinsertbelow : '下に行を挿入する',
+	tablerowmerge : '下にセルをマージする',
+	tablecolmerge : '右にセルをマージする',
+	tablerowsplit : '行を分割',
+	tablecolsplit : '列を分割',
+	tablecoldelete : '列を削除',
+	tablerowdelete : '行を削除',
+	noColor : '色なし',
+	pleaseSelectFile : 'ファイルを選択してください。',
+	invalidImg : "有効なURLアドレスを入力してください。\ n jpg、gif、bmp、png形式のみが許可されています。",
+	invalidMedia : "有効なURLアドレスを入力してください。swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb形式のみが許可されています。",
+	invalidWidth : "幅は数字でなければなりません。",
+	invalidHeight : "高さは数字でなければなりません。",
+	invalidBorder : "ボーダーは数字でなければなりません。",
+	invalidUrl : "有効なURLアドレスを入力してください。",
+	invalidRows : '行数は必須項目で、0以上の数字を入力してください。',
+	invalidCols : '列数は必須項目で、0以上の数字を入力してください。',
+	invalidPadding : 'マージンは数字でなければなりません。',
+	invalidSpacing : 'スペースは数字でなければなりません。',
+	invalidJson : 'サーバーエラー。',
+	uploadSuccess : 'アップロード成功。',
+	cutError : 'ブラウザのセキュリティ設定によってカット操作を使用できないので、ショートカットキー(Ctrl + X)を使用してください。',
+	copyError : 'ブラウザのセキュリティ設定によってコピー操作をできないので、ショートカットキー(Ctrl + C)を使用してください。',
+	pasteError : 'ブラウザのセキュリティ設定によって貼り付け操作をできないので、ショートカットキー(Ctrl + V)を使用してください。',
+	ajaxLoading : '読み込み中、お待ちください...',
+	uploadLoading : 'アップロード、しばらくお待ちください...',
+	uploadError : 'アップロードエラー',
+	'plainpaste.comment' : 'ショートカットキー(Ctrl + V)でコンテンツを下のボックスに貼り付けてください。',
+	'wordpaste.comment' : 'ショートカットキー(Ctrl + V)でコンテンツを下のボックスに貼り付けてください。',
+	'code.pleaseInput' : 'プログラムコードを入力してください。 ',
+	'link.url' : 'URL',
+	'link.linkType' : 'タイプを開く',
+	'link.newWindow' : '新しいウィンドウ',
+	'link.selfWindow' : '現在のウィンドウ',
+	'flash.url' : 'URL',
+	'flash.width' : '幅',
+	'flash.height' : '高さ',
+	'flash.upload' : 'アップロード',
+	'flash.viewServer' : 'ファイルスペース',
+	'media.url' : 'URL',
+	'media.width' : '幅',
+	'media.height' : '高さ',
+	'media.autostart' : '自動再生',
+	'media.upload' : 'アップロード',
+	'media.viewServer' : 'ファイルスペース',
+	'image.remoteImage' : 'ネットワークイメージ',
+	'image.localImage' : 'ローカルアップロード',
+	'image.remoteUrl' : 'イメージアドレス  ',
+	'image.localUrl' : 'アップロードファイル',
+	'image.size' : 'イメージサイズ',
+	'image.width' : '幅',
+	'image.height' : '高さ',
+	'image.resetSize' : 'リセットサイズ',
+	'image.align' : '配置',
+	'image.defaultAlign' : 'デフォルト',
+	'image.leftAlign' : '左揃え',
+	'image.rightAlign' : '右揃え',
+	'image.imgTitle' : '画像の説明',
+	'image.upload' : 'ブラウズ...',
+	'image.viewServer' : 'イメージスペース',
+	'multiimage.uploadDesc' : 'ユーザーが<%= uploadLimit%>画像を同時にアップロードできますが、画像の容量は<%= sizeLimit%>を超えることができません',
+	'multiimage.startUpload' : 'アップロード',
+	'multiimage.clearAll' : 'すべてクリア',
+	'multiimage.insertAll' : 'すべて挿入',
+	'multiimage.queueLimitExceeded' : 'ファイルの数が上限を超えています。',
+	'multiimage.fileExceedsSizeLimit' : 'ファイルサイズが制限を超えています。',
+	'multiimage.zeroByteFile' : '空のファイルをアップロードできません。   ',
+	'multiimage.invalidFiletype' : 'ファイル形式は正しくありません。',
+	'multiimage.unknownError' : 'エラー、アップロードできません。',
+	'multiimage.pending' : 'アップロード待ち',
+	'multiimage.uploadError' : 'アップロード失敗',
+	'filemanager.emptyFolder' : '空のフォルダ',
+	'filemanager.moveup' : '前のフォルダに移動',
+	'filemanager.viewType' : '表示モード:',
+	'filemanager.viewImage' : 'サムネイル',
+	'filemanager.listImage' : '詳細',
+	'filemanager.orderType' : '並べ替え:',
+	'filemanager.fileName' : 'ネーム',
+	'filemanager.fileSize' : 'サイズ',
+	'filemanager.fileType' : 'タイプ',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'ファイルの説明',
+	'insertfile.upload' : 'アップロード',
+	'insertfile.viewServer' : 'ファイルスペース',
+	'table.cells' : 'セル番号',
+	'table.rows' : '行数',
+	'table.cols' : '列数',
+	'table.size' : 'サイズ',
+	'table.width' : '幅',
+	'table.height' : '高さ',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'テーブルスペース',
+	'table.padding' : 'パッディング',
+	'table.spacing' : 'スペース',
+	'table.align' : '配置',
+	'table.textAlign' : '水平配置',
+	'table.verticalAlign' : '垂直配置',
+	'table.alignDefault' : 'デフォルト',
+	'table.alignLeft' : '左揃え',
+	'table.alignCenter' : '中央揃え',
+	'table.alignRight' : '右揃え',
+	'table.alignTop' : 'トップ',
+	'table.alignMiddle' : 'ミドル',
+	'table.alignBottom' : 'ボトム',
+	'table.alignBaseline' : 'ベースライン',
+	'table.border' : 'ボーダー',
+	'table.borderWidth' : 'ボーダー',
+	'table.borderColor' : 'カラー',
+	'table.backgroundColor' : '背景色',
+	'map.address' : 'アドレス: ',
+	'map.search' : '検索',
+	'baidumap.address' : 'アドレス: ',
+	'baidumap.search' : '検索',
+	'baidumap.insertDynamicMap' : 'ダイナミックマップの挿入',
+	'anchor.name' : 'アンカー名',
+		
+	'formatblock.formatBlock' : {
+		h1 : '見出し1',
+		h2 : '見出し2',
+		h3 : '見出し3',
+		h4 : '見出し4',
+		p : '正 文'
+	},
+	'fontname.fontName' : {
+		'SimSun' : '明朝体',
+		'NSimSun' : '新宋体',
+		'FangSong_GB2312' : '仿宋_GB2312',
+		'KaiTi_GB2312' : '楷書体_GB2312',
+		'SimHei' : 'ゴチック体',
+		'Microsoft YaHei' : 'Msyh',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '行間1倍'},
+		{'1.5' : '行間1.5倍'},
+		{'2' : '行間2倍'},
+		{'2.5' : '行間2.5倍'},
+		{'3' : '行間3倍'}
+	],
+	'template.selectTemplate' : 'オプションテンプレート',
+	'template.replaceContent' : '現在のコンテンツを置き換える',
+	'template.fileList' : {
+		'1.html' : 'イメージとテキスト',
+		'2.html' : '表',
+		'3.html' : '段落番号'
+	}
+}, 'ja-JP');
+
+KindEditor.options.langType = 'ja-JP';
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/lang/ko.js b/public/assets/addons/nkeditor/lang/ko.js
new file mode 100644
index 0000000..bf5eb22
--- /dev/null
+++ b/public/assets/addons/nkeditor/lang/ko.js
@@ -0,0 +1,246 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Composite <ukjinplant@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '소스',
+	preview : '미리보기',
+	undo : '작업취소(Ctrl+Z)',
+	redo : '작업재개(Ctrl+Y)',
+	cut : '잘라내기(Ctrl+X)',
+	copy : '복사(Ctrl+C)',
+	paste : '붙여넣기(Ctrl+V)',
+	plainpaste : '일반 텍스트로 붙여넣기',
+	wordpaste : '워드 문서로 붙여넣기',
+	selectall : '전체 선택',
+	justifyleft : '왼쪽 정렬',
+	justifycenter : '가운데 정렬',
+	justifyright : '오른쪽 정렬',
+	justifyfull : '양쪽 정렬',
+	insertorderedlist : '순서 목록',
+	insertunorderedlist : '비순서 목록',
+	indent : '들여쓰기',
+	outdent : '내어쓰기',
+	subscript : '아랫첨자',
+	superscript : '윗첨자',
+	formatblock : '문단 형식',
+	fontname : '글꼴',
+	fontsize : '글자 크기',
+	forecolor : '글자색',
+	hilitecolor : '강조색',
+	bold : '굵게(Ctrl+B)',
+	italic : '이텔릭(Ctrl+I)',
+	underline : '빝줄(Ctrl+U)',
+	strikethrough : '취소선',
+	removeformat : '형식 제거',
+	image : '이미지 추가',
+	multiimage : '여러 이미지 추가',
+	flash : '플래시 추가',
+	media : '미디어 추가',
+	table : '표',
+	tablecell : '열',
+	hr : '구분선 추가',
+	emoticons : '이모티콘 추가',
+	link : '링크',
+	unlink : '링크 제거',
+	fullscreen : '전체 화면 모드',
+	about : '이 에디터는...',
+	print : '인쇄',
+	filemanager : '파일 관리자',
+	code : '코드 추가',
+	map : '구글 맵 추가',
+	baidumap : '바이두 맵 추가',
+	lineheight : '행 간격',
+	clearhtml : 'HTML 코드 정리',
+	pagebreak : '페이지 구분 추가',
+	quickformat : '빠른 형식',
+	insertfile : '파일 추가',
+	template : '템플릿 추가',
+	anchor : '책갈피',
+	yes : '확인',
+	no : '취소',
+	close : '닫기',
+	editImage : '이미지 속성',
+	deleteImage : '이미지 삭제',
+	editFlash : '플래시 속성',
+	deleteFlash : '플래시 삭제',
+	editMedia : '미디어 속성',
+	deleteMedia : '미디어 삭제',
+	editLink : '링크 속성',
+	deleteLink : '링크 삭제',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : '표 속성',
+	tablecellprop : '열 속성',
+	tableinsert : '표 추가',
+	tabledelete : '표 삭제',
+	tablecolinsertleft : '왼쪽으로 열 추가',
+	tablecolinsertright : '오른쪽으로 열 추가',
+	tablerowinsertabove : '위쪽으로 열 추가',
+	tablerowinsertbelow : '아래쪽으로 열 추가',
+	tablerowmerge : '아래로 병합',
+	tablecolmerge : '오른쪽으로 병합',
+	tablerowsplit : '행 나누기',
+	tablecolsplit : '열 나누기',
+	tablecoldelete : '열 삭제',
+	tablerowdelete : '행 삭제',
+	noColor : '기본색',
+	pleaseSelectFile : '파일 선택',
+	invalidImg : "올바른 주소를 입력하세요.\njpg,gif,bmp,png 형식이 가능합니다.",
+	invalidMedia : "올바른 주소를 입력하세요.\nswf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb 형식이 가능합니다.",
+	invalidWidth : "넓이 값은 숫자여야 합니다.",
+	invalidHeight : "높이 값은 숫자여야 합니다.",
+	invalidBorder : "굵기 값은 숫자여야 합니다.",
+	invalidUrl : "올바른 주소를 입력하세요.",
+	invalidRows : '올바른 행이 아닙니다.',
+	invalidCols : '올바른 열이 아닙니다.',
+	invalidPadding : '안쪽 여백 값은 숫자여야 합니다.',
+	invalidSpacing : '간격 길이 값은 숫자여야 합니다.',
+	invalidJson : '올바른 JSON 형식이 아닙니다.',
+	uploadSuccess : '업로드가 완료되었습니다.',
+	cutError : '브라우저가 잘라내기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	copyError : '브라우저가 복사 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	pasteError : '브라우저가 붙여넣기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	ajaxLoading : '불러오는 중 ...',
+	uploadLoading : '업로드 중 ...',
+	uploadError : '업로드 오류',
+	'plainpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 텍스트를 붙여넣으세요.',
+	'wordpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 워드 텍스트를 붙여넣으세요.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : '주소',
+	'link.linkType' : '창',
+	'link.newWindow' : '새 창',
+	'link.selfWindow' : '현재 창',
+	'flash.url' : '주소',
+	'flash.width' : '넓이',
+	'flash.height' : '높이',
+	'flash.upload' : '업로드',
+	'flash.viewServer' : '찾아보기',
+	'media.url' : '주소',
+	'media.width' : '넓이',
+	'media.height' : '높이',
+	'media.autostart' : '자동 시작',
+	'media.upload' : '업로드',
+	'media.viewServer' : '찾아보기',
+	'image.remoteImage' : '외부 이미지',
+	'image.localImage' : '내부 이미지',
+	'image.remoteUrl' : '주소',
+	'image.localUrl' : '파일',
+	'image.size' : '크기',
+	'image.width' : '넓이',
+	'image.height' : '높이',
+	'image.resetSize' : '기본 크기로',
+	'image.align' : '정렬',
+	'image.defaultAlign' : '기본',
+	'image.leftAlign' : '왼쪽',
+	'image.rightAlign' : '오른쪽',
+	'image.imgTitle' : '제목',
+	'image.upload' : '찾아보기',
+	'image.viewServer' : '찾아보기',
+	'multiimage.uploadDesc' : '최대 이미지 개수: <%=uploadLimit%>개, 개당 이미지 크기: <%=sizeLimit%>',
+	'multiimage.startUpload' : '업로드 시작',
+	'multiimage.clearAll' : '모두 삭제',
+	'multiimage.insertAll' : '모두 삽입',
+	'multiimage.queueLimitExceeded' : '업로드 개수가 초과되었습니다.',
+	'multiimage.fileExceedsSizeLimit' : '업로드 크기가 초과되었습니다.',
+	'multiimage.zeroByteFile' : '파일 크기가 없습니다.',
+	'multiimage.invalidFiletype' : '올바른 이미지가 아닙니다.',
+	'multiimage.unknownError' : '알 수 없는 업로드 오류가 발생하였습니다.',
+	'multiimage.pending' : '처리 중 ...',
+	'multiimage.uploadError' : '업로드 오류',
+	'filemanager.emptyFolder' : '빈 폴더',
+	'filemanager.moveup' : '위로',
+	'filemanager.viewType' : '보기 방식: ',
+	'filemanager.viewImage' : '미리 보기',
+	'filemanager.listImage' : '목록',
+	'filemanager.orderType' : '정렬 방식: ',
+	'filemanager.fileName' : '이름별',
+	'filemanager.fileSize' : '크기별',
+	'filemanager.fileType' : '종류별',
+	'insertfile.url' : '주소',
+	'insertfile.title' : '제목',
+	'insertfile.upload' : '업로드',
+	'insertfile.viewServer' : '찾아보기',
+	'table.cells' : '열',
+	'table.rows' : '행',
+	'table.cols' : '열',
+	'table.size' : '표 크기',
+	'table.width' : '넓이',
+	'table.height' : '높이',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '간격',
+	'table.padding' : '안쪽여백',
+	'table.spacing' : '간격',
+	'table.align' : '정렬',
+	'table.textAlign' : '수직',
+	'table.verticalAlign' : '수평',
+	'table.alignDefault' : '기본',
+	'table.alignLeft' : '왼쪽',
+	'table.alignCenter' : '가운데',
+	'table.alignRight' : '오른쪽',
+	'table.alignTop' : '위쪽',
+	'table.alignMiddle' : '중간',
+	'table.alignBottom' : '아래쪽',
+	'table.alignBaseline' : '글자기준',
+	'table.border' : '테두리',
+	'table.borderWidth' : '크기',
+	'table.borderColor' : '색상',
+	'table.backgroundColor' : '배경',
+	'map.address' : '주소: ',
+	'map.search' : '검색',
+	'baidumap.address' : '주소: ',
+	'baidumap.search' : '검색',
+	'baidumap.insertDynamicMap' : '동적 지도',
+	'anchor.name' : '책갈피명',
+	'formatblock.formatBlock' : {
+		h1 : '제목 1',
+		h2 : '제목 2',
+		h3 : '제목 3',
+		h4 : '제목 4',
+		p : '본문'
+	},
+	'fontname.fontName' : {
+		'Gulim' : '굴림',
+		'Dotum' : '돋움',
+		'Batang' : '바탕',
+		'Gungsuh' : '궁서',
+		'Malgun Gothic' : '맑은 고딕',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '행간 1'},
+		{'1.5' : '행간 1.5'},
+		{'2' : '행간 2'},
+		{'2.5' : '행간 2.5'},
+		{'3' : '행간 3'}
+	],
+	'template.selectTemplate' : '템플릿',
+	'template.replaceContent' : '내용 바꾸기',
+	'template.fileList' : {
+		'1.html' : '이미지와 텍스트',
+		'2.html' : '표',
+		'3.html' : '목록'
+	}
+}, 'ko');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ko';
diff --git a/public/assets/addons/nkeditor/lang/ru.js b/public/assets/addons/nkeditor/lang/ru.js
new file mode 100644
index 0000000..dda10bf
--- /dev/null
+++ b/public/assets/addons/nkeditor/lang/ru.js
@@ -0,0 +1,242 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* Translated to Russian by Valery Votintsev (http://codersclub.org/)
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'Source',
+	preview : 'Preview',
+	undo : 'Отмена(Ctrl+Z)',
+	redo : 'Повтор(Ctrl+Y)',
+	cut : 'Вырезать(Ctrl+X)',
+	copy : 'Копировать(Ctrl+C)',
+	paste : 'Вставить(Ctrl+V)',
+	plainpaste : 'Вставить как простой текст',
+	wordpaste : 'Вставить из Word',
+	selectall : 'Выбрать все',
+	justifyleft : 'Выравнивание влево',
+	justifycenter : 'Выравнивание по центру',
+	justifyright : 'Выравнивание вправо',
+	justifyfull : 'Выравнивание по обеим сторонам',
+	insertorderedlist : 'Нумерованый список',
+	insertunorderedlist : 'Ненумерованый список',
+	indent : 'Добавить отступ',
+	outdent : 'Убрать отступ',
+	subscript : 'Надстрочный',
+	superscript : 'Подстрочный',
+	formatblock : 'Формат параграфа',
+	fontname : 'Шрифт',
+	fontsize : 'Размер',
+	forecolor : 'Цвет текста',
+	hilitecolor : 'Цвет фона',
+	bold : 'Жирный(Ctrl+B)',
+	italic : 'Наклонный(Ctrl+I)',
+	underline : 'Подчёркнутый(Ctrl+U)',
+	strikethrough : 'Перечёркнутый',
+	removeformat : 'Удалить формат',
+	image : 'Изображение',
+	multiimage : 'Мульти-загрузка',
+	flash : 'Flash',
+	media : 'Встроенные данные',
+	table : 'Таблица',
+	tablecell : 'Ячейка',
+	hr : 'Горизонтальный разделитель',
+	emoticons : 'Смайл',
+	link : 'Ссылка',
+	unlink : 'Убрать ссылку',
+	fullscreen : 'На весь экран',
+	about : 'О программе',
+	print : 'Печать',
+	filemanager : 'Файлы',
+	code : 'Код',
+	map : 'Карта Google',
+	baidumap : 'Карта Baidu',
+	lineheight : 'Межстрочный интервал',
+	clearhtml : 'Очистить HTML код',
+	pagebreak : 'Разрыв страницы',
+	quickformat : 'Быстрый формат',
+	insertfile : 'Вставить файл',
+	template : 'Вставить шаблон',
+	anchor : 'Якорь',
+	yes : 'OK',
+	no : 'Отмена',
+	close : 'Закрыть',
+	editImage : 'Свойства изображения',
+	deleteImage : 'Удалить изображение',
+	editFlash : 'Свойства Flash',
+	deleteFlash : 'Удалить Flash',
+	editMedia : 'Свойства Media',
+	deleteMedia : 'Удалить Media',
+	editLink : 'Свойства ссылки',
+	deleteLink : 'Удалить ссылку',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'Свойства таблицы',
+	tablecellprop : 'Свойства ячейки',
+	tableinsert : 'Вставить таблицу',
+	tabledelete : 'Удалить таблицу',
+	tablecolinsertleft : 'Добавить столбец слева',
+	tablecolinsertright : 'Добавить столбец справа',
+	tablerowinsertabove : 'Добавить строку выше',
+	tablerowinsertbelow : 'Добавить строку ниже',
+	tablerowmerge : 'Объединить вниз',
+	tablecolmerge : 'Объединить вправо',
+	tablerowsplit : 'Разделить строку',
+	tablecolsplit : 'Разделить столбец',
+	tablecoldelete : 'Удалить столбец',
+	tablerowdelete : 'Удалить строку',
+	noColor : 'По умолчанию',
+	pleaseSelectFile : 'Выберите файл.',
+	invalidImg : "Укажите корректный URL изображения.\nРазрешённые форматы: jpg,gif,bmp,png",
+	invalidMedia : "Укажите корректный тип медиа-объекта.\nРазрешённые типы: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "Ширина должна быть числом.",
+	invalidHeight : "Высота должна быть числом.",
+	invalidBorder : "Ширина рамки должна быть числом.",
+	invalidUrl : "Укажите корректный URL.",
+	invalidRows : 'Неверные строки.',
+	invalidCols : 'Неверные столбцы.',
+	invalidPadding : 'padding должен быть числом.',
+	invalidSpacing : 'spacing должен быть числом.',
+	invalidJson : 'Неверная JSON строка.',
+	uploadSuccess : 'Загрузка завершена.',
+	cutError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+X).',
+	copyError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+C).',
+	pasteError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	ajaxLoading : 'Загрузка ...',
+	uploadLoading : 'Загрузка ...',
+	uploadError : 'Сбой загрузки',
+	'plainpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	'wordpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	'code.pleaseInput' : 'Введите код.',
+	'link.url' : 'URL',
+	'link.linkType' : 'Открывать ссылку',
+	'link.newWindow' : 'в новом окне',
+	'link.selfWindow' : 'в том же окне',
+	'flash.url' : 'URL',
+	'flash.width' : 'Ширина',
+	'flash.height' : 'Высота',
+	'flash.upload' : 'Загрузить',
+	'flash.viewServer' : 'Выбрать',
+	'media.url' : 'URL',
+	'media.width' : 'Ширина',
+	'media.height' : 'Высота',
+	'media.autostart' : 'Автостарт',
+	'media.upload' : 'Загрузить',
+	'media.viewServer' : 'Выбрать',
+	'image.remoteImage' : 'Вставить URL изображения',
+	'image.localImage' : 'Загрузить',
+	'image.remoteUrl' : 'URL',
+	'image.localUrl' : 'Файл',
+	'image.size' : 'Размер',
+	'image.width' : 'Ширина',
+	'image.height' : 'Высота',
+	'image.resetSize' : 'Сбросить размеры',
+	'image.align' : 'Выравнивание',
+	'image.defaultAlign' : 'По умолчанию',
+	'image.leftAlign' : 'Влево',
+	'image.rightAlign' : 'Вправо',
+	'image.imgTitle' : 'Название',
+	'image.upload' : 'Загрузить',
+	'image.viewServer' : 'Выбрать',
+	'multiimage.uploadDesc' : 'Максимальное кол-во изображений: <%=uploadLimit%>, Максимальный размер одного изображения: <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Начать загрузку',
+	'multiimage.clearAll' : 'Очистить все',
+	'multiimage.insertAll' : 'Вставить все',
+	'multiimage.queueLimitExceeded' : 'Превышен лимит очереди.',
+	'multiimage.fileExceedsSizeLimit' : 'Превышен максимальный размер файла.',
+	'multiimage.zeroByteFile' : 'Файл нулевой длины.',
+	'multiimage.invalidFiletype' : 'Недопустимый тип файла.',
+	'multiimage.unknownError' : 'Непредвиденная ошибка загрузки.',
+	'multiimage.pending' : 'Ожидает ...',
+	'multiimage.uploadError' : 'Ошибка загрузки',
+	'filemanager.emptyFolder' : 'Папка пуста',
+	'filemanager.moveup' : 'Наверх',
+	'filemanager.viewType' : 'Тип показа: ',
+	'filemanager.viewImage' : 'Превьюшки',
+	'filemanager.listImage' : 'Список',
+	'filemanager.orderType' : 'Сортировка: ',
+	'filemanager.fileName' : 'По имени',
+	'filemanager.fileSize' : 'По размеру',
+	'filemanager.fileType' : 'По типу',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'Название',
+	'insertfile.upload' : 'Загрузить',
+	'insertfile.viewServer' : 'Выбрать',
+	'table.cells' : 'Ячейки',
+	'table.rows' : 'Строки',
+	'table.cols' : 'Столбцы',
+	'table.size' : 'Размеры',
+	'table.width' : 'Ширина',
+	'table.height' : 'Высота',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'Space',
+	'table.padding' : 'Padding',
+	'table.spacing' : 'Spacing',
+	'table.align' : 'Выравнивание',
+	'table.textAlign' : 'По горизонтали',
+	'table.verticalAlign' : 'По вертикали',
+	'table.alignDefault' : 'По умолчанию',
+	'table.alignLeft' : 'Влево',
+	'table.alignCenter' : 'По центру',
+	'table.alignRight' : 'Вправо',
+	'table.alignTop' : 'Вверх',
+	'table.alignMiddle' : 'Посередине',
+	'table.alignBottom' : 'Вниз',
+	'table.alignBaseline' : 'По базовой линии',
+	'table.border' : 'Рамка',
+	'table.borderWidth' : 'Ширина',
+	'table.borderColor' : 'Цвет',
+	'table.backgroundColor' : 'Цвет фона',
+	'map.address' : 'Адрес: ',
+	'map.search' : 'Поиск',
+	'baidumap.address' : 'Адрес: ',
+	'baidumap.search' : 'Поиск',
+	'baidumap.insertDynamicMap' : 'Динамическая карта',
+	'anchor.name' : 'Имя якоря',
+	'formatblock.formatBlock' : {
+		h1 : 'Заголовок 1',
+		h2 : 'Заголовок 2',
+		h3 : 'Заголовок 3',
+		h4 : 'Заголовок 4',
+		p : 'Обычный текст'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '1'},
+		{'1.5' : '1.5'},
+		{'2' : '2'},
+		{'2.5' : '2.5'},
+		{'3' : '3'}
+	],
+	'template.selectTemplate' : 'Шаблон',
+	'template.replaceContent' : 'Заменить текущий шаблон',
+	'template.fileList' : {
+		'1.html' : 'Текст и изображения',
+		'2.html' : 'Таблица',
+		'3.html' : 'Список'
+	}
+}, 'en');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ru';
diff --git a/public/assets/addons/nkeditor/lang/zh-CN.js b/public/assets/addons/nkeditor/lang/zh-CN.js
new file mode 100644
index 0000000..405e2f4
--- /dev/null
+++ b/public/assets/addons/nkeditor/lang/zh-CN.js
@@ -0,0 +1,267 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'HTML代码',
+	preview : '预览',
+	undo : '后退(Ctrl+Z)',
+	redo : '前进(Ctrl+Y)',
+	cut : '剪切(Ctrl+X)',
+	copy : '复制(Ctrl+C)',
+	paste : '粘贴(Ctrl+V)',
+	plainpaste : '粘贴为无格式文本',
+	wordpaste : '从Word粘贴',
+	selectall : '全选(Ctrl+A)',
+	justifyleft : '左对齐',
+	justifycenter : '居中',
+	justifyright : '右对齐',
+	justifyfull : '两端对齐',
+	insertorderedlist : '编号',
+	insertunorderedlist : '项目符号',
+	indent : '增加缩进',
+	outdent : '减少缩进',
+	subscript : '下标',
+	superscript : '上标',
+	formatblock : '段落',
+	fontname : '字体',
+	fontsize : '文字大小',
+	forecolor : '文字颜色',
+	hilitecolor : '文字背景',
+	bold : '粗体(Ctrl+B)',
+	italic : '斜体(Ctrl+I)',
+	underline : '下划线(Ctrl+U)',
+	strikethrough : '删除线',
+	removeformat : '删除格式',
+	image : '图片',
+	multiimage : '批量图片上传',
+	graft : '涂鸦',
+	flash : 'Flash',
+	media : '视音频',
+	table : '表格',
+	tablecell : '单元格',
+	hr : '插入横线',
+	emoticons : '插入表情',
+	link : '超级链接',
+	unlink : '取消超级链接',
+	fullscreen : '全屏显示',
+	about : '关于',
+	print : '打印(Ctrl+P)',
+	filemanager : '文件空间',
+	code : '插入程序代码',
+	quote : '插入引用',
+	map : 'Google地图',
+	baidumap : '百度地图',
+	lineheight : '行距',
+	clearhtml : '清理HTML代码',
+	pagebreak : '插入分页符',
+	quickformat : '一键排版',
+	insertfile : '插入文件',
+	template : '插入模板',
+	anchor : '锚点',
+	yes : '确定',
+	no : '取消',
+	close : '关闭',
+	editImage : '图片属性',
+	deleteImage : '删除图片',
+	editFlash : 'Flash属性',
+	deleteFlash : '删除Flash',
+	editMedia : '视音频属性',
+	deleteMedia : '删除视音频',
+	editLink : '超级链接属性',
+	deleteLink : '取消超级链接',
+	editAnchor : '锚点属性',
+	deleteAnchor : '删除锚点',
+	tableprop : '表格属性',
+	tablecellprop : '单元格属性',
+	tableinsert : '插入表格',
+	tabledelete : '删除表格',
+	tablecolinsertleft : '左侧插入列',
+	tablecolinsertright : '右侧插入列',
+	tablerowinsertabove : '上方插入行',
+	tablerowinsertbelow : '下方插入行',
+	tablerowmerge : '向下合并单元格',
+	tablecolmerge : '向右合并单元格',
+	tablerowsplit : '拆分行',
+	tablecolsplit : '拆分列',
+	tablecoldelete : '删除列',
+	tablerowdelete : '删除行',
+	noColor : '无颜色',
+	pleaseSelectFile : '请选择文件。',
+	invalidImg : "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。",
+	invalidMedia : "请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
+	invalidWidth : "宽度必须为数字。",
+	invalidHeight : "高度必须为数字。",
+	invalidBorder : "边框必须为数字。",
+	invalidUrl : "请输入有效的URL地址。",
+	invalidRows : '行数为必选项,只允许输入大于0的数字。',
+	invalidCols : '列数为必选项,只允许输入大于0的数字。',
+	invalidPadding : '边距必须为数字。',
+	invalidSpacing : '间距必须为数字。',
+	invalidJson : '服务器发生故障。',
+	uploadSuccess : '上传成功。',
+	cutError : '您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。',
+	copyError : '您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。',
+	pasteError : '您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。',
+	ajaxLoading : '加载中,请稍候 ...',
+	uploadLoading : '上传中,请稍候 ...',
+	uploadError : '上传错误',
+
+	'plainpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+	'wordpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+	'code.pleaseInput' : '请输入程序代码。',
+	'link.url' : 'URL',
+	'link.linkType' : '打开类型',
+	'link.newWindow' : '新窗口',
+	'link.selfWindow' : '当前窗口',
+	'flash.url' : 'URL',
+	'flash.width' : '宽度',
+	'flash.height' : '高度',
+	'flash.upload' : '上传',
+	'flash.viewServer' : '文件空间',
+	'media.url' : 'URL',
+	'media.width' : '宽度',
+	'media.height' : '高度',
+	'media.autostart' : '自动播放',
+	'media.upload' : '上传',
+	'media.viewServer' : '文件空间',
+	'image.remoteImage' : '网络图片',
+	'image.localImage' : '本地上传',
+	'image.remoteUrl' : '图片地址',
+	'image.localUrl' : '上传文件',
+	'image.size' : '图片大小',
+	'image.width' : '宽',
+	'image.height' : '高',
+	'image.resetSize' : '重置大小',
+	'image.align' : '对齐方式',
+	'image.defaultAlign' : '默认方式',
+	'image.leftAlign' : '左对齐',
+	'image.rightAlign' : '右对齐',
+	'image.imgTitle' : '图片说明',
+	'image.upload' : '浏览...',
+	'image.viewServer' : '图片空间',
+
+	'multiimage.title' : '多图上传',
+	'multiimage.uploadDesc' : '共选择了 <%=numSelect%> 张图片,共 <%=totalSize%>, 还可以添加 <%=numLeft%> 张图片.',
+	'multiimage.startUpload' : '开始上传',
+	'multiimage.noListUrl' : '无法获取图片,请先配置 fileManagerJson.',
+	'multiimage.noSearchUrl' : '无法进行图片搜索,请先配置 imageSearchJson.',
+	'multiimage.noDataText' : '(⊙o⊙)亲,没有多数据了。',
+	'multiimage.closeText' : '关闭对话框',
+	'multiimage.confirmBtnText' : '确定',
+	'multiimage.cancelBtnText' : '取消',
+	'multiimage.loadMoreData' : '往下拉动滚动条可以加载更多数据.',
+	'multiimage.depJQueryError' : '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+	'multiimage.localUpload' : '本地上传',
+	'multiimage.fileServer' : '文件服务器',
+	'multiimage.imgSearch' : '图片搜索',
+	'multiimage.selectFile' : '点击选择图片',
+	'multiimage.continueAdd' : '继续添加',
+	'multiimage.searchBtn' : '搜索一下',
+	'multiimage.searchPlaceholder' : '请输入搜索关键词',
+	'multiimage.searchClear' : '清空搜索',
+	'multiimage.noFileAdded' : '请至少添加一个文件!',
+	'multiimage.uploading' : '正在上传',
+	'multiimage.fileNotUpload' : '您还有文件没有上传!',
+	'multiimage.uploadLimit' : '您本次最多上传 <%=uploadLimit%> 个文件.',
+	'multiimage.sizeLimit' : '文件大小不能超过 <%=sizeLimit%> KB.',
+	'multiimage.invalidExt' : '非法的文件后缀 <%=invalidExt%>.',
+	'multiimage.remove' : '删除',
+	'multiimage.rotateRight' : '向右旋转',
+	'multiimage.rotateLeft' : '向左旋转',
+	'multiimage.uploadFail' : '发生异常,上传失败!',
+	'multiimage.noFileSelected' : '请至少选择一个文件或一张图片.',
+
+	'filemanager.noDataText' : '(⊙o⊙)亲,没有多数据了。',
+	'filemanager.title' : '文件服务器',
+	'filemanager.noListUrl' : '无法获取图片,请先配置 fileManagerJson.',
+	'filemanager.closeText' : '关闭对话框',
+	'filemanager.confirmBtnText' : '确定',
+	'filemanager.cancelBtnText' : '取消',
+	'filemanager.loadMoreData' : '往下拉动滚动条可以加载更多数据.',
+	'filemanager.depJQueryError' : '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+	'filemanager.fileType' : '类型',
+
+	'graft.btnText' : '保存并插入涂鸦',
+	'graft.uploadSuccess' : '涂鸦上传成功',
+	'graft.uploadFaild' : '涂鸦上传失败',
+	'graft.empty' : '您没有在画布上绘制任何图像',
+
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '文件说明',
+	'insertfile.upload' : '上传',
+	'insertfile.viewServer' : '文件空间',
+	'table.cells' : '单元格数',
+	'table.rows' : '行数',
+	'table.cols' : '列数',
+	'table.size' : '大小',
+	'table.width' : '宽度',
+	'table.height' : '高度',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '边距间距',
+	'table.padding' : '边距',
+	'table.spacing' : '间距',
+	'table.align' : '对齐方式',
+	'table.textAlign' : '水平对齐',
+	'table.verticalAlign' : '垂直对齐',
+	'table.alignDefault' : '默认',
+	'table.alignLeft' : '左对齐',
+	'table.alignCenter' : '居中',
+	'table.alignRight' : '右对齐',
+	'table.alignTop' : '顶部',
+	'table.alignMiddle' : '中部',
+	'table.alignBottom' : '底部',
+	'table.alignBaseline' : '基线',
+	'table.border' : '边框',
+	'table.borderWidth' : '宽度',
+	'table.borderColor' : '颜色',
+	'table.backgroundColor' : '背景颜色',
+	'map.address' : '地址: ',
+	'map.search' : '搜索',
+	'baidumap.address' : '地址: ',
+	'baidumap.search' : '搜索',
+	'baidumap.insertDynamicMap' : '插入动态地图',
+	'anchor.name' : '锚点名称',
+	'formatblock.formatBlock' : {
+		h1 : '标题 1',
+		h2 : '标题 2',
+		h3 : '标题 3',
+		h4 : '标题 4',
+		p : '正 文'
+	},
+	'fontname.fontName' : {
+		'SimSun' : '宋体',
+		'NSimSun' : '新宋体',
+		'FangSong' : '仿宋',
+		'KaiTi' : '楷体',
+		'SimHei' : '黑体',
+		'Microsoft YaHei' : '微软雅黑',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '单倍行距'},
+		{'1.5' : '1.5倍行距'},
+		{'2' : '2倍行距'},
+		{'2.5' : '2.5倍行距'},
+		{'3' : '3倍行距'}
+	],
+	'template.selectTemplate' : '可选模板',
+	'template.replaceContent' : '替换当前内容',
+	'template.fileList' : {
+		'1.html' : '图片和文字',
+		'2.html' : '表格',
+		'3.html' : '项目编号'
+	}
+}, 'zh-CN');
+KindEditor.options.langType = 'zh-CN';
diff --git a/public/assets/addons/nkeditor/lang/zh-TW.js b/public/assets/addons/nkeditor/lang/zh-TW.js
new file mode 100644
index 0000000..4946898
--- /dev/null
+++ b/public/assets/addons/nkeditor/lang/zh-TW.js
@@ -0,0 +1,243 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '原始碼',
+	preview : '預覽',
+	undo : '復原(Ctrl+Z)',
+	redo : '重複(Ctrl+Y)',
+	cut : '剪下(Ctrl+X)',
+	copy : '複製(Ctrl+C)',
+	paste : '貼上(Ctrl+V)',
+	plainpaste : '貼為純文字格式',
+	wordpaste : '自Word貼上',
+	selectall : '全選(Ctrl+A)',
+	justifyleft : '靠左對齊',
+	justifycenter : '置中',
+	justifyright : '靠右對齊',
+	justifyfull : '左右對齊',
+	insertorderedlist : '編號清單',
+	insertunorderedlist : '項目清單',
+	indent : '增加縮排',
+	outdent : '減少縮排',
+	subscript : '下標',
+	superscript : '上標',
+	formatblock : '標題',
+	fontname : '字體',
+	fontsize : '文字大小',
+	forecolor : '文字顏色',
+	hilitecolor : '背景顏色',
+	bold : '粗體(Ctrl+B)',
+	italic : '斜體(Ctrl+I)',
+	underline : '底線(Ctrl+U)',
+	strikethrough : '刪除線',
+	removeformat : '清除格式',
+	image : '影像',
+	multiimage : '批量影像上傳',
+	flash : 'Flash',
+	media : '多媒體',
+	table : '表格',
+	tablecell : '儲存格',
+	hr : '插入水平線',
+	emoticons : '插入表情',
+	link : '超連結',
+	unlink : '移除超連結',
+	fullscreen : '最大化',
+	about : '關於',
+	print : '列印(Ctrl+P)',
+	filemanager : '瀏覽伺服器',
+	code : '插入程式代碼',
+	map : 'Google地圖',
+	baidumap : 'Baidu地圖',
+	lineheight : '行距',
+	clearhtml : '清理HTML代碼',
+	pagebreak : '插入分頁符號',
+	quickformat : '快速排版',
+	insertfile : '插入文件',
+	template : '插入樣板',
+	anchor : '錨點',
+	yes : '確定',
+	no : '取消',
+	close : '關閉',
+	editImage : '影像屬性',
+	deleteImage : '刪除影像',
+	editFlash : 'Flash屬性',
+	deleteFlash : '删除Flash',
+	editMedia : '多媒體屬性',
+	deleteMedia : '删除多媒體',
+	editLink : '超連結屬性',
+	deleteLink : '移除超連結',
+	editAnchor : '锚点属性',
+	deleteAnchor : '删除锚点',
+	tableprop : '表格屬性',
+	tablecellprop : '儲存格屬性',
+	tableinsert : '插入表格',
+	tabledelete : '刪除表格',
+	tablecolinsertleft : '向左插入列',
+	tablecolinsertright : '向右插入列',
+	tablerowinsertabove : '向上插入欄',
+	tablerowinsertbelow : '下方插入欄',
+	tablerowmerge : '向下合併單元格',
+	tablecolmerge : '向右合併單元格',
+	tablerowsplit : '分割欄',
+	tablecolsplit : '分割列',
+	tablecoldelete : '删除列',
+	tablerowdelete : '删除欄',
+	noColor : '自動',
+	pleaseSelectFile : '請選擇文件。',
+	invalidImg : "請輸入有效的URL。\n只允許jpg,gif,bmp,png格式。",
+	invalidMedia : "請輸入有效的URL。\n只允許swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
+	invalidWidth : "寬度必須是數字。",
+	invalidHeight : "高度必須是數字。",
+	invalidBorder : "邊框必須是數字。",
+	invalidUrl : "請輸入有效的URL。",
+	invalidRows : '欄數是必須輸入項目,只允許輸入大於0的數字。',
+	invalidCols : '列數是必須輸入項目,只允許輸入大於0的數字。',
+	invalidPadding : '內距必須是數字。',
+	invalidSpacing : '間距必須是數字。',
+	invalidJson : '伺服器發生故障。',
+	uploadSuccess : '上傳成功。',
+	cutError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+X)完成。',
+	copyError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+C)完成。',
+	pasteError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+V)完成。',
+	ajaxLoading : '加載中,請稍候 ...',
+	uploadLoading : '上傳中,請稍候 ...',
+	uploadError : '上傳錯誤',
+	'plainpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。',
+	'wordpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'URL',
+	'link.linkType' : '打開類型',
+	'link.newWindow' : '新窗口',
+	'link.selfWindow' : '本頁窗口',
+	'flash.url' : 'URL',
+	'flash.width' : '寬度',
+	'flash.height' : '高度',
+	'flash.upload' : '上傳',
+	'flash.viewServer' : '瀏覽',
+	'media.url' : 'URL',
+	'media.width' : '寬度',
+	'media.height' : '高度',
+	'media.autostart' : '自動播放',
+	'media.upload' : '上傳',
+	'media.viewServer' : '瀏覽',
+	'image.remoteImage' : '網絡影像',
+	'image.localImage' : '上傳影像',
+	'image.remoteUrl' : '影像URL',
+	'image.localUrl' : '影像URL',
+	'image.size' : '影像大小',
+	'image.width' : '寬度',
+	'image.height' : '高度',
+	'image.resetSize' : '原始大小',
+	'image.align' : '對齊方式',
+	'image.defaultAlign' : '未設定',
+	'image.leftAlign' : '向左對齊',
+	'image.rightAlign' : '向右對齊',
+	'image.imgTitle' : '影像說明',
+	'image.upload' : '瀏覽...',
+	'image.viewServer' : '瀏覽...',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : '空文件夾',
+	'filemanager.moveup' : '至上一級文件夾',
+	'filemanager.viewType' : '顯示方式:',
+	'filemanager.viewImage' : '縮略圖',
+	'filemanager.listImage' : '詳細信息',
+	'filemanager.orderType' : '排序方式:',
+	'filemanager.fileName' : '名稱',
+	'filemanager.fileSize' : '大小',
+	'filemanager.fileType' : '類型',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '文件說明',
+	'insertfile.upload' : '上傳',
+	'insertfile.viewServer' : '瀏覽',
+	'table.cells' : '儲存格數',
+	'table.rows' : '欄數',
+	'table.cols' : '列數',
+	'table.size' : '表格大小',
+	'table.width' : '寬度',
+	'table.height' : '高度',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '內距間距',
+	'table.padding' : '內距',
+	'table.spacing' : '間距',
+	'table.align' : '對齊方式',
+	'table.textAlign' : '水平對齊',
+	'table.verticalAlign' : '垂直對齊',
+	'table.alignDefault' : '未設定',
+	'table.alignLeft' : '向左對齊',
+	'table.alignCenter' : '置中',
+	'table.alignRight' : '向右對齊',
+	'table.alignTop' : '靠上',
+	'table.alignMiddle' : '置中',
+	'table.alignBottom' : '靠下',
+	'table.alignBaseline' : '基線',
+	'table.border' : '表格邊框',
+	'table.borderWidth' : '邊框',
+	'table.borderColor' : '顏色',
+	'table.backgroundColor' : '背景顏色',
+	'map.address' : '住所: ',
+	'map.search' : '尋找',
+	'baidumap.address' : '住所: ',
+	'baidumap.search' : '尋找',
+	'baidumap.insertDynamicMap' : '插入動態地圖',
+	'anchor.name' : '錨點名稱',
+	'formatblock.formatBlock' : {
+		h1 : '標題 1',
+		h2 : '標題 2',
+		h3 : '標題 3',
+		h4 : '標題 4',
+		p : '一般'
+	},
+	'fontname.fontName' : {
+		'MingLiU' : '細明體',
+		'PMingLiU' : '新細明體',
+		'DFKai-SB' : '標楷體',
+		'SimSun' : '宋體',
+		'NSimSun' : '新宋體',
+		'FangSong' : '仿宋體',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '单倍行距'},
+		{'1.5' : '1.5倍行距'},
+		{'2' : '2倍行距'},
+		{'2.5' : '2.5倍行距'},
+		{'3' : '3倍行距'}
+	],
+	'template.selectTemplate' : '可選樣板',
+	'template.replaceContent' : '取代當前內容',
+	'template.fileList' : {
+		'1.html' : '影像和文字',
+		'2.html' : '表格',
+		'3.html' : '项目清單'
+	}
+}, 'zh-TW');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'zh-TW';
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/nkeditor.js b/public/assets/addons/nkeditor/nkeditor.js
new file mode 100644
index 0000000..911fc6f
--- /dev/null
+++ b/public/assets/addons/nkeditor/nkeditor.js
@@ -0,0 +1,9532 @@
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2018 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @website http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ * @version 5.0.3 (2018-10-25)
+ *******************************************************************************/
+(function (window, undefined) {
+    if (window.KindEditor) {
+        return;
+    }
+
+
+    if (!window.console) {
+        window.console = {};
+    }
+    if (!console.log) {
+        console.log = function () {
+        };
+    }
+    var _VERSION = '5.0.3 (2018-10-25)',
+        _ua = navigator.userAgent.toLowerCase(),
+        _IE = _ua.indexOf('msie') > -1 && _ua.indexOf('opera') == -1,
+        _NEWIE = _ua.indexOf('msie') == -1 && _ua.indexOf('trident') > -1,
+        _GECKO = _ua.indexOf('gecko') > -1 && _ua.indexOf('khtml') == -1,
+        _WEBKIT = _ua.indexOf('applewebkit') > -1,
+        _OPERA = _ua.indexOf('opera') > -1,
+        _MOBILE = _ua.indexOf('mobile') > -1,
+        _IOS = /ipad|iphone|ipod/.test(_ua),
+        _QUIRKS = document.compatMode != 'CSS1Compat',
+        _IERANGE = !window.getSelection,
+        _matches = /(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(_ua),
+        _V = _matches ? _matches[1] : '0',
+        _TIME = new Date().getTime();
+
+    function _isArray(val) {
+        if (!val) {
+            return false;
+        }
+        return Object.prototype.toString.call(val) === '[object Array]';
+    }
+
+    function _isFunction(val) {
+        if (!val) {
+            return false;
+        }
+        return Object.prototype.toString.call(val) === '[object Function]';
+    }
+
+    function _inArray(val, arr) {
+        for (var i = 0, len = arr.length; i < len; i++) {
+            if (val === arr[i]) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    function _each(obj, fn) {
+        if (_isArray(obj)) {
+            for (var i = 0, len = obj.length; i < len; i++) {
+                if (fn.call(obj[i], i, obj[i]) === false) {
+                    break;
+                }
+            }
+        } else {
+            for (var key in obj) {
+                if (obj.hasOwnProperty(key)) {
+                    if (fn.call(obj[key], key, obj[key]) === false) {
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    function _trim(str) {
+        return str.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, '');
+    }
+
+    function _inString(val, str, delimiter) {
+        delimiter = delimiter === undefined ? ',' : delimiter;
+        return (delimiter + str + delimiter).indexOf(delimiter + val + delimiter) >= 0;
+    }
+
+    function _addUnit(val, unit) {
+        unit = unit || 'px';
+        return val && /^-?\d+(?:\.\d+)?$/.test(val) ? val + unit : val;
+    }
+
+    function _removeUnit(val) {
+        var match;
+        return val && (match = /(\d+)/.exec(val)) ? parseInt(match[1], 10) : 0;
+    }
+
+    function _escape(val) {
+        return val.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
+    }
+
+    function _unescape(val) {
+        return val.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
+    }
+
+    function _toCamel(str) {
+        var arr = str.split('-');
+        str = '';
+        _each(arr, function (key, val) {
+            str += (key > 0) ? val.charAt(0).toUpperCase() + val.substr(1) : val;
+        });
+        return str;
+    }
+
+    function _toHex(val) {
+        function hex(d) {
+            var s = parseInt(d, 10).toString(16).toUpperCase();
+            return s.length > 1 ? s : '0' + s;
+        }
+
+        return val.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ig,
+            function ($0, $1, $2, $3) {
+                return '#' + hex($1) + hex($2) + hex($3);
+            }
+        );
+    }
+
+    function _toMap(val, delimiter) {
+        delimiter = delimiter === undefined ? ',' : delimiter;
+        var map = {}, arr = _isArray(val) ? val : val.split(delimiter), match;
+        _each(arr, function (key, val) {
+            if ((match = /^(\d+)\.\.(\d+)$/.exec(val))) {
+                for (var i = parseInt(match[1], 10); i <= parseInt(match[2], 10); i++) {
+                    map[i.toString()] = true;
+                }
+            } else {
+                map[val] = true;
+            }
+        });
+        return map;
+    }
+
+    function _toArray(obj, offset) {
+        return Array.prototype.slice.call(obj, offset || 0);
+    }
+
+    function _undef(val, defaultVal) {
+        return val === undefined ? defaultVal : val;
+    }
+
+    function _invalidUrl(url) {
+        return !url || /[<>"]/.test(url);
+    }
+
+    function _addParam(url, param) {
+        return url.indexOf('?') >= 0 ? url + '&' + param : url + '?' + param;
+    }
+
+    function _extend(child, parent, proto) {
+        if (!proto) {
+            proto = parent;
+            parent = null;
+        }
+        var childProto;
+        if (parent) {
+            var fn = function () {
+            };
+            fn.prototype = parent.prototype;
+            childProto = new fn();
+            _each(proto, function (key, val) {
+                childProto[key] = val;
+            });
+        } else {
+            childProto = proto;
+        }
+        childProto.constructor = child;
+        child.prototype = childProto;
+        child.parent = parent ? parent.prototype : null;
+    }
+
+
+    function _json(text) {
+        var match;
+        if ((match = /\{[\s\S]*\}|\[[\s\S]*\]/.exec(text))) {
+            text = match[0];
+        }
+        var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+        cx.lastIndex = 0;
+        if (cx.test(text)) {
+            text = text.replace(cx, function (a) {
+                return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+            });
+        }
+        if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+            return eval('(' + text + ')');
+        }
+        throw 'JSON parse error';
+    }
+
+
+    function _merge(distObj, obj) {
+        for (var name in distObj) {
+            obj[name] = distObj[name];
+        }
+        return obj;
+    }
+
+    var _round = Math.round;
+    var K = {
+        DEBUG: false,
+        VERSION: _VERSION,
+        IE: _IE,
+        GECKO: _GECKO,
+        WEBKIT: _WEBKIT,
+        OPERA: _OPERA,
+        V: _V,
+        TIME: _TIME,
+        each: _each,
+        isArray: _isArray,
+        isFunction: _isFunction,
+        inArray: _inArray,
+        inString: _inString,
+        trim: _trim,
+        addUnit: _addUnit,
+        removeUnit: _removeUnit,
+        escape: _escape,
+        unescape: _unescape,
+        toCamel: _toCamel,
+        toHex: _toHex,
+        toMap: _toMap,
+        toArray: _toArray,
+        undef: _undef,
+        invalidUrl: _invalidUrl,
+        addParam: _addParam,
+        extend: _extend,
+        merge: _merge,
+        json: _json
+    };
+    var _INLINE_TAG_MAP = _toMap('a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'),
+        _BLOCK_TAG_MAP = _toMap('address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul'),
+        _SINGLE_TAG_MAP = _toMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed'),
+        _STYLE_TAG_MAP = _toMap('b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u'),
+        _CONTROL_TAG_MAP = _toMap('img,table,input,textarea,button'),
+        _PRE_TAG_MAP = _toMap('pre,style,script'),
+        _NOSPLIT_TAG_MAP = _toMap('html,head,body,td,tr,table,ol,ul,li'),
+        _AUTOCLOSE_TAG_MAP = _toMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'),
+        _FILL_ATTR_MAP = _toMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'),
+        _VALUE_TAG_MAP = _toMap('input,button,textarea,select');
+
+
+    function _getBasePath() {
+        var els = document.getElementsByTagName('script'), src;
+        for (var i = 0, len = els.length; i < len; i++) {
+            src = els[i].src || '';
+            if (/NKeditor[\w\-\.]*\.js/i.test(src)) {
+                return src.substring(0, src.lastIndexOf('/') + 1);
+            }
+        }
+        return '';
+    }
+
+    K.basePath = _getBasePath();
+    K.options = {
+        designMode: true,
+        fullscreenMode: false,
+        filterMode: true,
+        wellFormatMode: true,
+        loadStyleMode: true,
+        basePath: K.basePath,
+        themesPath: K.basePath + 'themes/',
+        langPath: K.basePath + 'lang/',
+        pluginsPath: K.basePath + 'plugins/',
+        themeType: 'primary',
+        langType: 'zh-CN',
+        urlType: '',
+        newlineTag: 'p',
+        resizeType: 2,
+        syncType: 'form',
+        pasteType: 2,
+        dialogAlignType: 'page',
+        useContextmenu: true,
+        fullscreenShortcut: false,
+        bodyClass: 'ke-content',
+        indentChar: '\t',
+        cssPath: [],
+        jsPath: [],
+        showHelpGrid: false,
+        cssData: '',
+        minWidth: 650,
+        minHeight: 300,
+        minChangeSize: 50,
+        zIndex: 811213,
+        items: [
+            'source', 'undo', 'redo', 'preview', 'print', 'template', 'code', 'quote', 'cut', 'copy', 'paste',
+            'plainpaste', 'wordpaste', 'justifyleft', 'justifycenter', 'justifyright',
+            'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
+            'superscript', 'clearhtml', 'quickformat', 'selectall',
+            'formatblock', 'fontname', 'fontsize', 'forecolor', 'hilitecolor', 'bold',
+            'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', 'image', 'multiimage', 'graft',
+            'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
+            'anchor', 'link', 'unlink', 'about', 'fullscreen'
+        ],
+        noDisableItems: ['source', 'fullscreen'],
+        colorTable: [
+            ['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
+            ['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
+            ['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
+            ['#FFFFFF', '#DDDDDD', '#999999', '#666666', '#333333', '#000000']
+        ],
+        fontSizeTable: ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px'],
+        htmlTags: {
+            font: ['id', 'class', 'color', 'size', 'face', '.background-color'],
+            span: [
+                'id', 'class', '.color', '.background-color', '.font-size', '.font-family', '.background',
+                '.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.line-height'
+            ],
+            div: [
+                'id', 'class', 'align', '.border', '.margin', '.padding', '.text-align', '.color',
+                '.background-color', '.font-size', '.font-family', '.font-weight', '.background',
+                '.font-style', '.text-decoration', '.vertical-align', '.margin-left'
+            ],
+            table: [
+                'id', 'class', 'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', 'bordercolor',
+                '.padding', '.margin', '.border', 'bgcolor', '.text-align', '.color', '.background-color',
+                '.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.background',
+                '.width', '.height', '.border-collapse'
+            ],
+            'td,th': [
+                'id', 'class', 'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor',
+                '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight',
+                '.font-style', '.text-decoration', '.vertical-align', '.background', '.border'
+            ],
+            a: ['id', 'class', 'href', 'target', 'name'],
+            embed: ['id', 'class', 'src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess', 'wmode', 'controls'],
+            img: ['id', 'class', 'src', 'width', 'height', 'border', 'alt', 'title', 'align', '.width', '.height', '.border'],
+            'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6': [
+                'id', 'class', 'align', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.background',
+                '.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.text-indent', '.margin-left'
+            ],
+            pre: ['id', 'class'],
+            hr: ['id', 'class', '.page-break-after'],
+            'br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del': ['id', 'class'],
+            iframe: ['id', 'class', 'src', 'frameborder', 'width', 'height', '.width', '.height']
+        },
+        layout: '<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>',
+        afterBlur: function () {
+            this.sync();
+        },
+        errorMsgHandler: function (message, type) {
+            console.log(message);
+            console.log(type);
+            alert(message);
+        },
+        dialogOffset: 0,
+        allowUploadGraft: true,
+        resLoadCache: {},
+        tableBorderColor: '#cccccc',
+    };
+
+
+    var _useCapture = false;
+
+
+    var _INPUT_KEY_MAP = _toMap('8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222');
+
+    var _CURSORMOVE_KEY_MAP = _toMap('33..40');
+
+    var _CHANGE_KEY_MAP = {};
+    _each(_INPUT_KEY_MAP, function (key, val) {
+        _CHANGE_KEY_MAP[key] = val;
+    });
+    _each(_CURSORMOVE_KEY_MAP, function (key, val) {
+        _CHANGE_KEY_MAP[key] = val;
+    });
+
+
+    function _bindEvent(el, type, fn) {
+        if (el.addEventListener) {
+            el.addEventListener(type, fn, _useCapture);
+        } else if (el.attachEvent) {
+            el.attachEvent('on' + type, fn);
+        }
+    }
+
+    function _unbindEvent(el, type, fn) {
+        if (el.removeEventListener) {
+            el.removeEventListener(type, fn, _useCapture);
+        } else if (el.detachEvent) {
+            el.detachEvent('on' + type, fn);
+        }
+    }
+
+    var _EVENT_PROPS = ('altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,' +
+        'data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,' +
+        'pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which').split(',');
+
+
+    function KEvent(el, event) {
+        this.init(el, event);
+    }
+
+    _extend(KEvent, {
+        init: function (el, event) {
+            var self = this, doc = el.ownerDocument || el.document || el;
+            self.event = event;
+            _each(_EVENT_PROPS, function (key, val) {
+                self[val] = event[val];
+            });
+            if (!self.target) {
+                self.target = self.srcElement || doc;
+            }
+            if (self.target.nodeType === 3) {
+                self.target = self.target.parentNode;
+            }
+            if (!self.relatedTarget && self.fromElement) {
+                self.relatedTarget = self.fromElement === self.target ? self.toElement : self.fromElement;
+            }
+            if (self.pageX == null && self.clientX != null) {
+                var d = doc.documentElement, body = doc.body;
+                self.pageX = self.clientX + (d && d.scrollLeft || body && body.scrollLeft || 0) - (d && d.clientLeft || body && body.clientLeft || 0);
+                self.pageY = self.clientY + (d && d.scrollTop || body && body.scrollTop || 0) - (d && d.clientTop || body && body.clientTop || 0);
+            }
+            if (!self.which && ((self.charCode || self.charCode === 0) ? self.charCode : self.keyCode)) {
+                self.which = self.charCode || self.keyCode;
+            }
+            if (!self.metaKey && self.ctrlKey) {
+                self.metaKey = self.ctrlKey;
+            }
+            if (!self.which && self.button !== undefined) {
+                self.which = (self.button & 1 ? 1 : (self.button & 2 ? 3 : (self.button & 4 ? 2 : 0)));
+            }
+            switch (self.which) {
+                case 186 :
+                    self.which = 59;
+                    break;
+                case 187 :
+                case 107 :
+                case 43 :
+                    self.which = 61;
+                    break;
+                case 189 :
+                case 45 :
+                    self.which = 109;
+                    break;
+                case 42 :
+                    self.which = 106;
+                    break;
+                case 47 :
+                    self.which = 111;
+                    break;
+                case 78 :
+                    self.which = 110;
+                    break;
+            }
+            if (self.which >= 96 && self.which <= 105) {
+                self.which -= 48;
+            }
+        },
+        preventDefault: function () {
+            var ev = this.event;
+            if (ev.preventDefault) {
+                ev.preventDefault();
+            } else {
+                ev.returnValue = false;
+            }
+        },
+        stopPropagation: function () {
+            var ev = this.event;
+            if (ev.stopPropagation) {
+                ev.stopPropagation();
+            } else {
+                ev.cancelBubble = true;
+            }
+        },
+        stop: function () {
+            this.preventDefault();
+            this.stopPropagation();
+        }
+    });
+    var _eventExpendo = 'kindeditor_' + _TIME, _eventId = 0, _eventData = {};
+
+    function _getId(el) {
+        return el[_eventExpendo] || null;
+    }
+
+    function _setId(el) {
+        el[_eventExpendo] = ++_eventId;
+        return _eventId;
+    }
+
+    function _removeId(el) {
+        try {
+            delete el[_eventExpendo];
+        } catch (e) {
+            if (el.removeAttribute) {
+                el.removeAttribute(_eventExpendo);
+            }
+        }
+    }
+
+    function _bind(el, type, fn) {
+        if (type.indexOf(',') >= 0) {
+            _each(type.split(','), function () {
+                _bind(el, this, fn);
+            });
+            return;
+        }
+        var id = _getId(el);
+        if (!id) {
+            id = _setId(el);
+        }
+        if (_eventData[id] === undefined) {
+            _eventData[id] = {};
+        }
+        var events = _eventData[id][type];
+        if (events && events.length > 0) {
+            _unbindEvent(el, type, events[0]);
+        } else {
+            _eventData[id][type] = [];
+            _eventData[id].el = el;
+        }
+        events = _eventData[id][type];
+        if (events.length === 0) {
+            events[0] = function (e) {
+                var kevent = e ? new KEvent(el, e) : undefined;
+                _each(events, function (i, event) {
+                    if (i > 0 && event) {
+                        event.call(el, kevent);
+                    }
+                });
+            };
+        }
+        if (_inArray(fn, events) < 0) {
+            events.push(fn);
+        }
+        _bindEvent(el, type, events[0]);
+    }
+
+    function _unbind(el, type, fn) {
+        if (type && type.indexOf(',') >= 0) {
+            _each(type.split(','), function () {
+                _unbind(el, this, fn);
+            });
+            return;
+        }
+        var id = _getId(el);
+        if (!id) {
+            return;
+        }
+        if (type === undefined) {
+            if (id in _eventData) {
+                _each(_eventData[id], function (key, events) {
+                    if (key != 'el' && events.length > 0) {
+                        _unbindEvent(el, key, events[0]);
+                    }
+                });
+                delete _eventData[id];
+                _removeId(el);
+            }
+            return;
+        }
+        if (!_eventData[id]) {
+            return;
+        }
+        var events = _eventData[id][type];
+        if (events && events.length > 0) {
+            if (fn === undefined) {
+                _unbindEvent(el, type, events[0]);
+                delete _eventData[id][type];
+            } else {
+                _each(events, function (i, event) {
+                    if (i > 0 && event === fn) {
+                        events.splice(i, 1);
+                    }
+                });
+                if (events.length == 1) {
+                    _unbindEvent(el, type, events[0]);
+                    delete _eventData[id][type];
+                }
+            }
+            var count = 0;
+            _each(_eventData[id], function () {
+                count++;
+            });
+            if (count < 2) {
+                delete _eventData[id];
+                _removeId(el);
+            }
+        }
+    }
+
+    function _fire(el, type) {
+        if (type.indexOf(',') >= 0) {
+            _each(type.split(','), function () {
+                _fire(el, this);
+            });
+            return;
+        }
+        var id = _getId(el);
+        if (!id) {
+            return;
+        }
+        var events = _eventData[id][type];
+        if (_eventData[id] && events && events.length > 0) {
+            events[0]();
+        }
+    }
+
+    function _ctrl(el, key, fn) {
+        var self = this;
+        key = /^\d{2,}$/.test(key) ? key : key.toUpperCase().charCodeAt(0);
+        _bind(el, 'keydown', function (e) {
+            if (e.ctrlKey && e.which == key && !e.shiftKey && !e.altKey) {
+                fn.call(el);
+                e.stop();
+            }
+        });
+    }
+
+    var _readyFinished = false;
+
+    function _ready(fn) {
+        if (_readyFinished) {
+            fn(KindEditor);
+            return;
+        }
+        var loaded = false;
+
+        function readyFunc() {
+            if (!loaded) {
+                loaded = true;
+                fn(KindEditor);
+                _readyFinished = true;
+            }
+        }
+
+        function ieReadyFunc() {
+            if (!loaded) {
+                try {
+                    document.documentElement.doScroll('left');
+                } catch (e) {
+                    setTimeout(ieReadyFunc, 100);
+                    return;
+                }
+                readyFunc();
+            }
+        }
+
+        function ieReadyStateFunc() {
+            if (document.readyState === 'complete') {
+                readyFunc();
+            }
+        }
+
+        if (document.addEventListener) {
+            _bind(document, 'DOMContentLoaded', readyFunc);
+        } else if (document.attachEvent) {
+            _bind(document, 'readystatechange', ieReadyStateFunc);
+            var toplevel = false;
+            try {
+                toplevel = window.frameElement == null;
+            } catch (e) {
+            }
+            if (document.documentElement.doScroll && toplevel) {
+                ieReadyFunc();
+            }
+        }
+        _bind(window, 'load', readyFunc);
+    }
+
+    if (window.attachEvent) {
+        window.attachEvent('onunload', function () {
+            _each(_eventData, function (key, events) {
+                if (events.el) {
+                    _unbind(events.el);
+                }
+            });
+        });
+    }
+    K.ctrl = _ctrl;
+    K.ready = _ready;
+
+    function _getCssList(css) {
+        css = css.replace(/&quot;/g, '"');
+        var list = {},
+            reg = /\s*([\w\-]+)\s*:([^;]*)(;|$)/g,
+            match;
+        while ((match = reg.exec(css))) {
+            var key = _trim(match[1].toLowerCase()),
+                val = _trim(_toHex(match[2]));
+            list[key] = val;
+        }
+        return list;
+    }
+
+    function _getAttrList(tag) {
+        var list = {},
+            reg = /\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,
+            match;
+        while ((match = reg.exec(tag))) {
+            var key = (match[1] || match[2] || match[4] || match[6]).toLowerCase(),
+                val = (match[2] ? match[3] : (match[4] ? match[5] : match[7])) || '';
+            list[key] = val;
+        }
+        return list;
+    }
+
+    function _addClassToTag(tag, className) {
+        if (/\s+class\s*=/.test(tag)) {
+            tag = tag.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/, function ($0, $1, $2, $3) {
+                if ((' ' + $2 + ' ').indexOf(' ' + className + ' ') < 0) {
+                    return $2 === '' ? $1 + className + $3 : $1 + $2 + ' ' + className + $3;
+                } else {
+                    return $0;
+                }
+            });
+        } else {
+            tag = tag.substr(0, tag.length - 1) + ' class="' + className + '">';
+        }
+        return tag;
+    }
+
+    function _formatCss(css) {
+        var str = '';
+        _each(_getCssList(css), function (key, val) {
+            str += key + ':' + val + ';';
+        });
+        return str;
+    }
+
+    function _formatUrl(url, mode, host, pathname) {
+        mode = _undef(mode, '').toLowerCase();
+        if (url.substr(0, 5) != 'data:') {
+            url = url.replace(/([^:])\/\//g, '$1/');
+        }
+        if (_inArray(mode, ['absolute', 'relative', 'domain']) < 0) {
+            return url;
+        }
+        host = host || location.protocol + '//' + location.host;
+        if (pathname === undefined) {
+            var m = location.pathname.match(/^(\/.*)\//);
+            pathname = m ? m[1] : '';
+        }
+        if (/^\w+:/.test(url)) {
+            return url;
+        }
+        var match;
+        if ((match = /^(\w+:\/\/[^\/]*)/.exec(url))) {
+            if (match[1] !== host) {
+                return url;
+            }
+        }
+
+        function getRealPath(path) {
+            var parts = path.split('/'), paths = [];
+            for (var i = 0, len = parts.length; i < len; i++) {
+                var part = parts[i];
+                if (part == '..') {
+                    if (paths.length > 0) {
+                        paths.pop();
+                    }
+                } else if (part !== '' && part != '.') {
+                    paths.push(part);
+                }
+            }
+            return '/' + paths.join('/');
+        }
+
+        if (/^\//.test(url)) {
+            url = host + getRealPath(url.substr(1));
+        } else if (!/^\w+:\/\//.test(url)) {
+            url = host + getRealPath(pathname + '/' + url);
+        }
+
+        function getRelativePath(path, depth) {
+            if (url.substr(0, path.length) === path) {
+                var arr = [];
+                for (var i = 0; i < depth; i++) {
+                    arr.push('..');
+                }
+                var prefix = '.';
+                if (arr.length > 0) {
+                    prefix += '/' + arr.join('/');
+                }
+                if (pathname == '/') {
+                    prefix += '/';
+                }
+                return prefix + url.substr(path.length);
+            } else {
+                if ((match = /^(.*)\//.exec(path))) {
+                    return getRelativePath(match[1], ++depth);
+                }
+            }
+        }
+
+        if (mode === 'relative') {
+            url = getRelativePath(host + pathname, 0).substr(2);
+        } else if (mode === 'absolute') {
+            if (url.substr(0, host.length) === host) {
+                url = url.substr(host.length);
+            }
+        }
+        return url;
+    }
+
+    function _formatHtml(html, htmlTags, urlType, wellFormatted, indentChar) {
+        if (html == null) {
+            html = '';
+        }
+        urlType = urlType || '';
+        wellFormatted = _undef(wellFormatted, false);
+        indentChar = _undef(indentChar, '\t');
+        var fontSizeList = 'xx-small,x-small,small,medium,large,x-large,xx-large'.split(',');
+        html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function ($0, $1, $2, $3) {
+            return $1 + $2.replace(/<(?:br|br\s[^>]*)>/ig, '\n') + $3;
+        });
+        html = html.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/ig, '</p>');
+        html = html.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig, '$1<br />$2');
+        html = html.replace(/\u200B/g, '');
+        html = html.replace(/\u00A9/g, '&copy;');
+        html = html.replace(/\u00AE/g, '&reg;');
+        html = html.replace(/\u2003/g, '&emsp;');
+        html = html.replace(/\u3000/g, '&emsp;');
+        html = html.replace(/<[^>]+/g, function ($0) {
+            return $0.replace(/\s+/g, ' ');
+        });
+        var htmlTagMap = {};
+        if (htmlTags) {
+            _each(htmlTags, function (key, val) {
+                var arr = key.split(',');
+                for (var i = 0, len = arr.length; i < len; i++) {
+                    htmlTagMap[arr[i]] = _toMap(val);
+                }
+            });
+            if (!htmlTagMap.script) {
+                html = html.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/ig, '');
+            }
+            if (!htmlTagMap.style) {
+                html = html.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/ig, '');
+            }
+        }
+        var re = /(\s*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>(\s*)/g;
+        var tagStack = [];
+        html = html.replace(re, function ($0, $1, $2, $3, $4, $5, $6) {
+            var full = $0,
+                startNewline = $1 || '',
+                startSlash = $2 || '',
+                tagName = $3.toLowerCase(),
+                attr = $4 || '',
+                endSlash = $5 ? ' ' + $5 : '',
+                endNewline = $6 || '';
+            if (tagName == 'code') {
+                return full;
+            }
+            if (htmlTags && !htmlTagMap[tagName]) {
+                return '';
+            }
+            if (endSlash === '' && _SINGLE_TAG_MAP[tagName]) {
+                endSlash = ' /';
+            }
+            if (_INLINE_TAG_MAP[tagName]) {
+                if (startNewline) {
+                    startNewline = ' ';
+                }
+                if (endNewline) {
+                    endNewline = ' ';
+                }
+            }
+            if (_PRE_TAG_MAP[tagName]) {
+                if (startSlash) {
+                    endNewline = '\n';
+                } else {
+                    startNewline = '\n';
+                }
+            }
+            if (wellFormatted && tagName == 'br') {
+                endNewline = '\n';
+            }
+            if (_BLOCK_TAG_MAP[tagName] && !_PRE_TAG_MAP[tagName]) {
+                if (wellFormatted) {
+                    if (startSlash && tagStack.length > 0 && tagStack[tagStack.length - 1] === tagName) {
+                        tagStack.pop();
+                    } else {
+                        tagStack.push(tagName);
+                    }
+                    startNewline = '\n';
+                    endNewline = '\n';
+                    for (var i = 0, len = startSlash ? tagStack.length : tagStack.length - 1; i < len; i++) {
+                        startNewline += indentChar;
+                        if (!startSlash) {
+                            endNewline += indentChar;
+                        }
+                    }
+                    if (endSlash) {
+                        tagStack.pop();
+                    } else if (!startSlash) {
+                        endNewline += indentChar;
+                    }
+                } else {
+                    startNewline = endNewline = '';
+                }
+            }
+            if (attr !== '') {
+                var attrMap = _getAttrList(full);
+                if (tagName === 'font') {
+                    var fontStyleMap = {}, fontStyle = '';
+                    _each(attrMap, function (key, val) {
+                        if (key === 'color') {
+                            fontStyleMap.color = val;
+                            delete attrMap[key];
+                        }
+                        if (key === 'size') {
+                            fontStyleMap['font-size'] = fontSizeList[parseInt(val, 10) - 1] || '';
+                            delete attrMap[key];
+                        }
+                        if (key === 'face') {
+                            fontStyleMap['font-family'] = val;
+                            delete attrMap[key];
+                        }
+                        if (key === 'style') {
+                            fontStyle = val;
+                        }
+                    });
+                    if (fontStyle && !/;$/.test(fontStyle)) {
+                        fontStyle += ';';
+                    }
+                    _each(fontStyleMap, function (key, val) {
+                        if (val === '') {
+                            return;
+                        }
+                        if (/\s/.test(val)) {
+                            val = "'" + val + "'";
+                        }
+                        fontStyle += key + ':' + val + ';';
+                    });
+                    attrMap.style = fontStyle;
+                }
+                _each(attrMap, function (key, val) {
+                    if (_FILL_ATTR_MAP[key]) {
+                        attrMap[key] = key;
+                    }
+                    if (_inArray(key, ['src', 'href']) >= 0) {
+                        attrMap[key] = _formatUrl(val, urlType);
+                    }
+                    if (htmlTags && key !== 'style' && !htmlTagMap[tagName]['*'] && !htmlTagMap[tagName][key] ||
+                        tagName === 'body' && key === 'contenteditable' ||
+                        /^kindeditor_\d+$/.test(key)) {
+                        delete attrMap[key];
+                    }
+                    if (key === 'style' && val !== '') {
+                        var styleMap = _getCssList(val);
+                        _each(styleMap, function (k, v) {
+                            if (htmlTags && !htmlTagMap[tagName].style && !htmlTagMap[tagName]['.' + k]) {
+                                delete styleMap[k];
+                            }
+                        });
+                        var style = '';
+                        _each(styleMap, function (k, v) {
+                            style += k + ':' + v + ';';
+                        });
+                        attrMap.style = style;
+                    }
+                });
+                attr = '';
+                _each(attrMap, function (key, val) {
+                    if (key === 'style' && val === '') {
+                        return;
+                    }
+                    val = val.replace(/"/g, '&quot;');
+                    attr += ' ' + key + '="' + val + '"';
+                });
+            }
+            if (tagName === 'font') {
+                tagName = 'span';
+            }
+            return startNewline + '<' + startSlash + tagName + attr + endSlash + '>' + endNewline;
+        });
+        html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function ($0, $1, $2, $3) {
+            return $1 + $2.replace(/\n/g, '<span id="__kindeditor_pre_newline__">\n') + $3;
+        });
+        html = html.replace(/\n\s*\n/g, '\n');
+        html = html.replace(/<span id="__kindeditor_pre_newline__">\n/g, '\n');
+        return _trim(html);
+    }
+
+    function _clearMsWord(html, htmlTags) {
+        html = html.replace(/<meta[\s\S]*?>/ig, '')
+            .replace(/<![\s\S]*?>/ig, '')
+            .replace(/<style[^>]*>[\s\S]*?<\/style>/ig, '')
+            .replace(/<script[^>]*>[\s\S]*?<\/script>/ig, '')
+            .replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/ig, '')
+            .replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/ig, '')
+            .replace(/<xml>[\s\S]*?<\/xml>/ig, '')
+            .replace(/<(?:table|td)[^>]*>/ig, function (full) {
+                return full.replace(/border-bottom:([#\w\s]+)/ig, 'border:$1');
+            });
+        return _formatHtml(html, htmlTags);
+    }
+
+    function _mediaType(src) {
+        if (/\.(rm|rmvb)(\?|$)/i.test(src)) {
+            return 'audio/x-pn-realaudio-plugin';
+        }
+        if (/\.(mp4)(\?|$)/i.test(src)) {
+            return 'video/mpeg4';
+        }
+        if (/\.(swf|flv)(\?|$)/i.test(src)) {
+            return 'application/x-shockwave-flash';
+        }
+        return 'video/x-ms-asf-plugin';
+    }
+
+    function _mediaClass(type) {
+        if (/realaudio/i.test(type)) {
+            return 'ke-rm';
+        }
+        if (/flash/i.test(type)) {
+            return 'ke-flash';
+        }
+        return 'ke-media';
+    }
+
+    function _mediaAttrs(srcTag) {
+        return _getAttrList(unescape(srcTag));
+    }
+
+    function _mediaEmbed(attrs) {
+        var type = attrs.type == 'video/mpeg4' ? 'video' : 'embed';
+        if (type == 'video') {
+            attrs.controls = "controls";
+        }
+        var html = '<' + type + ' ';
+        _each(attrs, function (key, val) {
+            html += key + '="' + val + '" ';
+        });
+        html += '/>';
+        return html;
+    }
+
+    function _mediaImg(blankPath, attrs) {
+        var width = attrs.width,
+            height = attrs.height,
+            type = attrs.type || _mediaType(attrs.src),
+            srcTag = _mediaEmbed(attrs),
+            style = '';
+        if (/\D/.test(width)) {
+            style += 'width:' + width + ';';
+        } else if (width > 0) {
+            style += 'width:' + width + 'px;';
+        }
+        if (/\D/.test(height)) {
+            style += 'height:' + height + ';';
+        } else if (height > 0) {
+            style += 'height:' + height + 'px;';
+        }
+        var html = '<img class="' + _mediaClass(type) + '" src="' + blankPath + '" ';
+        if (style !== '') {
+            html += 'style="' + style + '" ';
+        }
+        html += 'data-ke-tag="' + escape(srcTag) + '" alt="" />';
+        return html;
+    }
+
+
+    function _tmpl(str, data) {
+        var fn = new Function("obj",
+            "var p=[],print=function(){p.push.apply(p,arguments);};" +
+            "with(obj){p.push('" +
+            str.replace(/[\r\t\n]/g, " ")
+                .split("<%").join("\t")
+                .replace(/((^|%>)[^\t]*)'/g, "$1\r")
+                .replace(/\t=(.*?)%>/g, "',$1,'")
+                .split("\t").join("');")
+                .split("%>").join("p.push('")
+                .split("\r").join("\\'") + "');}return p.join('');");
+        return data ? fn(data) : fn;
+    }
+
+    K.formatUrl = _formatUrl;
+    K.formatHtml = _formatHtml;
+    K.getCssList = _getCssList;
+    K.getAttrList = _getAttrList;
+    K.mediaType = _mediaType;
+    K.mediaAttrs = _mediaAttrs;
+    K.mediaEmbed = _mediaEmbed;
+    K.mediaImg = _mediaImg;
+    K.clearMsWord = _clearMsWord;
+    K.tmpl = _tmpl;
+
+
+    function _contains(nodeA, nodeB) {
+        if (nodeA.nodeType == 9 && nodeB.nodeType != 9) {
+            return true;
+        }
+        while ((nodeB = nodeB.parentNode)) {
+            if (nodeB == nodeA) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    var _getSetAttrDiv = document.createElement('div');
+    _getSetAttrDiv.setAttribute('className', 't');
+    var _GET_SET_ATTRIBUTE = _getSetAttrDiv.className !== 't';
+
+    function _getAttr(el, key) {
+        key = key.toLowerCase();
+        var val = null;
+        if (!_GET_SET_ATTRIBUTE && el.nodeName.toLowerCase() != 'script') {
+            var div = el.ownerDocument.createElement('div');
+            div.appendChild(el.cloneNode(false));
+            var list = _getAttrList(_unescape(div.innerHTML));
+            if (key in list) {
+                val = list[key];
+            }
+        } else {
+            try {
+                val = el.getAttribute(key, 2);
+            } catch (e) {
+                val = el.getAttribute(key, 1);
+            }
+        }
+        if (key === 'style' && val !== null) {
+            val = _formatCss(val);
+        }
+        return val;
+    }
+
+    function _queryAll(expr, root) {
+        var exprList = expr.split(',');
+        if (exprList.length > 1) {
+            var mergedResults = [];
+            _each(exprList, function () {
+                _each(_queryAll(this, root), function () {
+                    if (_inArray(this, mergedResults) < 0) {
+                        mergedResults.push(this);
+                    }
+                });
+            });
+            return mergedResults;
+        }
+        root = root || document;
+
+        function escape(str) {
+            if (typeof str != 'string') {
+                return str;
+            }
+            return str.replace(/([^\w\-])/g, '\\$1');
+        }
+
+        function stripslashes(str) {
+            return str.replace(/\\/g, '');
+        }
+
+        function cmpTag(tagA, tagB) {
+            return tagA === '*' || tagA.toLowerCase() === escape(tagB.toLowerCase());
+        }
+
+        function byId(id, tag, root) {
+            var arr = [],
+                doc = root.ownerDocument || root,
+                el = doc.getElementById(stripslashes(id));
+            if (el) {
+                if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
+                    arr.push(el);
+                }
+            }
+            return arr;
+        }
+
+        function byClass(className, tag, root) {
+            var doc = root.ownerDocument || root, arr = [], els, i, len, el;
+            if (root.getElementsByClassName) {
+                els = root.getElementsByClassName(stripslashes(className));
+                for (i = 0, len = els.length; i < len; i++) {
+                    el = els[i];
+                    if (cmpTag(tag, el.nodeName)) {
+                        arr.push(el);
+                    }
+                }
+            } else if (doc.querySelectorAll) {
+                els = doc.querySelectorAll((root.nodeName !== '#document' ? root.nodeName + ' ' : '') + tag + '.' + className);
+                for (i = 0, len = els.length; i < len; i++) {
+                    el = els[i];
+                    if (_contains(root, el)) {
+                        arr.push(el);
+                    }
+                }
+            } else {
+                els = root.getElementsByTagName(tag);
+                className = ' ' + className + ' ';
+                for (i = 0, len = els.length; i < len; i++) {
+                    el = els[i];
+                    if (el.nodeType == 1) {
+                        var cls = el.className;
+                        if (cls && (' ' + cls + ' ').indexOf(className) > -1) {
+                            arr.push(el);
+                        }
+                    }
+                }
+            }
+            return arr;
+        }
+
+        function byName(name, tag, root) {
+            var arr = [], doc = root.ownerDocument || root,
+                els = doc.getElementsByName(stripslashes(name)), el;
+            for (var i = 0, len = els.length; i < len; i++) {
+                el = els[i];
+                if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
+                    if (el.getAttribute('name') !== null) {
+                        arr.push(el);
+                    }
+                }
+            }
+            return arr;
+        }
+
+        function byAttr(key, val, tag, root) {
+            var arr = [], els = root.getElementsByTagName(tag), el;
+            for (var i = 0, len = els.length; i < len; i++) {
+                el = els[i];
+                if (el.nodeType == 1) {
+                    if (val === null) {
+                        if (_getAttr(el, key) !== null) {
+                            arr.push(el);
+                        }
+                    } else {
+                        if (val === escape(_getAttr(el, key))) {
+                            arr.push(el);
+                        }
+                    }
+                }
+            }
+            return arr;
+        }
+
+        function select(expr, root) {
+            var arr = [], matches;
+            matches = /^((?:\\.|[^.#\s\[<>])+)/.exec(expr);
+            var tag = matches ? matches[1] : '*';
+            if ((matches = /#((?:[\w\-]|\\.)+)$/.exec(expr))) {
+                arr = byId(matches[1], tag, root);
+            } else if ((matches = /\.((?:[\w\-]|\\.)+)$/.exec(expr))) {
+                arr = byClass(matches[1], tag, root);
+            } else if ((matches = /\[((?:[\w\-]|\\.)+)\]/.exec(expr))) {
+                arr = byAttr(matches[1].toLowerCase(), null, tag, root);
+            } else if ((matches = /\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(expr))) {
+                var key = matches[1].toLowerCase(), val = matches[2];
+                if (key === 'id') {
+                    arr = byId(val, tag, root);
+                } else if (key === 'class') {
+                    arr = byClass(val, tag, root);
+                } else if (key === 'name') {
+                    arr = byName(val, tag, root);
+                } else {
+                    arr = byAttr(key, val, tag, root);
+                }
+            } else {
+                var els = root.getElementsByTagName(tag), el;
+                for (var i = 0, len = els.length; i < len; i++) {
+                    el = els[i];
+                    if (el.nodeType == 1) {
+                        arr.push(el);
+                    }
+                }
+            }
+            return arr;
+        }
+
+        var parts = [], arr, re = /((?:\\.|[^\s>])+|[\s>])/g;
+        while ((arr = re.exec(expr))) {
+            if (arr[1] !== ' ') {
+                parts.push(arr[1]);
+            }
+        }
+        var results = [];
+        if (parts.length == 1) {
+            return select(parts[0], root);
+        }
+        var isChild = false, part, els, subResults, val, v, i, j, k, length, len, l;
+        for (i = 0, lenth = parts.length; i < lenth; i++) {
+            part = parts[i];
+            if (part === '>') {
+                isChild = true;
+                continue;
+            }
+            if (i > 0) {
+                els = [];
+                for (j = 0, len = results.length; j < len; j++) {
+                    val = results[j];
+                    subResults = select(part, val);
+                    for (k = 0, l = subResults.length; k < l; k++) {
+                        v = subResults[k];
+                        if (isChild) {
+                            if (val === v.parentNode) {
+                                els.push(v);
+                            }
+                        } else {
+                            els.push(v);
+                        }
+                    }
+                }
+                results = els;
+            } else {
+                results = select(part, root);
+            }
+            if (results.length === 0) {
+                return [];
+            }
+        }
+        return results;
+    }
+
+    function _query(expr, root) {
+        var arr = _queryAll(expr, root);
+        return arr.length > 0 ? arr[0] : null;
+    }
+
+    K.query = _query;
+    K.queryAll = _queryAll;
+
+
+    function _get(val) {
+        return K(val)[0];
+    }
+
+    function _getDoc(node) {
+        if (!node) {
+            return document;
+        }
+        return node.ownerDocument || node.document || node;
+    }
+
+    function _getWin(node) {
+        if (!node) {
+            return window;
+        }
+        var doc = _getDoc(node);
+        return doc.parentWindow || doc.defaultView;
+    }
+
+    function _setHtml(el, html) {
+        if (el.nodeType != 1) {
+            return;
+        }
+        var doc = _getDoc(el);
+        try {
+            el.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + html;
+            var temp = doc.getElementById('__kindeditor_temp_tag__');
+            temp.parentNode.removeChild(temp);
+        } catch (e) {
+            K(el).empty();
+            K('@' + html, doc).each(function () {
+                el.appendChild(this);
+            });
+        }
+    }
+
+    function _hasClass(el, cls) {
+        return _inString(cls, el.className, ' ');
+    }
+
+    function _setAttr(el, key, val) {
+        if (_IE && _V < 8 && key.toLowerCase() == 'class') {
+            key = 'className';
+        }
+        el.setAttribute(key, '' + val);
+    }
+
+    function _removeAttr(el, key) {
+        if (_IE && _V < 8 && key.toLowerCase() == 'class') {
+            key = 'className';
+        }
+        _setAttr(el, key, '');
+        el.removeAttribute(key);
+    }
+
+    function _getNodeName(node) {
+        if (!node || !node.nodeName) {
+            return '';
+        }
+        return node.nodeName.toLowerCase();
+    }
+
+    function _computedCss(el, key) {
+        var self = this, win = _getWin(el), camelKey = _toCamel(key), val = '';
+        if (win.getComputedStyle) {
+            var style = win.getComputedStyle(el, null);
+            val = style[camelKey] || style.getPropertyValue(key) || el.style[camelKey];
+        } else if (el.currentStyle) {
+            val = el.currentStyle[camelKey] || el.style[camelKey];
+        }
+        return val;
+    }
+
+    function _hasVal(node) {
+        return !!_VALUE_TAG_MAP[_getNodeName(node)];
+    }
+
+    function _docElement(doc) {
+        doc = doc || document;
+        return _QUIRKS ? doc.body : doc.documentElement;
+    }
+
+    function _docHeight(doc) {
+        var el = _docElement(doc);
+        return Math.max(el.scrollHeight, el.clientHeight);
+    }
+
+    function _docWidth(doc) {
+        var el = _docElement(doc);
+        return Math.max(el.scrollWidth, el.clientWidth);
+    }
+
+    function _getScrollPos(doc) {
+        doc = doc || document;
+        var x, y;
+        if (_IE || _NEWIE || _OPERA) {
+            x = _docElement(doc).scrollLeft;
+            y = _docElement(doc).scrollTop;
+        } else {
+            x = _getWin(doc).scrollX;
+            y = _getWin(doc).scrollY;
+        }
+        return {x: x, y: y};
+    }
+
+
+    function KNode(node) {
+        this.init(node);
+    }
+
+    _extend(KNode, {
+        init: function (node) {
+            var self = this;
+            node = _isArray(node) ? node : [node];
+            var length = 0;
+            for (var i = 0, len = node.length; i < len; i++) {
+                if (node[i]) {
+                    self[i] = node[i].constructor === KNode ? node[i][0] : node[i];
+                    length++;
+                }
+            }
+            self.length = length;
+            self.doc = _getDoc(self[0]);
+            self.name = _getNodeName(self[0]);
+            self.type = self.length > 0 ? self[0].nodeType : null;
+            self.win = _getWin(self[0]);
+        },
+        each: function (fn) {
+            var self = this;
+            for (var i = 0; i < self.length; i++) {
+                if (fn.call(self[i], i, self[i]) === false) {
+                    return self;
+                }
+            }
+            return self;
+        },
+        bind: function (type, fn) {
+            this.each(function () {
+                _bind(this, type, fn);
+            });
+            return this;
+        },
+        unbind: function (type, fn) {
+            this.each(function () {
+                _unbind(this, type, fn);
+            });
+            return this;
+        },
+        fire: function (type) {
+            if (this.length < 1) {
+                return this;
+            }
+            _fire(this[0], type);
+            return this;
+        },
+        hasAttr: function (key) {
+            if (this.length < 1) {
+                return false;
+            }
+            return !!_getAttr(this[0], key);
+        },
+        attr: function (key, val) {
+            var self = this;
+            if (key === undefined) {
+                return _getAttrList(self.outer());
+            }
+            if (typeof key === 'object') {
+                _each(key, function (k, v) {
+                    self.attr(k, v);
+                });
+                return self;
+            }
+            if (val === undefined) {
+                val = self.length < 1 ? null : _getAttr(self[0], key);
+                return val === null ? '' : val;
+            }
+            self.each(function () {
+                _setAttr(this, key, val);
+            });
+            return self;
+        },
+        removeAttr: function (key) {
+            this.each(function () {
+                _removeAttr(this, key);
+            });
+            return this;
+        },
+        get: function (i) {
+            if (this.length < 1) {
+                return null;
+            }
+            return this[i || 0];
+        },
+        eq: function (i) {
+            if (this.length < 1) {
+                return null;
+            }
+            return this[i] ? new KNode(this[i]) : null;
+        },
+        hasClass: function (cls) {
+            if (this.length < 1) {
+                return false;
+            }
+            return _hasClass(this[0], cls);
+        },
+        addClass: function (cls) {
+            this.each(function () {
+                if (!_hasClass(this, cls)) {
+                    this.className = _trim(this.className + ' ' + cls);
+                }
+            });
+            return this;
+        },
+        removeClass: function (cls) {
+            this.each(function () {
+                if (_hasClass(this, cls)) {
+                    this.className = _trim(this.className.replace(new RegExp('(^|\\s)' + cls + '(\\s|$)'), ' '));
+                }
+            });
+            return this;
+        },
+        html: function (val) {
+            var self = this;
+            if (val === undefined) {
+                if (self.length < 1 || self.type != 1) {
+                    return '';
+                }
+                return _formatHtml(self[0].innerHTML);
+            }
+            self.each(function () {
+                _setHtml(this, val);
+            });
+            return self;
+        },
+        text: function () {
+            var self = this;
+            if (self.length < 1) {
+                return '';
+            }
+            return _IE ? self[0].innerText : self[0].textContent;
+        },
+        hasVal: function () {
+            if (this.length < 1) {
+                return false;
+            }
+            return _hasVal(this[0]);
+        },
+        val: function (val) {
+            var self = this;
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return '';
+                }
+                return self.hasVal() ? self[0].value : self.attr('value');
+            } else {
+                self.each(function () {
+                    if (_hasVal(this)) {
+                        this.value = val;
+                    } else {
+                        _setAttr(this, 'value', val);
+                    }
+                });
+                return self;
+            }
+        },
+        css: function (key, val) {
+            var self = this;
+            if (key === undefined) {
+                return _getCssList(self.attr('style'));
+            }
+            if (typeof key === 'object') {
+                _each(key, function (k, v) {
+                    self.css(k, v);
+                });
+                return self;
+            }
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return '';
+                }
+                return self[0].style[_toCamel(key)] || _computedCss(self[0], key) || '';
+            }
+            self.each(function () {
+                this.style[_toCamel(key)] = val;
+            });
+            return self;
+        },
+        width: function (val) {
+            var self = this;
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return 0;
+                }
+                return self[0].offsetWidth;
+            }
+            return self.css('width', _addUnit(val));
+        },
+        height: function (val) {
+            var self = this;
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return 0;
+                }
+                return self[0].offsetHeight;
+            }
+            return self.css('height', _addUnit(val));
+        },
+        opacity: function (val) {
+            this.each(function () {
+                if (this.style.opacity === undefined) {
+                    this.style.filter = val == 1 ? '' : 'alpha(opacity=' + (val * 100) + ')';
+                } else {
+                    this.style.opacity = val == 1 ? '' : val;
+                }
+            });
+            return this;
+        },
+        data: function (key, val) {
+            var self = this;
+            key = 'kindeditor_data_' + key;
+            if (val === undefined) {
+                if (self.length < 1) {
+                    return null;
+                }
+                return self[0][key];
+            }
+            this.each(function () {
+                this[key] = val;
+            });
+            return self;
+        },
+        pos: function () {
+            var self = this, node = self[0], x = 0, y = 0;
+            if (node) {
+                if (node.getBoundingClientRect) {
+                    var box = node.getBoundingClientRect(),
+                        pos = _getScrollPos(self.doc);
+                    x = box.left + pos.x;
+                    y = box.top + pos.y;
+                } else {
+                    while (node) {
+                        x += node.offsetLeft;
+                        y += node.offsetTop;
+                        node = node.offsetParent;
+                    }
+                }
+            }
+            return {x: _round(x), y: _round(y)};
+        },
+        clone: function (bool) {
+            if (this.length < 1) {
+                return new KNode([]);
+            }
+            return new KNode(this[0].cloneNode(bool));
+        },
+        append: function (expr) {
+            this.each(function () {
+                if (this.appendChild) {
+                    this.appendChild(_get(expr));
+                }
+            });
+            return this;
+        },
+        appendTo: function (expr) {
+            this.each(function () {
+                _get(expr).appendChild(this);
+            });
+            return this;
+        },
+        before: function (expr) {
+            this.each(function () {
+                try {
+                    this.parentNode.insertBefore(_get(expr), this);
+                } catch (e) {
+                }
+            });
+            return this;
+        },
+        after: function (expr) {
+            this.each(function () {
+                if (this.nextSibling) {
+                    this.parentNode.insertBefore(_get(expr), this.nextSibling);
+                } else {
+                    this.parentNode.appendChild(_get(expr));
+                }
+            });
+            return this;
+        },
+        replaceWith: function (expr) {
+            var nodes = [];
+            this.each(function (i, node) {
+                _unbind(node);
+                var newNode = _get(expr);
+                node.parentNode.replaceChild(newNode, node);
+                nodes.push(newNode);
+            });
+            return K(nodes);
+        },
+        empty: function () {
+            var self = this;
+            self.each(function (i, node) {
+                var child = node.firstChild;
+                while (child) {
+                    if (!node.parentNode) {
+                        return;
+                    }
+                    var next = child.nextSibling;
+                    child.parentNode.removeChild(child);
+                    child = next;
+                }
+            });
+            return self;
+        },
+        remove: function (keepChilds) {
+            var self = this;
+            self.each(function (i, node) {
+                if (!node.parentNode) {
+                    return;
+                }
+                _unbind(node);
+                if (keepChilds) {
+                    var child = node.firstChild;
+                    while (child) {
+                        var next = child.nextSibling;
+                        node.parentNode.insertBefore(child, node);
+                        child = next;
+                    }
+                }
+                node.parentNode.removeChild(node);
+                delete self[i];
+            });
+            self.length = 0;
+            return self;
+        },
+        show: function (val) {
+            var self = this;
+            if (val === undefined) {
+                val = self._originDisplay || '';
+            }
+            if (self.css('display') != 'none') {
+                return self;
+            }
+            return self.css('display', val);
+        },
+        hide: function () {
+            var self = this;
+            if (self.length < 1) {
+                return self;
+            }
+            self._originDisplay = self[0].style.display;
+            return self.css('display', 'none');
+        },
+        outer: function () {
+            var self = this;
+            if (self.length < 1) {
+                return '';
+            }
+            var div = self.doc.createElement('div'), html;
+            div.appendChild(self[0].cloneNode(true));
+            html = _formatHtml(div.innerHTML);
+            div = null;
+            return html;
+        },
+        isSingle: function () {
+            return !!_SINGLE_TAG_MAP[this.name];
+        },
+        isInline: function () {
+            return !!_INLINE_TAG_MAP[this.name];
+        },
+        isBlock: function () {
+            return !!_BLOCK_TAG_MAP[this.name];
+        },
+        isStyle: function () {
+            return !!_STYLE_TAG_MAP[this.name];
+        },
+        isControl: function () {
+            return !!_CONTROL_TAG_MAP[this.name];
+        },
+        contains: function (otherNode) {
+            if (this.length < 1) {
+                return false;
+            }
+            return _contains(this[0], _get(otherNode));
+        },
+        parent: function () {
+            if (this.length < 1) {
+                return null;
+            }
+            var node = this[0].parentNode;
+            return node ? new KNode(node) : null;
+        },
+        children: function () {
+            if (this.length < 1) {
+                return new KNode([]);
+            }
+            var list = [], child = this[0].firstChild;
+            while (child) {
+                if (child.nodeType != 3 || _trim(child.nodeValue) !== '') {
+                    list.push(child);
+                }
+                child = child.nextSibling;
+            }
+            return new KNode(list);
+        },
+        first: function () {
+            var list = this.children();
+            return list.length > 0 ? list.eq(0) : null;
+        },
+        last: function () {
+            var list = this.children();
+            return list.length > 0 ? list.eq(list.length - 1) : null;
+        },
+        index: function () {
+            if (this.length < 1) {
+                return -1;
+            }
+            var i = -1, sibling = this[0];
+            while (sibling) {
+                i++;
+                sibling = sibling.previousSibling;
+            }
+            return i;
+        },
+        prev: function () {
+            if (this.length < 1) {
+                return null;
+            }
+            var node = this[0].previousSibling;
+            return node ? new KNode(node) : null;
+        },
+        next: function () {
+            if (this.length < 1) {
+                return null;
+            }
+            var node = this[0].nextSibling;
+            return node ? new KNode(node) : null;
+        },
+        scan: function (fn, order) {
+            if (this.length < 1) {
+                return;
+            }
+            order = (order === undefined) ? true : order;
+
+            function walk(node) {
+                var n = order ? node.firstChild : node.lastChild;
+                while (n) {
+                    var next = order ? n.nextSibling : n.previousSibling;
+                    if (fn(n) === false) {
+                        return false;
+                    }
+                    if (walk(n) === false) {
+                        return false;
+                    }
+                    n = next;
+                }
+            }
+
+            walk(this[0]);
+            return this;
+        }
+    });
+    _each(('blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,' +
+        'mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,' +
+        'change,select,submit,keydown,keypress,keyup,error,contextmenu').split(','), function (i, type) {
+        KNode.prototype[type] = function (fn) {
+            return fn ? this.bind(type, fn) : this.fire(type);
+        };
+    });
+    var _K = K;
+    K = function (expr, root) {
+        if (expr === undefined || expr === null) {
+            return;
+        }
+
+        function newNode(node) {
+            if (!node[0]) {
+                node = [];
+            }
+            return new KNode(node);
+        }
+
+        if (typeof expr === 'string') {
+            if (root) {
+                root = _get(root);
+            }
+            var length = expr.length;
+            if (expr.charAt(0) === '@') {
+                expr = expr.substr(1);
+            }
+            if (expr.length !== length || /<.+>/.test(expr)) {
+                var doc = root ? root.ownerDocument || root : document,
+                    div = doc.createElement('div'), list = [];
+                div.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + expr;
+                for (var i = 0, len = div.childNodes.length; i < len; i++) {
+                    var child = div.childNodes[i];
+                    if (child.id == '__kindeditor_temp_tag__') {
+                        continue;
+                    }
+                    list.push(child);
+                }
+                return newNode(list);
+            }
+            return newNode(_queryAll(expr, root));
+        }
+        if (expr && expr.constructor === KNode) {
+            return expr;
+        }
+        if (expr.toArray) {
+            expr = expr.toArray();
+        }
+        if (_isArray(expr)) {
+            return newNode(expr);
+        }
+        return newNode(_toArray(arguments));
+    };
+    _each(_K, function (key, val) {
+        K[key] = val;
+    });
+    K.NodeClass = KNode;
+    window.KindEditor = K;
+
+
+    var _START_TO_START = 0,
+        _START_TO_END = 1,
+        _END_TO_END = 2,
+        _END_TO_START = 3,
+        _BOOKMARK_ID = 0;
+
+    function _updateCollapsed(range) {
+        range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);
+        return range;
+    }
+
+    function _copyAndDelete(range, isCopy, isDelete) {
+        var doc = range.doc, nodeList = [];
+
+        function splitTextNode(node, startOffset, endOffset) {
+            var length = node.nodeValue.length, centerNode;
+            if (isCopy) {
+                var cloneNode = node.cloneNode(true);
+                if (startOffset > 0) {
+                    centerNode = cloneNode.splitText(startOffset);
+                } else {
+                    centerNode = cloneNode;
+                }
+                if (endOffset < length) {
+                    centerNode.splitText(endOffset - startOffset);
+                }
+            }
+            if (isDelete) {
+                var center = node;
+                if (startOffset > 0) {
+                    center = node.splitText(startOffset);
+                    range.setStart(node, startOffset);
+                }
+                if (endOffset < length) {
+                    var right = center.splitText(endOffset - startOffset);
+                    range.setEnd(right, 0);
+                }
+                nodeList.push(center);
+            }
+            return centerNode;
+        }
+
+        function removeNodes() {
+            if (isDelete) {
+                range.up().collapse(true);
+            }
+            for (var i = 0, len = nodeList.length; i < len; i++) {
+                var node = nodeList[i];
+                if (node.parentNode) {
+                    node.parentNode.removeChild(node);
+                }
+            }
+        }
+
+        var copyRange = range.cloneRange().down();
+        var start = -1, incStart = -1, incEnd = -1, end = -1,
+            ancestor = range.commonAncestor(), frag = doc.createDocumentFragment();
+        if (ancestor.nodeType == 3) {
+            var textNode = splitTextNode(ancestor, range.startOffset, range.endOffset);
+            if (isCopy) {
+                frag.appendChild(textNode);
+            }
+            removeNodes();
+            return isCopy ? frag : range;
+        }
+
+        function extractNodes(parent, frag) {
+            var node = parent.firstChild, nextNode;
+            while (node) {
+                var testRange = new KRange(doc).selectNode(node);
+                start = testRange.compareBoundaryPoints(_START_TO_END, range);
+                if (start >= 0 && incStart <= 0) {
+                    incStart = testRange.compareBoundaryPoints(_START_TO_START, range);
+                }
+                if (incStart >= 0 && incEnd <= 0) {
+                    incEnd = testRange.compareBoundaryPoints(_END_TO_END, range);
+                }
+                if (incEnd >= 0 && end <= 0) {
+                    end = testRange.compareBoundaryPoints(_END_TO_START, range);
+                }
+                if (end >= 0) {
+                    return false;
+                }
+                nextNode = node.nextSibling;
+                if (start > 0) {
+                    if (node.nodeType == 1) {
+                        if (incStart >= 0 && incEnd <= 0) {
+                            if (isCopy) {
+                                frag.appendChild(node.cloneNode(true));
+                            }
+                            if (isDelete) {
+                                nodeList.push(node);
+                            }
+                        } else {
+                            var childFlag;
+                            if (isCopy) {
+                                childFlag = node.cloneNode(false);
+                                frag.appendChild(childFlag);
+                            }
+                            if (extractNodes(node, childFlag) === false) {
+                                return false;
+                            }
+                        }
+                    } else if (node.nodeType == 3) {
+                        var textNode;
+                        if (node == copyRange.startContainer) {
+                            textNode = splitTextNode(node, copyRange.startOffset, node.nodeValue.length);
+                        } else if (node == copyRange.endContainer) {
+                            textNode = splitTextNode(node, 0, copyRange.endOffset);
+                        } else {
+                            textNode = splitTextNode(node, 0, node.nodeValue.length);
+                        }
+                        if (isCopy) {
+                            try {
+                                frag.appendChild(textNode);
+                            } catch (e) {
+                            }
+                        }
+                    }
+                }
+                node = nextNode;
+            }
+        }
+
+        extractNodes(ancestor, frag);
+        if (isDelete) {
+            range.up().collapse(true);
+        }
+        for (var i = 0, len = nodeList.length; i < len; i++) {
+            var node = nodeList[i];
+            if (node.parentNode) {
+                node.parentNode.removeChild(node);
+            }
+        }
+        return isCopy ? frag : range;
+    }
+
+    function _moveToElementText(range, el) {
+        var node = el;
+        while (node) {
+            var knode = K(node);
+            if (knode.name == 'marquee' || knode.name == 'select') {
+                return;
+            }
+            node = node.parentNode;
+        }
+        try {
+            range.moveToElementText(el);
+        } catch (e) {
+        }
+    }
+
+    function _getStartEnd(rng, isStart) {
+        var doc = rng.parentElement().ownerDocument,
+            pointRange = rng.duplicate();
+        pointRange.collapse(isStart);
+        var parent = pointRange.parentElement(),
+            nodes = parent.childNodes;
+        if (nodes.length === 0) {
+            return {node: parent.parentNode, offset: K(parent).index()};
+        }
+        var startNode = doc, startPos = 0, cmp = -1;
+        var testRange = rng.duplicate();
+        _moveToElementText(testRange, parent);
+        for (var i = 0, len = nodes.length; i < len; i++) {
+            var node = nodes[i];
+            cmp = testRange.compareEndPoints('StartToStart', pointRange);
+            if (cmp === 0) {
+                return {node: node.parentNode, offset: i};
+            }
+            if (node.nodeType == 1) {
+                var nodeRange = rng.duplicate(), dummy, knode = K(node), newNode = node;
+                if (knode.isControl()) {
+                    dummy = doc.createElement('span');
+                    knode.after(dummy);
+                    newNode = dummy;
+                    startPos += knode.text().replace(/\r\n|\n|\r/g, '').length;
+                }
+                _moveToElementText(nodeRange, newNode);
+                testRange.setEndPoint('StartToEnd', nodeRange);
+                if (cmp > 0) {
+                    startPos += nodeRange.text.replace(/\r\n|\n|\r/g, '').length;
+                } else {
+                    startPos = 0;
+                }
+                if (dummy) {
+                    K(dummy).remove();
+                }
+            } else if (node.nodeType == 3) {
+                testRange.moveStart('character', node.nodeValue.length);
+                startPos += node.nodeValue.length;
+            }
+            if (cmp < 0) {
+                startNode = node;
+            }
+        }
+        if (cmp < 0 && startNode.nodeType == 1) {
+            return {node: parent, offset: K(parent.lastChild).index() + 1};
+        }
+        if (cmp > 0) {
+            while (startNode.nextSibling && startNode.nodeType == 1) {
+                startNode = startNode.nextSibling;
+            }
+        }
+        testRange = rng.duplicate();
+        _moveToElementText(testRange, parent);
+        testRange.setEndPoint('StartToEnd', pointRange);
+        startPos -= testRange.text.replace(/\r\n|\n|\r/g, '').length;
+        if (cmp > 0 && startNode.nodeType == 3) {
+            var prevNode = startNode.previousSibling;
+            while (prevNode && prevNode.nodeType == 3) {
+                startPos -= prevNode.nodeValue.length;
+                prevNode = prevNode.previousSibling;
+            }
+        }
+        return {node: startNode, offset: startPos};
+    }
+
+    function _getEndRange(node, offset) {
+        var doc = node.ownerDocument || node,
+            range = doc.body.createTextRange();
+        if (doc == node) {
+            range.collapse(true);
+            return range;
+        }
+        if (node.nodeType == 1 && node.childNodes.length > 0) {
+            var children = node.childNodes, isStart, child;
+            if (offset === 0) {
+                child = children[0];
+                isStart = true;
+            } else {
+                child = children[offset - 1];
+                isStart = false;
+            }
+            if (!child) {
+                return range;
+            }
+            if (K(child).name === 'head') {
+                if (offset === 1) {
+                    isStart = true;
+                }
+                if (offset === 2) {
+                    isStart = false;
+                }
+                range.collapse(isStart);
+                return range;
+            }
+            if (child.nodeType == 1) {
+                var kchild = K(child), span;
+                if (kchild.isControl()) {
+                    span = doc.createElement('span');
+                    if (isStart) {
+                        kchild.before(span);
+                    } else {
+                        kchild.after(span);
+                    }
+                    child = span;
+                }
+                _moveToElementText(range, child);
+                range.collapse(isStart);
+                if (span) {
+                    K(span).remove();
+                }
+                return range;
+            }
+            node = child;
+            offset = isStart ? 0 : child.nodeValue.length;
+        }
+        var dummy = doc.createElement('span');
+        K(node).before(dummy);
+        _moveToElementText(range, dummy);
+        range.moveStart('character', offset);
+        K(dummy).remove();
+        return range;
+    }
+
+    function _toRange(rng) {
+        var doc, range;
+
+        function tr2td(start) {
+            if (K(start.node).name == 'tr') {
+                start.node = start.node.cells[start.offset];
+                start.offset = 0;
+            }
+        }
+
+        if (_IERANGE) {
+            if (rng.item) {
+                doc = _getDoc(rng.item(0));
+                range = new KRange(doc);
+                range.selectNode(rng.item(0));
+                return range;
+            }
+            doc = rng.parentElement().ownerDocument;
+            var start = _getStartEnd(rng, true),
+                end = _getStartEnd(rng, false);
+            tr2td(start);
+            tr2td(end);
+            range = new KRange(doc);
+            range.setStart(start.node, start.offset);
+            range.setEnd(end.node, end.offset);
+            return range;
+        }
+        var startContainer = rng.startContainer;
+        doc = startContainer.ownerDocument || startContainer;
+        range = new KRange(doc);
+        range.setStart(startContainer, rng.startOffset);
+        range.setEnd(rng.endContainer, rng.endOffset);
+        return range;
+    }
+
+
+    function KRange(doc) {
+        this.init(doc);
+    }
+
+    _extend(KRange, {
+        init: function (doc) {
+            var self = this;
+            self.startContainer = doc;
+            self.startOffset = 0;
+            self.endContainer = doc;
+            self.endOffset = 0;
+            self.collapsed = true;
+            self.doc = doc;
+        },
+        commonAncestor: function () {
+            function getParents(node) {
+                var parents = [];
+                while (node) {
+                    parents.push(node);
+                    node = node.parentNode;
+                }
+                return parents;
+            }
+
+            var parentsA = getParents(this.startContainer),
+                parentsB = getParents(this.endContainer),
+                i = 0, lenA = parentsA.length, lenB = parentsB.length, parentA, parentB;
+            while (++i) {
+                parentA = parentsA[lenA - i];
+                parentB = parentsB[lenB - i];
+                if (!parentA || !parentB || parentA !== parentB) {
+                    break;
+                }
+            }
+            return parentsA[lenA - i + 1];
+        },
+        setStart: function (node, offset) {
+            var self = this, doc = self.doc;
+            self.startContainer = node;
+            self.startOffset = offset;
+            if (self.endContainer === doc) {
+                self.endContainer = node;
+                self.endOffset = offset;
+            }
+            return _updateCollapsed(this);
+        },
+        setEnd: function (node, offset) {
+            var self = this, doc = self.doc;
+            self.endContainer = node;
+            self.endOffset = offset;
+            if (self.startContainer === doc) {
+                self.startContainer = node;
+                self.startOffset = offset;
+            }
+            return _updateCollapsed(this);
+        },
+        setStartBefore: function (node) {
+            return this.setStart(node.parentNode || this.doc, K(node).index());
+        },
+        setStartAfter: function (node) {
+            return this.setStart(node.parentNode || this.doc, K(node).index() + 1);
+        },
+        setEndBefore: function (node) {
+            return this.setEnd(node.parentNode || this.doc, K(node).index());
+        },
+        setEndAfter: function (node) {
+            return this.setEnd(node.parentNode || this.doc, K(node).index() + 1);
+        },
+        selectNode: function (node) {
+            return this.setStartBefore(node).setEndAfter(node);
+        },
+        selectNodeContents: function (node) {
+            var knode = K(node);
+            if (knode.type == 3 || knode.isSingle()) {
+                return this.selectNode(node);
+            }
+            var children = knode.children();
+            if (children.length > 0) {
+                return this.setStartBefore(children[0]).setEndAfter(children[children.length - 1]);
+            }
+            return this.setStart(node, 0).setEnd(node, 0);
+        },
+        collapse: function (toStart) {
+            if (toStart) {
+                return this.setEnd(this.startContainer, this.startOffset);
+            }
+            return this.setStart(this.endContainer, this.endOffset);
+        },
+        compareBoundaryPoints: function (how, range) {
+            var rangeA = this.get(), rangeB = range.get();
+            if (_IERANGE) {
+                var arr = {};
+                arr[_START_TO_START] = 'StartToStart';
+                arr[_START_TO_END] = 'EndToStart';
+                arr[_END_TO_END] = 'EndToEnd';
+                arr[_END_TO_START] = 'StartToEnd';
+                var cmp = rangeA.compareEndPoints(arr[how], rangeB);
+                if (cmp !== 0) {
+                    return cmp;
+                }
+                var nodeA, nodeB, nodeC, posA, posB;
+                if (how === _START_TO_START || how === _END_TO_START) {
+                    nodeA = this.startContainer;
+                    posA = this.startOffset;
+                }
+                if (how === _START_TO_END || how === _END_TO_END) {
+                    nodeA = this.endContainer;
+                    posA = this.endOffset;
+                }
+                if (how === _START_TO_START || how === _START_TO_END) {
+                    nodeB = range.startContainer;
+                    posB = range.startOffset;
+                }
+                if (how === _END_TO_END || how === _END_TO_START) {
+                    nodeB = range.endContainer;
+                    posB = range.endOffset;
+                }
+                if (nodeA === nodeB) {
+                    var diff = posA - posB;
+                    return diff > 0 ? 1 : (diff < 0 ? -1 : 0);
+                }
+                nodeC = nodeB;
+                while (nodeC && nodeC.parentNode !== nodeA) {
+                    nodeC = nodeC.parentNode;
+                }
+                if (nodeC) {
+                    return K(nodeC).index() >= posA ? -1 : 1;
+                }
+                nodeC = nodeA;
+                while (nodeC && nodeC.parentNode !== nodeB) {
+                    nodeC = nodeC.parentNode;
+                }
+                if (nodeC) {
+                    return K(nodeC).index() >= posB ? 1 : -1;
+                }
+                nodeC = K(nodeB).next();
+                if (nodeC && nodeC.contains(nodeA)) {
+                    return 1;
+                }
+                nodeC = K(nodeA).next();
+                if (nodeC && nodeC.contains(nodeB)) {
+                    return -1;
+                }
+            } else {
+                return rangeA.compareBoundaryPoints(how, rangeB);
+            }
+        },
+        cloneRange: function () {
+            return new KRange(this.doc).setStart(this.startContainer, this.startOffset).setEnd(this.endContainer, this.endOffset);
+        },
+        toString: function () {
+            var rng = this.get(), str = _IERANGE ? rng.text : rng.toString();
+            return str.replace(/\r\n|\n|\r/g, '');
+        },
+        cloneContents: function () {
+            return _copyAndDelete(this, true, false);
+        },
+        deleteContents: function () {
+            return _copyAndDelete(this, false, true);
+        },
+        extractContents: function () {
+            return _copyAndDelete(this, true, true);
+        },
+        insertNode: function (node) {
+            var self = this,
+                sc = self.startContainer, so = self.startOffset,
+                ec = self.endContainer, eo = self.endOffset,
+                firstChild, lastChild, c, nodeCount = 1;
+            if (node.nodeName.toLowerCase() === '#document-fragment') {
+                firstChild = node.firstChild;
+                lastChild = node.lastChild;
+                nodeCount = node.childNodes.length;
+            }
+            if (sc.nodeType == 1) {
+                c = sc.childNodes[so];
+                if (c) {
+                    sc.insertBefore(node, c);
+                    if (sc === ec) {
+                        eo += nodeCount;
+                    }
+                } else {
+                    sc.appendChild(node);
+                }
+            } else if (sc.nodeType == 3) {
+                if (so === 0) {
+                    sc.parentNode.insertBefore(node, sc);
+                    if (sc.parentNode === ec) {
+                        eo += nodeCount;
+                    }
+                } else if (so >= sc.nodeValue.length) {
+                    if (sc.nextSibling) {
+                        sc.parentNode.insertBefore(node, sc.nextSibling);
+                    } else {
+                        sc.parentNode.appendChild(node);
+                    }
+                } else {
+                    if (so > 0) {
+                        c = sc.splitText(so);
+                    } else {
+                        c = sc;
+                    }
+                    sc.parentNode.insertBefore(node, c);
+                    if (sc === ec) {
+                        ec = c;
+                        eo -= so;
+                    }
+                }
+            }
+            if (firstChild) {
+                self.setStartBefore(firstChild).setEndAfter(lastChild);
+            } else {
+                self.selectNode(node);
+            }
+            if (self.compareBoundaryPoints(_END_TO_END, self.cloneRange().setEnd(ec, eo)) >= 1) {
+                return self;
+            }
+            return self.setEnd(ec, eo);
+        },
+        surroundContents: function (node) {
+            node.appendChild(this.extractContents());
+            return this.insertNode(node).selectNode(node);
+        },
+        isControl: function () {
+            var self = this,
+                sc = self.startContainer, so = self.startOffset,
+                ec = self.endContainer, eo = self.endOffset, rng;
+            return sc.nodeType == 1 && sc === ec && so + 1 === eo && K(sc.childNodes[so]).isControl();
+        },
+        get: function (hasControlRange) {
+            var self = this, doc = self.doc, node, rng;
+            if (!_IERANGE) {
+                rng = doc.createRange();
+                try {
+                    rng.setStart(self.startContainer, self.startOffset);
+                    rng.setEnd(self.endContainer, self.endOffset);
+                } catch (e) {
+                }
+                return rng;
+            }
+            if (hasControlRange && self.isControl()) {
+                rng = doc.body.createControlRange();
+                rng.addElement(self.startContainer.childNodes[self.startOffset]);
+                return rng;
+            }
+            var range = self.cloneRange().down();
+            rng = doc.body.createTextRange();
+            rng.setEndPoint('StartToStart', _getEndRange(range.startContainer, range.startOffset));
+            rng.setEndPoint('EndToStart', _getEndRange(range.endContainer, range.endOffset));
+            return rng;
+        },
+        html: function () {
+            return K(this.cloneContents()).outer();
+        },
+        down: function () {
+            var self = this;
+
+            function downPos(node, pos, isStart) {
+                if (node.nodeType != 1) {
+                    return;
+                }
+                var children = K(node).children();
+                if (children.length === 0) {
+                    return;
+                }
+                var left, right, child, offset;
+                if (pos > 0) {
+                    left = children.eq(pos - 1);
+                }
+                if (pos < children.length) {
+                    right = children.eq(pos);
+                }
+                if (left && left.type == 3) {
+                    child = left[0];
+                    offset = child.nodeValue.length;
+                }
+                if (right && right.type == 3) {
+                    child = right[0];
+                    offset = 0;
+                }
+                if (!child) {
+                    return;
+                }
+                if (isStart) {
+                    self.setStart(child, offset);
+                } else {
+                    self.setEnd(child, offset);
+                }
+            }
+
+            downPos(self.startContainer, self.startOffset, true);
+            downPos(self.endContainer, self.endOffset, false);
+            return self;
+        },
+        up: function () {
+            var self = this;
+
+            function upPos(node, pos, isStart) {
+                if (node.nodeType != 3) {
+                    return;
+                }
+                if (pos === 0) {
+                    if (isStart) {
+                        self.setStartBefore(node);
+                    } else {
+                        self.setEndBefore(node);
+                    }
+                } else if (pos == node.nodeValue.length) {
+                    if (isStart) {
+                        self.setStartAfter(node);
+                    } else {
+                        self.setEndAfter(node);
+                    }
+                }
+            }
+
+            upPos(self.startContainer, self.startOffset, true);
+            upPos(self.endContainer, self.endOffset, false);
+            return self;
+        },
+        enlarge: function (toBlock) {
+            var self = this;
+            self.up();
+
+            function enlargePos(node, pos, isStart) {
+                var knode = K(node), parent;
+                if (knode.type == 3 || _NOSPLIT_TAG_MAP[knode.name] || !toBlock && knode.isBlock()) {
+                    return;
+                }
+                if (pos === 0) {
+                    while (!knode.prev()) {
+                        parent = knode.parent();
+                        if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
+                            break;
+                        }
+                        knode = parent;
+                    }
+                    if (isStart) {
+                        self.setStartBefore(knode[0]);
+                    } else {
+                        self.setEndBefore(knode[0]);
+                    }
+                } else if (pos == knode.children().length) {
+                    while (!knode.next()) {
+                        parent = knode.parent();
+                        if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
+                            break;
+                        }
+                        knode = parent;
+                    }
+                    if (isStart) {
+                        self.setStartAfter(knode[0]);
+                    } else {
+                        self.setEndAfter(knode[0]);
+                    }
+                }
+            }
+
+            enlargePos(self.startContainer, self.startOffset, true);
+            enlargePos(self.endContainer, self.endOffset, false);
+            return self;
+        },
+        shrink: function () {
+            var self = this, child, collapsed = self.collapsed;
+            while (self.startContainer.nodeType == 1 && (child = self.startContainer.childNodes[self.startOffset]) && child.nodeType == 1 && !K(child).isSingle()) {
+                self.setStart(child, 0);
+            }
+            if (collapsed) {
+                return self.collapse(collapsed);
+            }
+            while (self.endContainer.nodeType == 1 && self.endOffset > 0 && (child = self.endContainer.childNodes[self.endOffset - 1]) && child.nodeType == 1 && !K(child).isSingle()) {
+                self.setEnd(child, child.childNodes.length);
+            }
+            return self;
+        },
+        createBookmark: function (serialize) {
+            var self = this, doc = self.doc, endNode,
+                startNode = K('<span style="display:none;"></span>', doc)[0];
+            startNode.id = '__kindeditor_bookmark_start_' + (_BOOKMARK_ID++) + '__';
+            if (!self.collapsed) {
+                endNode = startNode.cloneNode(true);
+                endNode.id = '__kindeditor_bookmark_end_' + (_BOOKMARK_ID++) + '__';
+            }
+            if (endNode) {
+                self.cloneRange().collapse(false).insertNode(endNode).setEndBefore(endNode);
+            }
+            self.insertNode(startNode).setStartAfter(startNode);
+            return {
+                start: serialize ? '#' + startNode.id : startNode,
+                end: endNode ? (serialize ? '#' + endNode.id : endNode) : null
+            };
+        },
+        moveToBookmark: function (bookmark) {
+            var self = this, doc = self.doc,
+                start = K(bookmark.start, doc), end = bookmark.end ? K(bookmark.end, doc) : null;
+            if (!start || start.length < 1) {
+                return self;
+            }
+            self.setStartBefore(start[0]);
+            start.remove();
+            if (end && end.length > 0) {
+                self.setEndBefore(end[0]);
+                end.remove();
+            } else {
+                self.collapse(true);
+            }
+            return self;
+        },
+        dump: function () {
+            console.log('--------------------');
+            console.log(this.startContainer.nodeType == 3 ? this.startContainer.nodeValue : this.startContainer, this.startOffset);
+            console.log(this.endContainer.nodeType == 3 ? this.endContainer.nodeValue : this.endContainer, this.endOffset);
+        }
+    });
+
+    function _range(mixed) {
+        if (!mixed.nodeName) {
+            return mixed.constructor === KRange ? mixed : _toRange(mixed);
+        }
+        return new KRange(mixed);
+    }
+
+    K.RangeClass = KRange;
+    K.range = _range;
+    K.START_TO_START = _START_TO_START;
+    K.START_TO_END = _START_TO_END;
+    K.END_TO_END = _END_TO_END;
+    K.END_TO_START = _END_TO_START;
+
+
+    function _nativeCommand(doc, key, val) {
+        try {
+            doc.execCommand(key, false, val);
+        } catch (e) {
+        }
+    }
+
+    function _nativeCommandValue(doc, key) {
+        var val = '';
+        try {
+            val = doc.queryCommandValue(key);
+        } catch (e) {
+        }
+        if (typeof val !== 'string') {
+            val = '';
+        }
+        return val;
+    }
+
+    function _getSel(doc) {
+        var win = _getWin(doc);
+        return _IERANGE ? doc.selection : win.getSelection();
+    }
+
+    function _getRng(doc) {
+        var sel = _getSel(doc), rng;
+        try {
+            if (sel.rangeCount > 0) {
+                rng = sel.getRangeAt(0);
+            } else {
+                rng = sel.createRange();
+            }
+        } catch (e) {
+        }
+        if (_IERANGE && (!rng || (!rng.item && rng.parentElement().ownerDocument !== doc))) {
+            return null;
+        }
+        return rng;
+    }
+
+    function _singleKeyMap(map) {
+        var newMap = {}, arr, v;
+        _each(map, function (key, val) {
+            arr = key.split(',');
+            for (var i = 0, len = arr.length; i < len; i++) {
+                v = arr[i];
+                newMap[v] = val;
+            }
+        });
+        return newMap;
+    }
+
+    function _hasAttrOrCss(knode, map) {
+        return _hasAttrOrCssByKey(knode, map, '*') || _hasAttrOrCssByKey(knode, map);
+    }
+
+    function _hasAttrOrCssByKey(knode, map, mapKey) {
+        mapKey = mapKey || knode.name;
+        if (knode.type !== 1) {
+            return false;
+        }
+        var newMap = _singleKeyMap(map);
+        if (!newMap[mapKey]) {
+            return false;
+        }
+        var arr = newMap[mapKey].split(',');
+        for (var i = 0, len = arr.length; i < len; i++) {
+            var key = arr[i];
+            if (key === '*') {
+                return true;
+            }
+            var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
+            var method = match[1] ? 'css' : 'attr';
+            key = match[2];
+            var val = match[3] || '';
+            if (val === '' && knode[method](key) !== '') {
+                return true;
+            }
+            if (val !== '' && knode[method](key) === val) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    function _removeAttrOrCss(knode, map) {
+        if (knode.type != 1) {
+            return;
+        }
+        _removeAttrOrCssByKey(knode, map, '*');
+        _removeAttrOrCssByKey(knode, map);
+    }
+
+    function _removeAttrOrCssByKey(knode, map, mapKey) {
+        mapKey = mapKey || knode.name;
+        if (knode.type !== 1) {
+            return;
+        }
+        var newMap = _singleKeyMap(map);
+        if (!newMap[mapKey]) {
+            return;
+        }
+        var arr = newMap[mapKey].split(','), allFlag = false;
+        for (var i = 0, len = arr.length; i < len; i++) {
+            var key = arr[i];
+            if (key === '*') {
+                allFlag = true;
+                break;
+            }
+            var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
+            key = match[2];
+            if (match[1]) {
+                key = _toCamel(key);
+                if (knode[0].style[key]) {
+                    knode[0].style[key] = '';
+                }
+            } else {
+                knode.removeAttr(key);
+            }
+        }
+        if (allFlag) {
+            knode.remove(true);
+        }
+    }
+
+    function _getInnerNode(knode) {
+        var inner = knode;
+        while (inner.first()) {
+            inner = inner.first();
+        }
+        return inner;
+    }
+
+    function _isEmptyNode(knode) {
+        if (knode.type != 1 || knode.isSingle()) {
+            return false;
+        }
+        return knode.html().replace(/<[^>]+>/g, '') === '';
+    }
+
+
+    function _mergeWrapper(a, b) {
+        a = a.clone(true);
+        var lastA = _getInnerNode(a), childA = a, merged = false;
+        while (b) {
+            while (childA) {
+                if (childA.name === b.name) {
+                    _mergeAttrs(childA, b.attr(), b.css());
+                    merged = true;
+                }
+                childA = childA.first();
+            }
+            if (!merged) {
+                lastA.append(b.clone(false));
+            }
+            merged = false;
+            b = b.first();
+        }
+        return a;
+    }
+
+    function _wrapNode(knode, wrapper) {
+        wrapper = wrapper.clone(true);
+        if (knode.type == 3) {
+            _getInnerNode(wrapper).append(knode.clone(false));
+            knode.replaceWith(wrapper);
+            return wrapper;
+        }
+        var nodeWrapper = knode, child;
+        while ((child = knode.first()) && child.children().length == 1) {
+            knode = child;
+        }
+        child = knode.first();
+        var frag = knode.doc.createDocumentFragment();
+        while (child) {
+            frag.appendChild(child[0]);
+            child = child.next();
+        }
+        wrapper = _mergeWrapper(nodeWrapper, wrapper);
+        if (frag.firstChild) {
+            _getInnerNode(wrapper).append(frag);
+        }
+        nodeWrapper.replaceWith(wrapper);
+        return wrapper;
+    }
+
+    function _mergeAttrs(knode, attrs, styles) {
+        _each(attrs, function (key, val) {
+            if (key !== 'style') {
+                knode.attr(key, val);
+            }
+        });
+        _each(styles, function (key, val) {
+            knode.css(key, val);
+        });
+    }
+
+    function _inPreElement(knode) {
+        while (knode && knode.name != 'body') {
+            if (_PRE_TAG_MAP[knode.name] || knode.name == 'div' && knode.hasClass('ke-script')) {
+                return true;
+            }
+            knode = knode.parent();
+        }
+        return false;
+    }
+
+    function KCmd(range) {
+        this.init(range);
+    }
+
+    _extend(KCmd, {
+        init: function (range) {
+            var self = this, doc = range.doc;
+            self.doc = doc;
+            self.win = _getWin(doc);
+            self.sel = _getSel(doc);
+            self.range = range;
+        },
+        selection: function (forceReset) {
+            var self = this, doc = self.doc, rng = _getRng(doc);
+            self.sel = _getSel(doc);
+            if (rng) {
+                self.range = _range(rng);
+                if (K(self.range.startContainer).name == 'html') {
+                    self.range.selectNodeContents(doc.body).collapse(false);
+                }
+                return self;
+            }
+            if (forceReset) {
+                self.range.selectNodeContents(doc.body).collapse(false);
+            }
+            return self;
+        },
+        select: function (hasDummy) {
+            hasDummy = _undef(hasDummy, true);
+            var self = this, sel = self.sel, range = self.range.cloneRange().shrink(),
+                sc = range.startContainer, so = range.startOffset,
+                ec = range.endContainer, eo = range.endOffset,
+                doc = _getDoc(sc), win = self.win, rng, hasU200b = false;
+            if (hasDummy && sc.nodeType == 1 && range.collapsed) {
+                if (_IERANGE) {
+                    var dummy = K('<span>&nbsp;</span>', doc);
+                    range.insertNode(dummy[0]);
+                    rng = doc.body.createTextRange();
+                    try {
+                        rng.moveToElementText(dummy[0]);
+                    } catch (ex) {
+                    }
+                    rng.collapse(false);
+                    rng.select();
+                    dummy.remove();
+                    win.focus();
+                    return self;
+                }
+                if (_WEBKIT) {
+                    var children = sc.childNodes;
+                    if (K(sc).isInline() || so > 0 && K(children[so - 1]).isInline() || children[so] && K(children[so]).isInline()) {
+                        range.insertNode(doc.createTextNode('\u200B'));
+                        hasU200b = true;
+                    }
+                }
+            }
+            if (_IERANGE) {
+                try {
+                    rng = range.get(true);
+                    rng.select();
+                } catch (e) {
+                }
+            } else {
+                if (hasU200b) {
+                    range.collapse(false);
+                }
+                rng = range.get(true);
+                sel.removeAllRanges();
+                sel.addRange(rng);
+                if (doc !== document) {
+                    var pos = K(rng.endContainer).pos();
+                    win.scrollTo(pos.x, pos.y);
+                }
+            }
+            win.focus();
+            return self;
+        },
+        wrap: function (val) {
+            var self = this, doc = self.doc, range = self.range, wrapper;
+            wrapper = K(val, doc);
+            if (range.collapsed) {
+                range.shrink();
+                range.insertNode(wrapper[0]).selectNodeContents(wrapper[0]);
+                return self;
+            }
+            if (wrapper.isBlock()) {
+                var copyWrapper = wrapper.clone(true), child = copyWrapper;
+                while (child.first()) {
+                    child = child.first();
+                }
+                child.append(range.extractContents());
+                range.insertNode(copyWrapper[0]).selectNode(copyWrapper[0]);
+                return self;
+            }
+            range.enlarge();
+            var bookmark = range.createBookmark(), ancestor = range.commonAncestor(), isStart = false;
+            K(ancestor).scan(function (node) {
+                if (!isStart && node == bookmark.start) {
+                    isStart = true;
+                    return;
+                }
+                if (isStart) {
+                    if (node == bookmark.end) {
+                        return false;
+                    }
+                    var knode = K(node);
+                    if (_inPreElement(knode)) {
+                        return;
+                    }
+                    if (knode.type == 3 && _trim(node.nodeValue).length > 0) {
+                        var parent;
+                        while ((parent = knode.parent()) && parent.isStyle() && parent.children().length == 1) {
+                            knode = parent;
+                        }
+                        _wrapNode(knode, wrapper);
+                    }
+                }
+            });
+            range.moveToBookmark(bookmark);
+            return self;
+        },
+        split: function (isStart, map) {
+            var range = this.range, doc = range.doc;
+            var tempRange = range.cloneRange().collapse(isStart);
+            var node = tempRange.startContainer, pos = tempRange.startOffset,
+                parent = node.nodeType == 3 ? node.parentNode : node,
+                needSplit = false, knode;
+            while (parent && parent.parentNode) {
+                knode = K(parent);
+                if (map) {
+                    if (!knode.isStyle()) {
+                        break;
+                    }
+                    if (!_hasAttrOrCss(knode, map)) {
+                        break;
+                    }
+                } else {
+                    if (_NOSPLIT_TAG_MAP[knode.name]) {
+                        break;
+                    }
+                }
+                needSplit = true;
+                parent = parent.parentNode;
+            }
+            if (needSplit) {
+                var dummy = doc.createElement('span');
+                range.cloneRange().collapse(!isStart).insertNode(dummy);
+                if (isStart) {
+                    tempRange.setStartBefore(parent.firstChild).setEnd(node, pos);
+                } else {
+                    tempRange.setStart(node, pos).setEndAfter(parent.lastChild);
+                }
+                var frag = tempRange.extractContents(),
+                    first = frag.firstChild, last = frag.lastChild;
+                if (isStart) {
+                    tempRange.insertNode(frag);
+                    range.setStartAfter(last).setEndBefore(dummy);
+                } else {
+                    parent.appendChild(frag);
+                    range.setStartBefore(dummy).setEndBefore(first);
+                }
+                var dummyParent = dummy.parentNode;
+                if (dummyParent == range.endContainer) {
+                    var prev = K(dummy).prev(), next = K(dummy).next();
+                    if (prev && next && prev.type == 3 && next.type == 3) {
+                        range.setEnd(prev[0], prev[0].nodeValue.length);
+                    } else if (!isStart) {
+                        range.setEnd(range.endContainer, range.endOffset - 1);
+                    }
+                }
+                dummyParent.removeChild(dummy);
+            }
+            return this;
+        },
+        remove: function (map) {
+            var self = this, doc = self.doc, range = self.range;
+            range.enlarge();
+            if (range.startOffset === 0) {
+                var ksc = K(range.startContainer), parent;
+                while ((parent = ksc.parent()) && parent.isStyle() && parent.children().length == 1) {
+                    ksc = parent;
+                }
+                range.setStart(ksc[0], 0);
+                ksc = K(range.startContainer);
+                if (ksc.isBlock()) {
+                    _removeAttrOrCss(ksc, map);
+                }
+                var kscp = ksc.parent();
+                if (kscp && kscp.isBlock()) {
+                    _removeAttrOrCss(kscp, map);
+                }
+            }
+            var sc, so;
+            if (range.collapsed) {
+                self.split(true, map);
+                sc = range.startContainer;
+                so = range.startOffset;
+                if (so > 0) {
+                    var sb = K(sc.childNodes[so - 1]);
+                    if (sb && _isEmptyNode(sb)) {
+                        sb.remove();
+                        range.setStart(sc, so - 1);
+                    }
+                }
+                var sa = K(sc.childNodes[so]);
+                if (sa && _isEmptyNode(sa)) {
+                    sa.remove();
+                }
+                if (_isEmptyNode(sc)) {
+                    range.startBefore(sc);
+                    sc.remove();
+                }
+                range.collapse(true);
+                return self;
+            }
+            self.split(true, map);
+            self.split(false, map);
+            var startDummy = doc.createElement('span'), endDummy = doc.createElement('span');
+            range.cloneRange().collapse(false).insertNode(endDummy);
+            range.cloneRange().collapse(true).insertNode(startDummy);
+            var nodeList = [], cmpStart = false;
+            K(range.commonAncestor()).scan(function (node) {
+                if (!cmpStart && node == startDummy) {
+                    cmpStart = true;
+                    return;
+                }
+                if (node == endDummy) {
+                    return false;
+                }
+                if (cmpStart) {
+                    nodeList.push(node);
+                }
+            });
+            K(startDummy).remove();
+            K(endDummy).remove();
+            sc = range.startContainer;
+            so = range.startOffset;
+            var ec = range.endContainer, eo = range.endOffset;
+            if (so > 0) {
+                var startBefore = K(sc.childNodes[so - 1]);
+                if (startBefore && _isEmptyNode(startBefore)) {
+                    startBefore.remove();
+                    range.setStart(sc, so - 1);
+                    if (sc == ec) {
+                        range.setEnd(ec, eo - 1);
+                    }
+                }
+                var startAfter = K(sc.childNodes[so]);
+                if (startAfter && _isEmptyNode(startAfter)) {
+                    startAfter.remove();
+                    if (sc == ec) {
+                        range.setEnd(ec, eo - 1);
+                    }
+                }
+            }
+            var endAfter = K(ec.childNodes[range.endOffset]);
+            if (endAfter && _isEmptyNode(endAfter)) {
+                endAfter.remove();
+            }
+            var bookmark = range.createBookmark(true);
+            _each(nodeList, function (i, node) {
+                _removeAttrOrCss(K(node), map);
+            });
+            range.moveToBookmark(bookmark);
+            return self;
+        },
+        commonNode: function (map) {
+            var range = this.range;
+            var ec = range.endContainer, eo = range.endOffset,
+                node = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
+
+            function find(node) {
+                var child = node, parent = node;
+                while (parent) {
+                    if (_hasAttrOrCss(K(parent), map)) {
+                        return K(parent);
+                    }
+                    parent = parent.parentNode;
+                }
+                while (child && (child = child.lastChild)) {
+                    if (_hasAttrOrCss(K(child), map)) {
+                        return K(child);
+                    }
+                }
+                return null;
+            }
+
+            var cNode = find(node);
+            if (cNode) {
+                return cNode;
+            }
+            if (node.nodeType == 1 || (ec.nodeType == 3 && eo === 0)) {
+                var prev = K(node).prev();
+                if (prev) {
+                    return find(prev);
+                }
+            }
+            return null;
+        },
+        commonAncestor: function (tagName) {
+            var range = this.range,
+                sc = range.startContainer, so = range.startOffset,
+                ec = range.endContainer, eo = range.endOffset,
+                startNode = (sc.nodeType == 3 || so === 0) ? sc : sc.childNodes[so - 1],
+                endNode = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
+
+            function find(node) {
+                while (node) {
+                    if (node.nodeType == 1) {
+                        if (node.tagName.toLowerCase() === tagName) {
+                            return node;
+                        }
+                    }
+                    node = node.parentNode;
+                }
+                return null;
+            }
+
+            var start = find(startNode), end = find(endNode);
+            if (start && end && start === end) {
+                return K(start);
+            }
+            return null;
+        },
+        state: function (key) {
+            var self = this, doc = self.doc, bool = false;
+            try {
+                bool = doc.queryCommandState(key);
+            } catch (e) {
+            }
+            return bool;
+        },
+        val: function (key) {
+            var self = this, doc = self.doc, range = self.range;
+
+            function lc(val) {
+                return val.toLowerCase();
+            }
+
+            key = lc(key);
+            var val = '', knode;
+            if (key === 'fontfamily' || key === 'fontname') {
+                val = _nativeCommandValue(doc, 'fontname');
+                val = val.replace(/['"]/g, '');
+                return lc(val);
+            }
+            if (key === 'formatblock') {
+                val = _nativeCommandValue(doc, key);
+                if (val === '') {
+                    knode = self.commonNode({'h1,h2,h3,h4,h5,h6,p,div,pre,address': '*'});
+                    if (knode) {
+                        val = knode.name;
+                    }
+                }
+                if (val === 'Normal') {
+                    val = 'p';
+                }
+                return lc(val);
+            }
+            if (key === 'fontsize') {
+                knode = self.commonNode({'*': '.font-size'});
+                if (knode) {
+                    val = knode.css('font-size');
+                }
+                return lc(val);
+            }
+            if (key === 'forecolor') {
+                knode = self.commonNode({'*': '.color'});
+                if (knode) {
+                    val = knode.css('color');
+                }
+                val = _toHex(val);
+                if (val === '') {
+                    val = 'default';
+                }
+                return lc(val);
+            }
+            if (key === 'hilitecolor') {
+                knode = self.commonNode({'*': '.background-color'});
+                if (knode) {
+                    val = knode.css('background-color');
+                }
+                val = _toHex(val);
+                if (val === '') {
+                    val = 'default';
+                }
+                return lc(val);
+            }
+            return val;
+        },
+        toggle: function (wrapper, map) {
+            var self = this;
+            if (self.commonNode(map)) {
+                self.remove(map);
+            } else {
+                self.wrap(wrapper);
+            }
+            return self.select();
+        },
+        bold: function () {
+            return this.toggle('<strong></strong>', {
+                span: '.font-weight=bold',
+                strong: '*',
+                b: '*'
+            });
+        },
+        italic: function () {
+            return this.toggle('<em></em>', {
+                span: '.font-style=italic',
+                em: '*',
+                i: '*'
+            });
+        },
+        underline: function () {
+            return this.toggle('<u></u>', {
+                span: '.text-decoration=underline',
+                u: '*'
+            });
+        },
+        strikethrough: function () {
+            return this.toggle('<s></s>', {
+                span: '.text-decoration=line-through',
+                s: '*'
+            });
+        },
+        forecolor: function (val) {
+            return this.wrap('<span style="color:' + val + ';"></span>').select();
+        },
+        hilitecolor: function (val) {
+            return this.wrap('<span style="background-color:' + val + ';"></span>').select();
+        },
+        fontsize: function (val) {
+            return this.wrap('<span style="font-size:' + val + ';"></span>').select();
+        },
+        fontname: function (val) {
+            return this.fontfamily(val);
+        },
+        fontfamily: function (val) {
+            return this.wrap('<span style="font-family:' + val + ';"></span>').select();
+        },
+        removeformat: function () {
+            var map = {
+                    '*': '.font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent'
+                },
+                tags = _STYLE_TAG_MAP;
+            _each(tags, function (key, val) {
+                map[key] = '*';
+            });
+            this.remove(map);
+            return this.select();
+        },
+        inserthtml: function (val, quickMode) {
+            var self = this, range = self.range;
+            if (val === '') {
+                return self;
+            }
+
+            function pasteHtml(range, val) {
+                val = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + val;
+                var rng = range.get();
+                if (rng.item) {
+                    rng.item(0).outerHTML = val;
+                } else {
+                    rng.pasteHTML(val);
+                }
+                var temp = range.doc.getElementById('__kindeditor_temp_tag__');
+                temp.parentNode.removeChild(temp);
+                var newRange = _toRange(rng);
+                range.setEnd(newRange.endContainer, newRange.endOffset);
+                range.collapse(false);
+                self.select(false);
+            }
+
+            function insertHtml(range, val) {
+                var doc = range.doc,
+                    frag = doc.createDocumentFragment();
+                K('@' + val, doc).each(function () {
+                    frag.appendChild(this);
+                });
+                range.deleteContents();
+                range.insertNode(frag);
+                range.collapse(false);
+                self.select(false);
+            }
+
+            if (_IERANGE && quickMode) {
+                try {
+                    pasteHtml(range, val);
+                } catch (e) {
+                    insertHtml(range, val);
+                }
+                return self;
+            }
+            insertHtml(range, val);
+            return self;
+        },
+        hr: function () {
+            return this.inserthtml('<hr />');
+        },
+        print: function () {
+            this.win.print();
+            return this;
+        },
+        insertimage: function (url, title, width, height, border, align) {
+            title = _undef(title, '');
+            border = _undef(border, 0);
+            var html = '<img src="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
+            if (width) {
+                html += 'width="' + _escape(width) + '" ';
+            }
+            if (height) {
+                html += 'height="' + _escape(height) + '" ';
+            }
+            if (title) {
+                html += 'title="' + _escape(title) + '" ';
+            }
+            if (align) {
+                html += 'align="' + _escape(align) + '" ';
+            }
+            html += 'alt="' + _escape(title) + '" ';
+            html += '/>';
+            return this.inserthtml(html);
+        },
+        createlink: function (url, type) {
+            var self = this, doc = self.doc, range = self.range;
+            self.select();
+            var a = self.commonNode({a: '*'});
+            if (a && !range.isControl()) {
+                range.selectNode(a.get());
+                self.select();
+            }
+            var html = '<a href="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
+            if (type) {
+                html += ' target="' + _escape(type) + '"';
+            }
+            if (range.collapsed) {
+                html += '>' + _escape(url) + '</a>';
+                return self.inserthtml(html);
+            }
+            if (range.isControl()) {
+                var node = K(range.startContainer.childNodes[range.startOffset]);
+                html += '></a>';
+                node.after(K(html, doc));
+                node.next().append(node);
+                range.selectNode(node[0]);
+                return self.select();
+            }
+
+            function setAttr(node, url, type) {
+                K(node).attr('href', url).attr('data-ke-src', url);
+                if (type) {
+                    K(node).attr('target', type);
+                } else {
+                    K(node).removeAttr('target');
+                }
+            }
+
+            var sc = range.startContainer, so = range.startOffset,
+                ec = range.endContainer, eo = range.endOffset;
+            if (sc.nodeType == 1 && sc === ec && so + 1 === eo) {
+                var child = sc.childNodes[so];
+                if (child.nodeName.toLowerCase() == 'a') {
+                    setAttr(child, url, type);
+                    return self;
+                }
+            }
+            _nativeCommand(doc, 'createlink', '__kindeditor_temp_url__');
+            K('a[href="__kindeditor_temp_url__"]', doc).each(function () {
+                setAttr(this, url, type);
+            });
+            return self;
+        },
+        unlink: function () {
+            var self = this, doc = self.doc, range = self.range;
+            self.select();
+            if (range.collapsed) {
+                var a = self.commonNode({a: '*'});
+                if (a) {
+                    range.selectNode(a.get());
+                    self.select();
+                }
+                _nativeCommand(doc, 'unlink', null);
+                if (_WEBKIT && K(range.startContainer).name === 'img') {
+                    var parent = K(range.startContainer).parent();
+                    if (parent.name === 'a') {
+                        parent.remove(true);
+                    }
+                }
+            } else {
+                _nativeCommand(doc, 'unlink', null);
+            }
+            return self;
+        }
+    });
+    _each(('formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
+        'insertunorderedlist,indent,outdent,subscript,superscript').split(','), function (i, name) {
+        KCmd.prototype[name] = function (val) {
+            var self = this;
+            self.select();
+            _nativeCommand(self.doc, name, val);
+            if (_IERANGE && _inArray(name, 'justifyleft,justifycenter,justifyright,justifyfull'.split(',')) >= 0) {
+                self.selection();
+            }
+            if (!_IERANGE || _inArray(name, 'formatblock,selectall,insertorderedlist,insertunorderedlist'.split(',')) >= 0) {
+                self.selection();
+            }
+            return self;
+        };
+    });
+    _each('cut,copy,paste'.split(','), function (i, name) {
+        KCmd.prototype[name] = function () {
+            var self = this;
+            if (!self.doc.queryCommandSupported(name)) {
+                throw 'not supported';
+            }
+            self.select();
+            _nativeCommand(self.doc, name, null);
+            return self;
+        };
+    });
+
+    function _cmd(mixed) {
+        if (mixed.nodeName) {
+            var doc = _getDoc(mixed);
+            mixed = _range(doc).selectNodeContents(doc.body).collapse(false);
+        }
+        return new KCmd(mixed);
+    }
+
+    K.CmdClass = KCmd;
+    K.cmd = _cmd;
+
+
+    function _drag(options) {
+        var moveEl = options.moveEl,
+            moveFn = options.moveFn,
+            clickEl = options.clickEl || moveEl,
+            beforeDrag = options.beforeDrag,
+            iframeFix = options.iframeFix === undefined ? true : options.iframeFix;
+        var docs = [document];
+        if (iframeFix) {
+            K('iframe').each(function () {
+                var src = _formatUrl(this.src || '', 'absolute');
+                if (/^https?:\/\//.test(src)) {
+                    return;
+                }
+                var doc;
+                try {
+                    doc = _iframeDoc(this);
+                } catch (e) {
+                }
+                if (doc) {
+                    var pos = K(this).pos();
+                    K(doc).data('pos-x', pos.x);
+                    K(doc).data('pos-y', pos.y);
+                    docs.push(doc);
+                }
+            });
+        }
+        clickEl.mousedown(function (e) {
+            if (e.button !== 0 && e.button !== 1) {
+                return;
+            }
+            e.stopPropagation();
+            var self = clickEl.get(),
+                x = _removeUnit(moveEl.css('left')),
+                y = _removeUnit(moveEl.css('top')),
+                width = moveEl.width(),
+                height = moveEl.height(),
+                pageX = e.pageX,
+                pageY = e.pageY;
+            if (beforeDrag) {
+                beforeDrag();
+            }
+
+            function moveListener(e) {
+                e.preventDefault();
+                var kdoc = K(_getDoc(e.target));
+                var diffX = _round((kdoc.data('pos-x') || 0) + e.pageX - pageX);
+                var diffY = _round((kdoc.data('pos-y') || 0) + e.pageY - pageY);
+                moveFn.call(clickEl, x, y, width, height, diffX, diffY);
+            }
+
+            function selectListener(e) {
+                e.preventDefault();
+            }
+
+            function upListener(e) {
+                e.preventDefault();
+                K(docs).unbind('mousemove', moveListener)
+                    .unbind('mouseup', upListener)
+                    .unbind('selectstart', selectListener);
+                if (self.releaseCapture) {
+                    self.releaseCapture();
+                }
+            }
+
+            K(docs).mousemove(moveListener)
+                .mouseup(upListener)
+                .bind('selectstart', selectListener);
+            if (self.setCapture) {
+                self.setCapture();
+            }
+        });
+    }
+
+
+    function KWidget(options) {
+        this.init(options);
+    }
+
+    _extend(KWidget, {
+        init: function (options) {
+            var self = this;
+            self.name = options.name || '';
+            self.doc = options.doc || document;
+            self.win = _getWin(self.doc);
+            self.x = _addUnit(options.x);
+            self.y = _addUnit(options.y);
+            self.z = options.z;
+            self.width = _addUnit(options.width);
+            self.height = _addUnit(options.height);
+            self.div = K('<div style="display:block;"></div>');
+            self.options = options;
+            self._alignEl = options.alignEl;
+            if (self.width) {
+                self.div.css('width', self.width);
+            }
+            if (self.height) {
+                self.div.css('height', self.height);
+            }
+            if (self.z) {
+                self.div.css({
+                    position: 'absolute',
+                    left: self.x,
+                    top: self.y,
+                    'z-index': self.z
+                });
+            }
+            if (self.z && (self.x === undefined || self.y === undefined)) {
+                self.autoPos(self.width, self.height);
+            }
+            if (options.cls) {
+                self.div.addClass(options.cls);
+            }
+            if (options.shadowMode) {
+                self.div.addClass('ke-shadow');
+            }
+            if (options.css) {
+                self.div.css(options.css);
+            }
+            if (options.src) {
+                K(options.src).replaceWith(self.div);
+            } else {
+                K(self.doc.body).append(self.div);
+            }
+            if (options.html) {
+                self.div.html(options.html);
+            }
+            if (options.autoScroll) {
+                if (_IE && _V < 7 || _QUIRKS) {
+                    var scrollPos = _getScrollPos();
+                    K(self.win).bind('scroll', function (e) {
+                        var pos = _getScrollPos(),
+                            diffX = pos.x - scrollPos.x,
+                            diffY = pos.y - scrollPos.y;
+                        self.pos(_removeUnit(self.x) + diffX, _removeUnit(self.y) + diffY, false);
+                    });
+                } else {
+                    self.div.css('position', 'fixed');
+                }
+            }
+        },
+        pos: function (x, y, updateProp) {
+            var self = this;
+            updateProp = _undef(updateProp, true);
+            if (x !== null) {
+                x = x < 0 ? 0 : _addUnit(x);
+                self.div.css('left', x);
+                if (updateProp) {
+                    self.x = x;
+                }
+            }
+            if (y !== null) {
+                y = y < 0 ? 0 : _addUnit(y);
+                self.div.css('top', y);
+                if (updateProp) {
+                    self.y = y;
+                }
+            }
+            return self;
+        },
+        autoPos: function (width, height) {
+            var x, y, self = this,
+                w = _removeUnit(width) || 0,
+                h = _removeUnit(height) || 0,
+                scrollPos = _getScrollPos();
+            if (self._alignEl) {
+                var knode = K(self._alignEl),
+                    pos = knode.pos(),
+                    diffX = _round(knode[0].clientWidth / 2 - w / 2),
+                    diffY = _round(knode[0].clientHeight / 2 - h / 2);
+                x = diffX < 0 ? pos.x : pos.x + diffX;
+            } else {
+                var docEl = _docElement(self.doc);
+                x = _round(scrollPos.x + (docEl.clientWidth - w) / 2);
+                y = _round(scrollPos.y + (docEl.clientHeight - h) / 2);
+            }
+            if (K.options.dialogOffset > 0) {
+                y = scrollPos.y + 20;
+            }
+            if (!(_IE && _V < 7 || _QUIRKS)) {
+                x -= scrollPos.x;
+                y -= scrollPos.y;
+            }
+            return self.pos(x, y);
+        },
+        remove: function () {
+            var self = this;
+            if (_IE && _V < 7 || _QUIRKS) {
+                K(self.win).unbind('scroll');
+            }
+            self.div.remove();
+            _each(self, function (i) {
+                self[i] = null;
+            });
+            return this;
+        },
+        show: function () {
+            this.div.show();
+            return this;
+        },
+        hide: function () {
+            this.div.hide();
+            return this;
+        },
+        draggable: function (options) {
+            var self = this;
+            options = options || {};
+            options.moveEl = self.div;
+            options.moveFn = function (x, y, width, height, diffX, diffY) {
+                if ((x = x + diffX) < 0) {
+                    x = 0;
+                }
+                if ((y = y + diffY) < 0) {
+                    y = 0;
+                }
+                self.pos(x, y);
+            };
+            _drag(options);
+            return self;
+        }
+    });
+
+    function _widget(options) {
+        return new KWidget(options);
+    }
+
+    K.WidgetClass = KWidget;
+    K.widget = _widget;
+
+
+    function _iframeDoc(iframe) {
+        iframe = _get(iframe);
+        return iframe.contentDocument || iframe.contentWindow.document;
+    }
+
+    var html, _direction = '';
+    if ((html = document.getElementsByTagName('html'))) {
+        _direction = html[0].dir;
+    }
+
+    function _getInitHtml(options) {
+        var themesPath = _undef(options.themesPath, ''),
+            bodyClass = options.bodyClass,
+            cssPath = options.cssPath,
+            jsPath = options.jsPath,
+            cssData = options.cssData;
+        var arr = [
+            (_direction === '' ? '<html>' : '<html dir="' + _direction + '">'),
+            '<head><meta charset="utf-8" /><title></title>',
+            '<style>',
+            'html {margin:0;padding:0;}',
+            'body {margin:0;padding:5px;}',
+            'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
+            'body, p, div {word-wrap: break-word;}',
+            'p {margin:5px 0;}',
+            'table {border-collapse:collapse;}',
+            'img {border:0;}',
+            'noscript {display:none;}',
+            'table.ke-zeroborder td {border:1px dotted #AAA;}',
+            'img.ke-flash {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + themesPath + 'common/flash.svg);',
+            '	*background-image:url(' + themesPath + 'common/flash.png);',
+            '	background-size:64px 64px;',
+            '	background-position:center center;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-rm {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + themesPath + 'common/rm.gif);',
+            '	background-position:center center;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-media {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + themesPath + 'common/play.svg);',
+            '	*background-image:url(' + themesPath + 'common/play.png);',
+            '	background-position:center center;',
+            '	background-size:64px 64px;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-anchor {',
+            '	border:1px dashed #666;',
+            '	width:16px;',
+            '	height:16px;',
+            '}',
+            '.ke-script, .ke-noscript, .ke-display-none {',
+            '	display:none;',
+            '	font-size:0;',
+            '	width:0;',
+            '	height:0;',
+            '}',
+            '.ke-pagebreak {',
+            '	border:1px dotted #AAA;',
+            '	font-size:0;',
+            '	height:2px;',
+            '}',
+        ];
+        if (options.showHelpGrid) {
+            arr.push('p,ul,ol,li,div{border: 1px dashed #c1c1c1;}');
+            arr.push('li{margin:5px 0px}');
+            arr.push('div,ul,ol{margin-bottom:10px}');
+        }
+        arr.push('</style>');
+        if (!_isArray(cssPath)) {
+            cssPath = [cssPath];
+        }
+        if (_inArray(K.basePath + 'themes/app.css', cssPath) < 0) {
+            cssPath.push(K.basePath + 'themes/app.css');
+        }
+        _each(cssPath, function (i, path) {
+            if (path) {
+                arr.push('<link href="' + path + '" rel="stylesheet" />');
+            }
+        });
+        if (cssData) {
+            arr.push('<style>' + cssData + '</style>');
+        }
+        arr.push('</head><body ' + (bodyClass ? 'class="' + bodyClass + '"' : '') + '>');
+        if (!_isArray(jsPath)) {
+            jsPath = [jsPath];
+        }
+        _each(jsPath, function (i, path) {
+            if (path) {
+                arr.push('<script type="text/javascript" src="' + path + '"></script>');
+            }
+        });
+        arr.push('</body></html>');
+        return arr.join('\n');
+    }
+
+    function _elementVal(knode, val) {
+        if (knode.hasVal()) {
+            if (val === undefined) {
+                var html = knode.val();
+                html = html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig, '');
+                return html;
+            }
+            return knode.val(val);
+        }
+        return knode.html(val);
+    }
+
+
+    function KEdit(options) {
+        this.init(options);
+    }
+
+    _extend(KEdit, KWidget, {
+        init: function (options) {
+            var self = this;
+            KEdit.parent.init.call(self, options);
+            self.srcElement = K(options.srcElement);
+            self.div.addClass('ke-edit');
+            self.designMode = _undef(options.designMode, true);
+            self.beforeGetHtml = options.beforeGetHtml;
+            self.beforeSetHtml = options.beforeSetHtml;
+            self.afterSetHtml = options.afterSetHtml;
+            var isDocumentDomain = location.protocol != 'res:' && location.host.replace(/:\d+/, '') !== document.domain,
+                srcScript = ('document.open();' +
+                    (isDocumentDomain ? 'document.domain="' + document.domain + '";' : '') +
+                    'document.close();'),
+                iframeSrc = _IE ? ' src="javascript:void(function(){' + encodeURIComponent(srcScript) + '}())"' : '';
+            self.iframe = K('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"' + iframeSrc + '></iframe>').css('width', '100%');
+            self.textarea = K('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css('width', '100%');
+            self.tabIndex = isNaN(parseInt(options.tabIndex, 10)) ? self.srcElement.attr('tabindex') : parseInt(options.tabIndex, 10);
+            self.iframe.attr('tabindex', self.tabIndex);
+            self.textarea.attr('tabindex', self.tabIndex);
+            if (self.width) {
+                self.setWidth(self.width);
+            }
+            if (self.height) {
+                self.setHeight(self.height);
+            }
+            if (self.designMode) {
+                self.textarea.hide();
+            } else {
+                self.iframe.hide();
+            }
+
+            function ready() {
+                var doc = _iframeDoc(self.iframe);
+                doc.open();
+                if (isDocumentDomain) {
+                    doc.domain = document.domain;
+                }
+                doc.write(_getInitHtml(self.options));
+                doc.close();
+                self.win = self.iframe[0].contentWindow;
+                self.doc = doc;
+                var cmd = _cmd(doc);
+                self.afterChange(function (e) {
+                    cmd.selection();
+                });
+                if (_WEBKIT) {
+                    K(doc).click(function (e) {
+                        if (K(e.target).name === 'img') {
+                            cmd.selection(true);
+                            cmd.range.selectNode(e.target);
+                            cmd.select();
+                        }
+                    });
+                }
+                if (_IE) {
+                    self._mousedownHandler = function () {
+                        var newRange = cmd.range.cloneRange();
+                        newRange.shrink();
+                        if (newRange.isControl()) {
+                            self.blur();
+                        }
+                    };
+                    K(document).mousedown(self._mousedownHandler);
+                    K(doc).keydown(function (e) {
+                        if (e.which == 8) {
+                            cmd.selection();
+                            var rng = cmd.range;
+                            if (rng.isControl()) {
+                                rng.collapse(true);
+                                K(rng.startContainer.childNodes[rng.startOffset]).remove();
+                                e.preventDefault();
+                            }
+                        }
+                    });
+                }
+                self.cmd = cmd;
+                self.html(_elementVal(self.srcElement));
+                if (_IE) {
+                    doc.body.disabled = true;
+                    doc.body.contentEditable = true;
+                    doc.body.removeAttribute('disabled');
+                } else {
+                    doc.designMode = 'on';
+                }
+                if (options.afterCreate) {
+                    options.afterCreate.call(self);
+                }
+            }
+
+            if (isDocumentDomain) {
+                self.iframe.bind('load', function (e) {
+                    self.iframe.unbind('load');
+                    if (_IE) {
+                        ready();
+                    } else {
+                        setTimeout(ready, 0);
+                    }
+                });
+            }
+            self.div.append(self.iframe);
+            self.div.append(self.textarea);
+            self.srcElement.hide();
+            !isDocumentDomain && ready();
+        },
+        setWidth: function (val) {
+            var self = this;
+            val = _addUnit(val);
+            self.width = val;
+            self.div.css('width', val);
+            return self;
+        },
+        setHeight: function (val) {
+            var self = this;
+            val = _addUnit(val);
+            self.height = val;
+            self.div.css('height', val);
+            self.iframe.css('height', val);
+            if ((_IE && _V < 8) || _QUIRKS) {
+                val = _addUnit(_removeUnit(val) - 2);
+            }
+            self.textarea.css('height', val);
+            return self;
+        },
+        remove: function () {
+            var self = this, doc = self.doc;
+            K(doc.body).unbind();
+            K(doc).unbind();
+            K(self.win).unbind();
+            if (self._mousedownHandler) {
+                K(document).unbind('mousedown', self._mousedownHandler);
+            }
+            _elementVal(self.srcElement, self.html());
+            self.srcElement.show();
+            self.iframe.unbind();
+            self.textarea.unbind();
+            KEdit.parent.remove.call(self);
+        },
+        html: function (val, isFull) {
+            var self = this, doc = self.doc;
+            if (self.designMode) {
+                var body = doc.body;
+                if (val === undefined) {
+                    if (isFull) {
+                        val = '<!doctype html><html>' + body.parentNode.innerHTML + '</html>';
+                    } else {
+                        val = body.innerHTML;
+                    }
+                    if (self.beforeGetHtml) {
+                        val = self.beforeGetHtml(val);
+                    }
+                    if (_GECKO && val == '<br />') {
+                        val = '';
+                    }
+                    return val;
+                }
+                if (self.beforeSetHtml) {
+                    val = self.beforeSetHtml(val);
+                }
+                if (_IE && _V >= 9) {
+                    val = val.replace(/(<.*?checked=")checked(".*>)/ig, '$1$2');
+                }
+                K(body).html(val);
+                if (self.afterSetHtml) {
+                    self.afterSetHtml();
+                }
+                return self;
+            }
+            if (val === undefined) {
+                return self.textarea.val();
+            }
+            self.textarea.val(val);
+            return self;
+        },
+        design: function (bool) {
+            var self = this, val;
+            if (bool === undefined ? !self.designMode : bool) {
+                if (!self.designMode) {
+                    val = self.html();
+                    self.designMode = true;
+                    self.textarea.hide();
+                    self.html(val);
+                    var iframe = self.iframe;
+                    var height = _removeUnit(self.height);
+                    iframe.height(height - 2);
+                    iframe.show();
+                    setTimeout(function () {
+                        iframe.height(height);
+                    }, 0);
+                }
+            } else {
+                if (self.designMode) {
+                    val = self.html();
+                    self.designMode = false;
+                    self.html(val);
+                    self.iframe.hide();
+                    self.textarea.show();
+                }
+            }
+            return self.focus();
+        },
+        focus: function () {
+            var self = this;
+            self.designMode ? self.win.focus() : self.textarea[0].focus();
+            return self;
+        },
+        blur: function () {
+            var self = this;
+            if (_IE) {
+                var input = K('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />', self.div);
+                self.div.append(input);
+                input[0].focus();
+                input.remove();
+            } else {
+                self.designMode ? self.win.blur() : self.textarea[0].blur();
+            }
+            return self;
+        },
+        afterChange: function (fn) {
+            var self = this, doc = self.doc, body = doc.body;
+            K(doc).keyup(function (e) {
+                if (!e.ctrlKey && !e.altKey && _CHANGE_KEY_MAP[e.which]) {
+                    fn(e);
+                }
+            });
+            K(doc).mouseup(fn).contextmenu(fn);
+            K(self.win).blur(fn);
+
+            function timeoutHandler(e) {
+                setTimeout(function () {
+                    fn(e);
+                }, 1);
+            }
+
+            K(body).bind('paste', timeoutHandler);
+            K(body).bind('cut', timeoutHandler);
+            return self;
+        }
+    });
+
+    function _edit(options) {
+        return new KEdit(options);
+    }
+
+    K.EditClass = KEdit;
+    K.edit = _edit;
+    K.iframeDoc = _iframeDoc;
+
+
+    function _selectToolbar(name, fn) {
+        var self = this,
+            knode = self.get(name);
+        if (knode) {
+            if (knode.hasClass('ke-disabled')) {
+                return;
+            }
+            fn(knode);
+        }
+    }
+
+
+    function KToolbar(options) {
+        this.init(options);
+    }
+
+    _extend(KToolbar, KWidget, {
+        init: function (options) {
+            var self = this;
+            KToolbar.parent.init.call(self, options);
+            self.disableMode = _undef(options.disableMode, false);
+            self.noDisableItemMap = _toMap(_undef(options.noDisableItems, []));
+            self._itemMap = {};
+            self.div.addClass('ke-toolbar').bind('contextmenu,mousedown,mousemove', function (e) {
+                e.preventDefault();
+            }).attr('unselectable', 'on');
+
+            function find(target) {
+                var knode = K(target);
+                if (knode.hasClass('ke-outline')) {
+                    return knode;
+                }
+                if (knode.hasClass('ke-toolbar-icon')) {
+                    return knode.parent();
+                }
+            }
+
+            function hover(e, method) {
+                var knode = find(e.target);
+                if (knode) {
+                    if (knode.hasClass('ke-disabled')) {
+                        return;
+                    }
+                    if (knode.hasClass('ke-selected')) {
+                        return;
+                    }
+                    knode[method]('ke-on');
+                }
+            }
+
+            self.div.mouseover(function (e) {
+                hover(e, 'addClass');
+            })
+                .mouseout(function (e) {
+                    hover(e, 'removeClass');
+                })
+                .click(function (e) {
+                    var knode = find(e.target);
+                    if (knode) {
+                        if (knode.hasClass('ke-disabled')) {
+                            return;
+                        }
+                        self.options.click.call(this, e, knode.attr('data-name'));
+                    }
+                });
+        },
+        get: function (name) {
+            if (this._itemMap[name]) {
+                return this._itemMap[name];
+            }
+            return (this._itemMap[name] = K('span.ke-icon-' + name, this.div).parent());
+        },
+        select: function (name) {
+            _selectToolbar.call(this, name, function (knode) {
+                knode.addClass('ke-selected');
+            });
+            return self;
+        },
+        unselect: function (name) {
+            _selectToolbar.call(this, name, function (knode) {
+                knode.removeClass('ke-selected').removeClass('ke-on');
+            });
+            return self;
+        },
+        enable: function (name) {
+            var self = this,
+                knode = name.get ? name : self.get(name);
+            if (knode) {
+                knode.removeClass('ke-disabled');
+                knode.opacity(1);
+            }
+            return self;
+        },
+        disable: function (name) {
+            var self = this,
+                knode = name.get ? name : self.get(name);
+            if (knode) {
+                knode.removeClass('ke-selected').addClass('ke-disabled');
+                knode.opacity(0.5);
+            }
+            return self;
+        },
+        disableAll: function (bool, noDisableItems) {
+            var self = this, map = self.noDisableItemMap, item;
+            if (noDisableItems) {
+                map = _toMap(noDisableItems);
+            }
+            if (bool === undefined ? !self.disableMode : bool) {
+                K('span.ke-outline', self.div).each(function () {
+                    var knode = K(this),
+                        name = knode[0].getAttribute('data-name', 2);
+                    if (!map[name]) {
+                        self.disable(knode);
+                    }
+                });
+                self.disableMode = true;
+            } else {
+                K('span.ke-outline', self.div).each(function () {
+                    var knode = K(this),
+                        name = knode[0].getAttribute('data-name', 2);
+                    if (!map[name]) {
+                        self.enable(knode);
+                    }
+                });
+                self.disableMode = false;
+            }
+            return self;
+        }
+    });
+
+    function _toolbar(options) {
+        return new KToolbar(options);
+    }
+
+    K.ToolbarClass = KToolbar;
+    K.toolbar = _toolbar;
+
+
+    function KMenu(options) {
+        this.init(options);
+    }
+
+    _extend(KMenu, KWidget, {
+        init: function (options) {
+            var self = this;
+            options.z = options.z || 811213;
+            KMenu.parent.init.call(self, options);
+            self.centerLineMode = _undef(options.centerLineMode, true);
+            self.div.addClass('ke-menu ke-menu-' + options.themeType).bind('click,mousedown', function (e) {
+                e.stopPropagation();
+            }).attr('unselectable', 'on');
+        },
+        addItem: function (item) {
+            var self = this;
+            if (item.title === '-') {
+                self.div.append(K('<div class="ke-menu-separator"></div>'));
+                return;
+            }
+            var itemDiv = K('<div class="ke-menu-item" unselectable="on"></div>'),
+                leftDiv = K('<div class="ke-inline-block ke-menu-item-left"></div>'),
+                rightDiv = K('<div class="ke-inline-block ke-menu-item-right"></div>'),
+                height = _addUnit(item.height),
+                iconClass = _undef(item.iconClass, '');
+            self.div.append(itemDiv);
+            if (height) {
+                itemDiv.css('height', height);
+                rightDiv.css('line-height', height);
+            }
+            var centerDiv;
+            if (self.centerLineMode) {
+                centerDiv = K('<div class="ke-inline-block ke-menu-item-center"></div>');
+                if (height) {
+                    centerDiv.css('height', height);
+                }
+            }
+            itemDiv.mouseover(function (e) {
+                K(this).addClass('ke-menu-item-on');
+                if (centerDiv) {
+                    centerDiv.addClass('ke-menu-item-center-on');
+                }
+            })
+                .mouseout(function (e) {
+                    K(this).removeClass('ke-menu-item-on');
+                    if (centerDiv) {
+                        centerDiv.removeClass('ke-menu-item-center-on');
+                    }
+                })
+                .click(function (e) {
+                    item.click.call(K(this));
+                    e.stopPropagation();
+                })
+                .append(leftDiv);
+            if (centerDiv) {
+                itemDiv.append(centerDiv);
+            }
+            itemDiv.append(rightDiv);
+            if (item.checked) {
+                iconClass = 'ke-icon-checked';
+            }
+            if (iconClass !== '') {
+                leftDiv.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url ' + iconClass + '"></span>');
+            }
+            rightDiv.html(item.title);
+            return self;
+        },
+        remove: function () {
+            var self = this;
+            if (self.options.beforeRemove) {
+                self.options.beforeRemove.call(self);
+            }
+            K('.ke-menu-item', self.div[0]).unbind();
+            KMenu.parent.remove.call(self);
+            return self;
+        }
+    });
+
+    function _menu(options) {
+        return new KMenu(options);
+    }
+
+    K.MenuClass = KMenu;
+    K.menu = _menu;
+
+
+    function KColorPicker(options) {
+        this.init(options);
+    }
+
+    _extend(KColorPicker, KWidget, {
+        init: function (options) {
+            var self = this;
+            options.z = options.z || 811213;
+            KColorPicker.parent.init.call(self, options);
+            var colors = options.colors || [
+                ['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
+                ['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
+                ['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
+                ['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
+            ];
+            self.selectedColor = (options.selectedColor || '').toLowerCase();
+            self._cells = [];
+            self.div.addClass('ke-colorpicker').bind('click,mousedown', function (e) {
+                e.stopPropagation();
+            }).attr('unselectable', 'on');
+            var table = self.doc.createElement('table');
+            self.div.append(table);
+            table.className = 'ke-colorpicker-table';
+            table.cellPadding = 0;
+            table.cellSpacing = 0;
+            table.border = 0;
+            var row = table.insertRow(0), cell = row.insertCell(0);
+            cell.colSpan = colors[0].length;
+            self._addAttr(cell, '', 'ke-colorpicker-cell-top');
+            for (var i = 0; i < colors.length; i++) {
+                row = table.insertRow(i + 1);
+                for (var j = 0; j < colors[i].length; j++) {
+                    cell = row.insertCell(j);
+                    self._addAttr(cell, colors[i][j], 'ke-colorpicker-cell');
+                }
+            }
+        },
+        _addAttr: function (cell, color, cls) {
+            var self = this;
+            cell = K(cell).addClass(cls);
+            if (self.selectedColor === color.toLowerCase()) {
+                cell.addClass('ke-colorpicker-cell-selected');
+            }
+            cell.attr('title', color || self.options.noColor);
+            cell.mouseover(function (e) {
+                K(this).addClass('ke-colorpicker-cell-on');
+            });
+            cell.mouseout(function (e) {
+                K(this).removeClass('ke-colorpicker-cell-on');
+            });
+            cell.click(function (e) {
+                e.stop();
+                self.options.click.call(K(this), color);
+            });
+            if (color) {
+                cell.append(K('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css('background-color', color));
+            } else {
+                cell.html(self.options.noColor);
+            }
+            K(cell).attr('unselectable', 'on');
+            self._cells.push(cell);
+        },
+        remove: function () {
+            var self = this;
+            _each(self._cells, function () {
+                this.unbind();
+            });
+            KColorPicker.parent.remove.call(self);
+            return self;
+        }
+    });
+
+    function _colorpicker(options) {
+        return new KColorPicker(options);
+    }
+
+    K.ColorPickerClass = KColorPicker;
+    K.colorpicker = _colorpicker;
+
+
+    function KUploadButton(options) {
+        this.init(options);
+    }
+
+    _extend(KUploadButton, {
+        init: function (options) {
+            var self = this,
+                button = K(options.button),
+                fieldName = options.fieldName || 'file',
+                url = options.url || '',
+                title = button.val(),
+                extraParams = options.extraParams || {},
+                cls = button[0].className || '',
+                target = options.target || 'kindeditor_upload_iframe_' + new Date().getTime();
+            options.afterError = options.afterError || function (str) {
+                K.options.errorMsgHandler(str, "error");
+            };
+            var hiddenElements = [];
+            for (var k in extraParams) {
+                hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+            }
+            var html = [
+                '<div class="ke-inline-block ' + cls + '">',
+                (options.target ? '' : '<iframe name="' + target + '" style="display:none;"></iframe>'),
+                (options.form ? '<div class="ke-upload-area">' : '<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + url + '">'),
+                '<span class="ke-button-common">',
+                hiddenElements.join(''),
+                '<input type="button" class="ke-button-common ke-button" value="' + title + '" />',
+                '</span>',
+                '<input type="file" class="ke-upload-file" name="' + fieldName + '" tabindex="-1" />',
+                (options.form ? '</div>' : '</form>'),
+                '</div>'].join('');
+            var div = K(html, button.doc);
+            button.hide();
+            button.before(div);
+            self.div = div;
+            self.button = button;
+            self.iframe = options.target ? K('iframe[name="' + target + '"]') : K('iframe', div);
+            self.form = options.form ? K(options.form) : K('form', div);
+            self.fileBox = K('.ke-upload-file', div);
+            var width = options.width || K('.ke-button-common', div).width();
+            K('.ke-upload-area', div).width(width);
+            self.options = options;
+        },
+        submit: function () {
+            var self = this,
+                iframe = self.iframe;
+            if (typeof self.options.beforeUpload == 'function') {
+                var result = self.options.beforeUpload.call(self);
+                if (!result) {
+                    return false;
+                }
+            }
+            iframe.bind('load', function () {
+                iframe.unbind();
+                var tempForm = document.createElement('form');
+                self.fileBox.before(tempForm);
+                K(tempForm).append(self.fileBox);
+                tempForm.reset();
+                K(tempForm).remove(true);
+                var doc = K.iframeDoc(iframe),
+                    pre = doc.getElementsByTagName('pre')[0],
+                    str = '', data;
+                if (pre) {
+                    str = pre.innerHTML;
+                } else {
+                    str = doc.body.innerHTML;
+                }
+                str = _unescape(str);
+                iframe[0].src = 'javascript:false';
+                try {
+                    data = K.json(str);
+                } catch (e) {
+                    self.options.afterError.call(self, '<!doctype html><html>' + doc.body.parentNode.innerHTML + '</html>');
+                }
+                if (data) {
+                    self.options.afterUpload.call(self, data);
+                }
+            });
+            self.form[0].submit();
+            return self;
+        },
+        remove: function () {
+            var self = this;
+            if (self.fileBox) {
+                self.fileBox.unbind();
+            }
+            self.iframe.remove();
+            self.div.remove();
+            self.button.show();
+            return self;
+        }
+    });
+
+    function _uploadbutton(options) {
+        return new KUploadButton(options);
+    }
+
+    K.UploadButtonClass = KUploadButton;
+    K.uploadbutton = _uploadbutton;
+
+
+    function _createButton(arg) {
+        arg = arg || {};
+        var name = arg.name || '',
+            btn = K('<a href="javascript:;" class="ke-dialog-btn" title="' + name + '">' + name + '</a>');
+        if (arg.click) {
+            btn.click(arg.click);
+        }
+        return btn;
+    }
+
+
+    function KDialog(options) {
+        this.init(options);
+    }
+
+    _extend(KDialog, KWidget, {
+        init: function (options) {
+            var self = this;
+            options.z = options.z || 811213;
+            options.shadowMode = false;
+            options.autoScroll = _undef(options.autoScroll, true);
+            KDialog.parent.init.call(self, options);
+            var title = options.title,
+                body = K(options.body, self.doc),
+                previewBtn = options.previewBtn,
+                yesBtn = options.yesBtn,
+                noBtn = options.noBtn,
+                closeBtn = options.closeBtn,
+                showMask = _undef(options.showMask, true);
+            self.div.addClass('ke-dialog ke-animated').bind('click,mousedown', function (e) {
+                e.stopPropagation();
+            });
+            var contentDiv = K('<div class="ke-dialog-content"></div>').appendTo(self.div);
+            var headerDiv = K('<div class="ke-dialog-header"></div>');
+            contentDiv.append(headerDiv);
+            headerDiv.html(title);
+            self.closeIcon = K('<span class="ke-dialog-icon-close" title="' + closeBtn.name + '"></span>').click(closeBtn.click);
+            headerDiv.append(self.closeIcon);
+            self.draggable({
+                clickEl: headerDiv,
+                beforeDrag: options.beforeDrag
+            });
+            var bodyDiv = K('<div class="ke-dialog-body"></div>');
+            contentDiv.append(bodyDiv);
+            bodyDiv.append(body);
+            var footerDiv = K('<div class="ke-dialog-footer"></div>');
+            if (previewBtn || yesBtn || noBtn) {
+                self.div.append(footerDiv);
+                contentDiv.height(self.div.height() - footerDiv.height());
+            }
+            _each([
+                {btn: previewBtn, name: 'preview'},
+                {btn: yesBtn, name: 'yes'},
+                {btn: noBtn, name: 'no'}
+            ], function () {
+                if (this.btn) {
+                    var button = _createButton(this.btn);
+                    button.addClass('ke-dialog-' + this.name);
+                    footerDiv.append(button);
+                }
+            });
+            if (self.height) {
+                bodyDiv.height(_removeUnit(self.height) - headerDiv.height() - footerDiv.height());
+            }
+            self.div.width(self.div.width());
+            self.div.height(self.div.height());
+            self.mask = null;
+            if (showMask) {
+                var docEl = _docElement(self.doc),
+                    docWidth = Math.max(docEl.scrollWidth, docEl.clientWidth),
+                    docHeight = Math.max(docEl.scrollHeight, docEl.clientHeight);
+                self.mask = _widget({
+                    x: 0,
+                    y: 0,
+                    z: self.z - 1,
+                    cls: 'ke-dialog-mask',
+                    width: docWidth,
+                    height: docHeight
+                });
+            }
+            self.autoPos(self.div.width(), self.div.height());
+            self.footerDiv = footerDiv;
+            self.bodyDiv = bodyDiv;
+            self.headerDiv = headerDiv;
+            self.isLoading = false;
+        },
+        setMaskIndex: function (z) {
+            var self = this;
+            self.mask.div.css('z-index', z);
+        },
+        showLoading: function (msg) {
+            msg = _undef(msg, '');
+            var self = this, body = self.bodyDiv;
+            self.loading = K('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:' + Math.round(body.height() / 3) + 'px;">' + msg + '</div></div>')
+                .width(body.width()).height(body.height())
+                .css('top', self.headerDiv.height() + 'px');
+            body.css('visibility', 'hidden').after(self.loading);
+            self.isLoading = true;
+            return self;
+        },
+        hideLoading: function () {
+            this.loading && this.loading.remove();
+            this.bodyDiv.css('visibility', 'visible');
+            this.isLoading = false;
+            return this;
+        },
+        remove: function () {
+            var self = this;
+            if (self.options.beforeRemove) {
+                self.options.beforeRemove.call(self);
+            }
+            self.mask && self.mask.remove();
+            self.iframeMask && self.iframeMask.remove();
+            self.closeIcon.unbind();
+            K('input', self.div).unbind();
+            K('button', self.div).unbind();
+            self.footerDiv.unbind();
+            self.bodyDiv.unbind();
+            self.headerDiv.unbind();
+            K('iframe', self.div).each(function () {
+                K(this).remove();
+            });
+            KDialog.parent.remove.call(self);
+            return self;
+        }
+    });
+
+    function _dialog(options) {
+        return new KDialog(options);
+    }
+
+    K.DialogClass = KDialog;
+    K.dialog = _dialog;
+
+
+    function _tabs(options) {
+        var self = _widget(options),
+            remove = self.remove,
+            afterSelect = options.afterSelect,
+            div = self.div,
+            liList = [];
+        div.addClass('ke-tabs')
+            .bind('contextmenu,mousedown,mousemove', function (e) {
+                e.preventDefault();
+            });
+        var ul = K('<ul class="ke-tabs-ul ke-clearfix"></ul>');
+        div.append(ul);
+        self.add = function (tab) {
+            var li = K('<li class="ke-tabs-li">' + tab.title + '</li>');
+            li.data('tab', tab);
+            liList.push(li);
+            ul.append(li);
+        };
+        self.selectedIndex = 0;
+        self.select = function (index) {
+            self.selectedIndex = index;
+            _each(liList, function (i, li) {
+                li.unbind();
+                if (i === index) {
+                    li.addClass('ke-tabs-li-selected');
+                    K(li.data('tab').panel).show('');
+                } else {
+                    li.removeClass('ke-tabs-li-selected').removeClass('ke-tabs-li-on')
+                        .mouseover(function () {
+                            K(this).addClass('ke-tabs-li-on');
+                        })
+                        .mouseout(function () {
+                            K(this).removeClass('ke-tabs-li-on');
+                        })
+                        .click(function () {
+                            self.select(i);
+                        });
+                    K(li.data('tab').panel).hide();
+                }
+            });
+            if (afterSelect) {
+                afterSelect.call(self, index);
+            }
+        };
+        self.remove = function () {
+            _each(liList, function () {
+                this.remove();
+            });
+            ul.remove();
+            remove.call(self);
+        };
+        return self;
+    }
+
+    K.tabs = _tabs;
+
+
+    function _loadScript(url, fn) {
+        if (K.options.resLoadCache[url]) {
+            return;
+        }
+        var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
+            script = document.createElement('script');
+        head.appendChild(script);
+        K.options.resLoadCache[url] = 1;
+        script.src = url;
+        script.charset = 'utf-8';
+        script.onload = script.onreadystatechange = function () {
+            if (!this.readyState || this.readyState === 'loaded') {
+                if (fn) {
+                    fn();
+                }
+                script.onload = script.onreadystatechange = null;
+                head.removeChild(script);
+            }
+        };
+    }
+
+
+    function _chopQuery(url) {
+        var index = url.indexOf('?');
+        return index > 0 ? url.substr(0, index) : url;
+    }
+
+    function _loadStyle(url) {
+        if (K.options.resLoadCache[url]) {
+            return;
+        }
+        var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
+            link = document.createElement('link'),
+            absoluteUrl = _chopQuery(_formatUrl(url, 'absolute'));
+        var links = K('link[rel="stylesheet"]', head);
+        for (var i = 0, len = links.length; i < len; i++) {
+            if (_chopQuery(_formatUrl(links[i].href, 'absolute')) === absoluteUrl) {
+                return;
+            }
+        }
+        head.appendChild(link);
+        K.options.resLoadCache[url] = 1;
+        link.href = url;
+        link.rel = 'stylesheet';
+    }
+
+    function _ajax(url, fn, method, param, dataType) {
+        method = method || 'GET';
+        dataType = dataType || 'json';
+        var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+        xhr.open(method, url, true);
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState == 4 && xhr.status == 200) {
+                if (fn) {
+                    var data = _trim(xhr.responseText);
+                    if (dataType == 'json') {
+                        data = _json(data);
+                    }
+                    fn(data);
+                }
+            }
+        };
+        if (method == 'POST') {
+            var params = [];
+            _each(param, function (key, val) {
+                params.push(encodeURIComponent(key) + '=' + encodeURIComponent(val));
+            });
+            try {
+                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+            } catch (e) {
+            }
+            xhr.send(params.join('&'));
+        } else {
+            xhr.send(null);
+        }
+    }
+
+    K.loadScript = _loadScript;
+    K.loadStyle = _loadStyle;
+    K.ajax = _ajax;
+
+
+    var _plugins = {};
+
+    function _plugin(name, fn) {
+        if (name === undefined) {
+            return _plugins;
+        }
+        if (!fn) {
+            return _plugins[name];
+        }
+        _plugins[name] = fn;
+    }
+
+    var _language = {};
+
+    function _parseLangKey(key) {
+        var match, ns = 'core';
+        if ((match = /^(\w+)\.(\w+)$/.exec(key))) {
+            ns = match[1];
+            key = match[2];
+        }
+        return {ns: ns, key: key};
+    }
+
+    function _lang(mixed, langType) {
+        langType = langType === undefined ? K.options.langType : langType;
+        if (typeof mixed === 'string') {
+            if (!_language[langType]) {
+                return 'no language';
+            }
+            var pos = mixed.length - 1;
+            if (mixed.substr(pos) === '.') {
+                return _language[langType][mixed.substr(0, pos)];
+            }
+            var obj = _parseLangKey(mixed);
+            return _language[langType][obj.ns][obj.key];
+        }
+        _each(mixed, function (key, val) {
+            var obj = _parseLangKey(key);
+            if (!_language[langType]) {
+                _language[langType] = {};
+            }
+            if (!_language[langType][obj.ns]) {
+                _language[langType][obj.ns] = {};
+            }
+            _language[langType][obj.ns][obj.key] = val;
+        });
+    }
+
+
+    function _getImageFromRange(range, fn) {
+        if (range.collapsed) {
+            return;
+        }
+        range = range.cloneRange().up();
+        var sc = range.startContainer, so = range.startOffset;
+        if (!_WEBKIT && !range.isControl()) {
+            return;
+        }
+        var img = K(sc.childNodes[so]);
+        if (!img || img.name != 'img') {
+            return;
+        }
+        if (fn(img)) {
+            return img;
+        }
+    }
+
+    function _bindContextmenuEvent() {
+        var self = this, doc = self.edit.doc;
+        K(doc).contextmenu(function (e) {
+            if (self.menu) {
+                self.hideMenu();
+            }
+            if (!self.useContextmenu) {
+                e.preventDefault();
+                return;
+            }
+            if (self._contextmenus.length === 0) {
+                return;
+            }
+            var maxWidth = 0, items = [];
+            _each(self._contextmenus, function () {
+                if (this.title == '-') {
+                    items.push(this);
+                    return;
+                }
+                if (this.cond && this.cond()) {
+                    items.push(this);
+                    if (this.width && this.width > maxWidth) {
+                        maxWidth = this.width;
+                    }
+                }
+            });
+            while (items.length > 0 && items[0].title == '-') {
+                items.shift();
+            }
+            while (items.length > 0 && items[items.length - 1].title == '-') {
+                items.pop();
+            }
+            var prevItem = null;
+            _each(items, function (i) {
+                if (this.title == '-' && prevItem.title == '-') {
+                    delete items[i];
+                }
+                prevItem = this;
+            });
+            if (items.length > 0) {
+                e.preventDefault();
+                var pos = K(self.edit.iframe).pos(),
+                    menu = _menu({
+                        x: pos.x + e.clientX,
+                        themeType: self.themeType,
+                        y: pos.y + e.clientY,
+                        width: maxWidth,
+                        css: {visibility: 'hidden'},
+                        shadowMode: self.shadowMode
+                    });
+                _each(items, function () {
+                    if (this.title) {
+                        menu.addItem(this);
+                    }
+                });
+                var docEl = _docElement(menu.doc),
+                    menuHeight = menu.div.height();
+                if (e.clientY + menuHeight >= docEl.clientHeight - 100) {
+                    menu.pos(menu.x, _removeUnit(menu.y) - menuHeight);
+                }
+                menu.div.css('visibility', 'visible');
+                self.menu = menu;
+            }
+        });
+    }
+
+    function _bindNewlineEvent() {
+        var self = this, doc = self.edit.doc, newlineTag = self.newlineTag;
+        if (_IE && newlineTag !== 'br') {
+            return;
+        }
+        if (_GECKO && _V < 3 && newlineTag !== 'p') {
+            return;
+        }
+        if (_OPERA && _V < 9) {
+            return;
+        }
+        var brSkipTagMap = _toMap('h1,h2,h3,h4,h5,h6,pre,li'),
+            pSkipTagMap = _toMap('p,h1,h2,h3,h4,h5,h6,pre,li,blockquote');
+
+        function getAncestorTagName(range) {
+            var ancestor = K(range.commonAncestor());
+            while (ancestor) {
+                if (ancestor.type == 1 && !ancestor.isStyle()) {
+                    break;
+                }
+                ancestor = ancestor.parent();
+            }
+            return ancestor.name;
+        }
+
+        K(doc).keydown(function (e) {
+            if (e.which == 39) {
+                if (self.__startOffset == self.cmd.range.startOffset) {
+                    var tagName = getAncestorTagName(self.cmd.range);
+                    if (tagName != 'body') {
+                        self.appendHtml('<br />')
+                    }
+                } else {
+                    self.__startOffset = self.cmd.range.startOffset
+                }
+                return;
+            }
+            if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
+                return;
+            }
+            self.cmd.selection();
+            var tagName = getAncestorTagName(self.cmd.range);
+            if (tagName == 'marquee' || tagName == 'select') {
+                return;
+            }
+            if (newlineTag === 'br' && !brSkipTagMap[tagName]) {
+                e.preventDefault();
+                self.insertHtml('<br />' + (_IE && _V < 9 ? '' : '\u200B'));
+                return;
+            }
+            if (!pSkipTagMap[tagName]) {
+                _nativeCommand(doc, 'formatblock', '<p>');
+            }
+        });
+        K(doc).keyup(function (e) {
+            if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
+                return;
+            }
+            if (newlineTag == 'br') {
+                return;
+            }
+            if (_GECKO) {
+                var root = self.cmd.commonAncestor('p');
+                var a = self.cmd.commonAncestor('a');
+                if (a && a.text() == '') {
+                    a.remove(true);
+                    self.cmd.range.selectNodeContents(root[0]).collapse(true);
+                    self.cmd.select();
+                }
+                return;
+            }
+            self.cmd.selection();
+            var tagName = getAncestorTagName(self.cmd.range);
+            if (tagName == 'marquee' || tagName == 'select') {
+                return;
+            }
+            if (!pSkipTagMap[tagName]) {
+                _nativeCommand(doc, 'formatblock', '<p>');
+            }
+            var div = self.cmd.commonAncestor('div');
+            if (div) {
+                var p = K('<p></p>'),
+                    child = div[0].firstChild;
+                while (child) {
+                    var next = child.nextSibling;
+                    p.append(child);
+                    child = next;
+                }
+                div.before(p);
+                div.remove();
+                self.cmd.range.selectNodeContents(p[0]);
+                self.cmd.select();
+            }
+        });
+    }
+
+    function _bindTabEvent() {
+        var self = this, doc = self.edit.doc;
+        K(doc).keydown(function (e) {
+            if (e.which == 9) {
+                e.preventDefault();
+                if (self.afterTab) {
+                    self.afterTab.call(self, e);
+                    return;
+                }
+                var cmd = self.cmd, range = cmd.range;
+                range.shrink();
+                if (range.collapsed && range.startContainer.nodeType == 1) {
+                    range.insertNode(K('@&nbsp;', doc)[0]);
+                    cmd.select();
+                }
+                self.insertHtml('&nbsp;&nbsp;&nbsp;&nbsp;');
+            }
+        });
+    }
+
+    function _bindFocusEvent() {
+        var self = this;
+        K(self.edit.textarea[0], self.edit.win).focus(function (e) {
+            if (self.afterFocus) {
+                self.afterFocus.call(self, e);
+            }
+        }).blur(function (e) {
+            if (self.afterBlur) {
+                self.afterBlur.call(self, e);
+            }
+        });
+    }
+
+    function _removeBookmarkTag(html) {
+        return _trim(html.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/ig, ''));
+    }
+
+    function _removeTempTag(html) {
+        return html.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/ig, '');
+    }
+
+    function _addBookmarkToStack(stack, bookmark) {
+        if (stack.length === 0) {
+            stack.push(bookmark);
+            return;
+        }
+        var prev = stack[stack.length - 1];
+        if (_removeBookmarkTag(bookmark.html) !== _removeBookmarkTag(prev.html)) {
+            stack.push(bookmark);
+        }
+    }
+
+
+    function _undoToRedo(fromStack, toStack) {
+        var self = this, edit = self.edit,
+            body = edit.doc.body,
+            range, bookmark;
+        if (fromStack.length === 0) {
+            return self;
+        }
+        if (edit.designMode) {
+            range = self.cmd.range;
+            bookmark = range.createBookmark(true);
+            bookmark.html = body.innerHTML;
+        } else {
+            bookmark = {
+                html: body.innerHTML
+            };
+        }
+        _addBookmarkToStack(toStack, bookmark);
+        var prev = fromStack.pop();
+        if (_removeBookmarkTag(bookmark.html) === _removeBookmarkTag(prev.html) && fromStack.length > 0) {
+            prev = fromStack.pop();
+        }
+        if (edit.designMode) {
+            edit.html(prev.html);
+            if (prev.start) {
+                range.moveToBookmark(prev);
+                self.select();
+            }
+        } else {
+            K(body).html(_removeBookmarkTag(prev.html));
+        }
+        return self;
+    }
+
+    function KEditor(options) {
+        var self = this;
+        self.options = {};
+
+        function setOption(key, val) {
+            if (KEditor.prototype[key] === undefined) {
+                self[key] = val;
+            }
+            self.options[key] = val;
+        }
+
+        _each(options, function (key, val) {
+            setOption(key, options[key]);
+        });
+        _each(K.options, function (key, val) {
+            if (self[key] === undefined) {
+                setOption(key, val);
+            }
+        });
+        var se = K(self.srcElement || '<textarea/>');
+        if (!self.width) {
+            self.width = se[0].style.width || se.width();
+        }
+        if (!self.height) {
+            self.height = se[0].style.height || se.height();
+        }
+        setOption('width', _undef(self.width, self.minWidth));
+        setOption('height', _undef(self.height, self.minHeight));
+        setOption('width', _addUnit(self.width));
+        setOption('height', _addUnit(self.height));
+        if (_MOBILE && (!_IOS || _V < 534)) {
+            self.designMode = false;
+        }
+        self.srcElement = se;
+        self.initContent = '';
+        self.plugin = {};
+        self.isCreated = false;
+        self._handlers = {};
+        self._contextmenus = [];
+        self._undoStack = [];
+        self._redoStack = [];
+        self._firstAddBookmark = true;
+        self.menu = self.contextmenu = null;
+        self.dialogs = [];
+    }
+
+    KEditor.prototype = {
+        lang: function (mixed) {
+            return _lang(mixed, this.langType);
+        },
+        loadPlugin: function (name, fn) {
+            var self = this;
+            var _pluginStatus = this._pluginStatus;
+            if (!_pluginStatus) {
+                _pluginStatus = this._pluginStatus = {};
+            }
+            if (_plugins[name]) {
+                if (!_isFunction(_plugins[name])) {
+                    setTimeout(function () {
+                        self.loadPlugin(name, fn);
+                    }, 100);
+                    return self;
+                }
+                if (!_pluginStatus[name]) {
+                    _plugins[name].call(self, KindEditor);
+                    _pluginStatus[name] = 'inited';
+                }
+                if (fn) {
+                    fn.call(self);
+                }
+                return self;
+            }
+            _plugins[name] = 'loading';
+            _loadScript(self.pluginsPath + name + '/' + name + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function () {
+                setTimeout(function () {
+                    if (_plugins[name]) {
+                        self.loadPlugin(name, fn);
+                    }
+                }, 0);
+            });
+            return self;
+        },
+        handler: function (key, fn) {
+            var self = this;
+            if (!self._handlers[key]) {
+                self._handlers[key] = [];
+            }
+            if (_isFunction(fn)) {
+                self._handlers[key].push(fn);
+                return self;
+            }
+            _each(self._handlers[key], function () {
+                fn = this.call(self, fn);
+            });
+            return fn;
+        },
+        clickToolbar: function (name, fn) {
+            var self = this, key = 'clickToolbar' + name;
+            if (fn === undefined) {
+                if (self._handlers[key]) {
+                    return self.handler(key);
+                }
+                self.loadPlugin(name, function () {
+                    self.handler(key);
+                });
+                return self;
+            }
+            return self.handler(key, fn);
+        },
+        updateState: function () {
+            var self = this;
+            _each(('justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,' +
+                'subscript,superscript,bold,italic,underline,strikethrough').split(','), function (i, name) {
+                self.cmd.state(name) ? self.toolbar.select(name) : self.toolbar.unselect(name);
+            });
+            return self;
+        },
+        addContextmenu: function (item) {
+            this._contextmenus.push(item);
+            return this;
+        },
+        afterCreate: function (fn) {
+            return this.handler('afterCreate', fn);
+        },
+        beforeRemove: function (fn) {
+            return this.handler('beforeRemove', fn);
+        },
+        beforeGetHtml: function (fn) {
+            return this.handler('beforeGetHtml', fn);
+        },
+        beforeSetHtml: function (fn) {
+            return this.handler('beforeSetHtml', fn);
+        },
+        afterSetHtml: function (fn) {
+            return this.handler('afterSetHtml', fn);
+        },
+        create: function () {
+            var self = this, fullscreenMode = self.fullscreenMode;
+            if (self.isCreated) {
+                return self;
+            }
+            if (self.srcElement.data('kindeditor')) {
+                return self;
+            }
+            self.srcElement.data('kindeditor', 'true');
+            if (fullscreenMode) {
+                _docElement().style.overflow = 'hidden';
+            } else {
+                _docElement().style.overflow = '';
+            }
+            var width = fullscreenMode ? _docElement().clientWidth + 'px' : self.width,
+                height = fullscreenMode ? _docElement().clientHeight + 'px' : self.height;
+            if ((_IE && _V < 8) || _QUIRKS) {
+                height = _addUnit(_removeUnit(height) + 2);
+            }
+            var container = self.container = K(self.layout);
+            if (fullscreenMode) {
+                K(document.body).append(container);
+            } else {
+                self.srcElement.before(container);
+            }
+            var toolbarDiv = K('.toolbar', container),
+                editDiv = K('.edit', container),
+                statusbar = self.statusbar = K('.statusbar', container);
+            container.removeClass('container')
+                .addClass('ke-container ke-container-' + self.themeType).css('width', width);
+            if (fullscreenMode) {
+                container.css({
+                    position: 'absolute',
+                    left: 0,
+                    top: 0,
+                    'z-index': 811211
+                });
+                if (!_GECKO) {
+                    self._scrollPos = _getScrollPos();
+                }
+                window.scrollTo(0, 0);
+                K(document.body).css({
+                    'height': '1px',
+                    'overflow': 'hidden'
+                });
+                K(document.body.parentNode).css('overflow', 'hidden');
+                self._fullscreenExecuted = true;
+            } else {
+                if (self._fullscreenExecuted) {
+                    K(document.body).css({
+                        'height': '',
+                        'overflow': ''
+                    });
+                    K(document.body.parentNode).css('overflow', '');
+                }
+                if (self._scrollPos) {
+                    window.scrollTo(self._scrollPos.x, self._scrollPos.y);
+                }
+            }
+            var htmlList = [];
+            K.each(self.items, function (i, name) {
+                if (name == '|') {
+                    htmlList.push('<span class="ke-inline-block ke-separator"></span>');
+                } else if (name == '/') {
+                    htmlList.push('<div class="ke-hr"></div>');
+                } else {
+                    htmlList.push('<span class="ke-outline" data-name="' + name + '" title="' + self.lang(name) + '" unselectable="on">');
+                    htmlList.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-' + name + '" unselectable="on"></span></span>');
+                }
+            });
+            var toolbar = self.toolbar = _toolbar({
+                src: toolbarDiv,
+                html: htmlList.join(''),
+                noDisableItems: self.noDisableItems,
+                click: function (e, name) {
+                    e.stop();
+                    if (self.menu) {
+                        var menuName = self.menu.name;
+                        self.hideMenu();
+                        if (menuName === name) {
+                            return;
+                        }
+                    }
+                    self.clickToolbar(name);
+                }
+            });
+            var editHeight = _removeUnit(height) - toolbar.div.height();
+            var edit = self.edit = _edit({
+                height: editHeight > 0 && _removeUnit(height) > self.minHeight ? editHeight : self.minHeight,
+                src: editDiv,
+                srcElement: self.srcElement,
+                designMode: self.designMode,
+                themesPath: self.themesPath,
+                bodyClass: self.bodyClass,
+                cssPath: self.cssPath,
+                jsPath: self.jsPath,
+                showHelpGrid: self.showHelpGrid,
+                cssData: self.cssData,
+                beforeGetHtml: function (html) {
+                    html = self.beforeGetHtml(html);
+                    html = _removeBookmarkTag(_removeTempTag(html));
+                    return _formatHtml(html, self.filterMode ? self.htmlTags : null, self.urlType, self.wellFormatMode, self.indentChar);
+                },
+                beforeSetHtml: function (html) {
+                    html = _formatHtml(html, self.filterMode ? self.htmlTags : null, '', false);
+                    return self.beforeSetHtml(html);
+                },
+                afterSetHtml: function () {
+                    self.edit = edit = this;
+                    self.afterSetHtml();
+                },
+                afterCreate: function () {
+                    self.edit = edit = this;
+                    self.cmd = edit.cmd;
+                    self._docMousedownFn = function (e) {
+                        if (self.menu) {
+                            self.hideMenu();
+                        }
+                    };
+                    K(edit.doc, document).mousedown(self._docMousedownFn);
+                    _bindContextmenuEvent.call(self);
+                    _bindNewlineEvent.call(self);
+                    _bindTabEvent.call(self);
+                    _bindFocusEvent.call(self);
+                    edit.afterChange(function (e) {
+                        if (!edit.designMode) {
+                            return;
+                        }
+                        self.updateState();
+                        self.addBookmark();
+                        if (self.options.afterChange) {
+                            self.options.afterChange.call(self);
+                        }
+                    });
+                    edit.textarea.keyup(function (e) {
+                        if (!e.ctrlKey && !e.altKey && _INPUT_KEY_MAP[e.which]) {
+                            if (self.options.afterChange) {
+                                self.options.afterChange.call(self);
+                            }
+                        }
+                    });
+                    if (self.readonlyMode) {
+                        self.readonly();
+                    }
+                    self.isCreated = true;
+                    if (self.initContent === '') {
+                        self.initContent = self.html();
+                    }
+                    if (self._undoStack.length > 0) {
+                        var prev = self._undoStack.pop();
+                        if (prev.start) {
+                            self.html(prev.html);
+                            edit.cmd.range.moveToBookmark(prev);
+                            self.select();
+                        }
+                    }
+                    self.afterCreate();
+                    if (self.options.afterCreate) {
+                        self.options.afterCreate.call(self);
+                    }
+                }
+            });
+            statusbar.removeClass('statusbar').addClass('ke-statusbar')
+                .append('<span class="ke-inline-block ke-statusbar-center-icon"></span>')
+                .append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');
+            if (self._fullscreenResizeHandler) {
+                K(window).unbind('resize', self._fullscreenResizeHandler);
+                self._fullscreenResizeHandler = null;
+            }
+
+            function initResize() {
+                if (statusbar.height() === 0) {
+                    setTimeout(initResize, 100);
+                    return;
+                }
+                self.resize(width, height, false);
+            }
+
+            initResize();
+            if (fullscreenMode) {
+                self._fullscreenResizeHandler = function (e) {
+                    if (self.isCreated) {
+                        self.resize(_docElement().clientWidth, _docElement().clientHeight, false);
+                    }
+                };
+                K(window).bind('resize', self._fullscreenResizeHandler);
+                toolbar.select('fullscreen');
+                statusbar.first().css('visibility', 'hidden');
+                statusbar.last().css('visibility', 'hidden');
+            } else {
+                if (_GECKO) {
+                    K(window).bind('scroll', function (e) {
+                        self._scrollPos = _getScrollPos();
+                    });
+                }
+                if (self.resizeType > 0) {
+                    _drag({
+                        moveEl: container,
+                        clickEl: statusbar,
+                        moveFn: function (x, y, width, height, diffX, diffY) {
+                            height += diffY;
+                            self.resize(null, height);
+                        }
+                    });
+                } else {
+                    statusbar.first().css('visibility', 'hidden');
+                }
+                if (self.resizeType === 2) {
+                    _drag({
+                        moveEl: container,
+                        clickEl: statusbar.last(),
+                        moveFn: function (x, y, width, height, diffX, diffY) {
+                            width += diffX;
+                            height += diffY;
+                            self.resize(width, height);
+                        }
+                    });
+                } else {
+                    statusbar.last().css('visibility', 'hidden');
+                }
+            }
+            return self;
+        },
+        remove: function () {
+            var self = this;
+            if (!self.isCreated) {
+                return self;
+            }
+            self.beforeRemove();
+            self.srcElement.data('kindeditor', '');
+            if (self.menu) {
+                self.hideMenu();
+            }
+            _each(self.dialogs, function () {
+                self.hideDialog();
+            });
+            K(document).unbind('mousedown', self._docMousedownFn);
+            self.toolbar.remove();
+            self.edit.remove();
+            self.statusbar.last().unbind();
+            self.statusbar.unbind();
+            self.container.remove();
+            self.container = self.toolbar = self.edit = self.menu = null;
+            self.dialogs = [];
+            self.isCreated = false;
+            return self;
+        },
+        resize: function (width, height, updateProp) {
+            var self = this;
+            updateProp = _undef(updateProp, true);
+            if (width) {
+                if (!/%/.test(width)) {
+                    width = _removeUnit(width);
+                    width = width < self.minWidth ? self.minWidth : width;
+                }
+                self.container.css('width', _addUnit(width));
+                if (updateProp) {
+                    self.width = _addUnit(width);
+                }
+            }
+            if (height) {
+                height = _removeUnit(height);
+                var editHeight = _removeUnit(height) - self.toolbar.div.height() - self.statusbar.height();
+                editHeight = editHeight < self.minHeight ? self.minHeight : editHeight;
+                self.edit.setHeight(editHeight);
+                if (updateProp) {
+                    self.height = _addUnit(height);
+                }
+            }
+            return self;
+        },
+        select: function () {
+            this.isCreated && this.cmd.select();
+            return this;
+        },
+        html: function (val) {
+            var self = this;
+            if (val === undefined) {
+                return self.isCreated ? self.edit.html() : _elementVal(self.srcElement);
+            }
+            self.isCreated ? self.edit.html(val) : _elementVal(self.srcElement, val);
+            if (self.isCreated) {
+                self.cmd.selection();
+            }
+            return self;
+        },
+        fullHtml: function () {
+            return this.isCreated ? this.edit.html(undefined, true) : '';
+        },
+        text: function (val) {
+            var self = this;
+            if (val === undefined) {
+                return _trim(self.html().replace(/<(?!img|embed).*?>/ig, '').replace(/&nbsp;/ig, ' '));
+            } else {
+                return self.html(_escape(val));
+            }
+        },
+        isEmpty: function () {
+            return _trim(this.text().replace(/\r\n|\n|\r/, '')) === '';
+        },
+        isDirty: function () {
+            return _trim(this.initContent.replace(/\r\n|\n|\r|t/g, '')) !== _trim(this.html().replace(/\r\n|\n|\r|t/g, ''));
+        },
+        selectedHtml: function () {
+            var val = this.isCreated ? this.cmd.range.html() : '';
+            val = _removeBookmarkTag(_removeTempTag(val));
+            return val;
+        },
+        count: function (mode) {
+            var self = this;
+            mode = (mode || 'html').toLowerCase();
+            if (mode === 'html') {
+                return self.html().length;
+            }
+            if (mode === 'text') {
+                return self.text().replace(/<(?:img|embed).*?>/ig, 'K').replace(/\r\n|\n|\r/g, '').length;
+            }
+            return 0;
+        },
+        exec: function (key) {
+            key = key.toLowerCase();
+            var self = this, cmd = self.cmd,
+                changeFlag = _inArray(key, 'selectall,copy,paste,print'.split(',')) < 0;
+            if (changeFlag) {
+                self.addBookmark(false);
+            }
+            cmd[key].apply(cmd, _toArray(arguments, 1));
+            if (changeFlag) {
+                self.updateState();
+                self.addBookmark(false);
+                if (self.options.afterChange) {
+                    self.options.afterChange.call(self);
+                }
+            }
+            return self;
+        },
+        insertHtml: function (val, quickMode) {
+            if (!this.isCreated) {
+                return this;
+            }
+            val = this.beforeSetHtml(val);
+            this.exec('inserthtml', val, quickMode);
+            return this;
+        },
+        appendHtml: function (val) {
+            this.html(this.html() + val);
+            if (this.isCreated) {
+                var cmd = this.cmd;
+                cmd.range.selectNodeContents(cmd.doc.body).collapse(false);
+                cmd.select();
+            }
+            return this;
+        },
+        sync: function () {
+            _elementVal(this.srcElement, this.html());
+            return this;
+        },
+        focus: function () {
+            this.isCreated ? this.edit.focus() : this.srcElement[0].focus();
+            return this;
+        },
+        blur: function () {
+            this.isCreated ? this.edit.blur() : this.srcElement[0].blur();
+            return this;
+        },
+        addBookmark: function (checkSize) {
+            checkSize = _undef(checkSize, true);
+            var self = this, edit = self.edit,
+                body = edit.doc.body,
+                html = _removeTempTag(body.innerHTML), bookmark;
+            if (checkSize && self._undoStack.length > 0) {
+                var prev = self._undoStack[self._undoStack.length - 1];
+                if (Math.abs(html.length - _removeBookmarkTag(prev.html).length) < self.minChangeSize) {
+                    return self;
+                }
+            }
+            if (edit.designMode && !self._firstAddBookmark) {
+                var range = self.cmd.range;
+                bookmark = range.createBookmark(true);
+                bookmark.html = _removeTempTag(body.innerHTML);
+                range.moveToBookmark(bookmark);
+            } else {
+                bookmark = {
+                    html: html
+                };
+            }
+            self._firstAddBookmark = false;
+            _addBookmarkToStack(self._undoStack, bookmark);
+            return self;
+        },
+        undo: function () {
+            return _undoToRedo.call(this, this._undoStack, this._redoStack);
+        },
+        redo: function () {
+            return _undoToRedo.call(this, this._redoStack, this._undoStack);
+        },
+        fullscreen: function (bool) {
+            this.fullscreenMode = (bool === undefined ? !this.fullscreenMode : bool);
+            this.addBookmark(false);
+            return this.remove().create();
+        },
+        readonly: function (isReadonly) {
+            isReadonly = _undef(isReadonly, true);
+            var self = this, edit = self.edit, doc = edit.doc;
+            if (self.designMode) {
+                self.toolbar.disableAll(isReadonly, []);
+            } else {
+                _each(self.noDisableItems, function () {
+                    self.toolbar[isReadonly ? 'disable' : 'enable'](this);
+                });
+            }
+            if (_IE) {
+                doc.body.contentEditable = !isReadonly;
+            } else {
+                doc.designMode = isReadonly ? 'off' : 'on';
+            }
+            edit.textarea[0].disabled = isReadonly;
+        },
+        createMenu: function (options) {
+            var self = this,
+                name = options.name,
+                knode = self.toolbar.get(name),
+                pos = knode.pos();
+            options.x = pos.x;
+            options.y = pos.y + knode.height();
+            options.z = self.options.zIndex;
+            options.shadowMode = _undef(options.shadowMode, self.shadowMode);
+            if (options.selectedColor !== undefined) {
+                options.cls = 'ke-colorpicker-' + self.themeType;
+                options.noColor = self.lang('noColor');
+                self.menu = _colorpicker(options);
+            } else {
+                options.cls = 'ke-menu-' + self.themeType;
+                options.centerLineMode = false;
+                self.menu = _menu(options);
+            }
+            return self.menu;
+        },
+        hideMenu: function () {
+            this.menu.remove();
+            this.menu = null;
+            return this;
+        },
+        hideContextmenu: function () {
+            this.contextmenu.remove();
+            this.contextmenu = null;
+            return this;
+        },
+        createDialog: function (options) {
+            var self = this;
+            options.z = self.options.zIndex;
+            options.shadowMode = _undef(options.shadowMode, self.shadowMode);
+            options.closeBtn = _undef(options.closeBtn, {
+                name: self.lang('close'),
+                click: function (e) {
+                    self.hideDialog();
+                    if (_IE && self.cmd) {
+                        self.cmd.select();
+                    }
+                }
+            });
+            options.noBtn = _undef(options.noBtn, {
+                name: self.lang(options.yesBtn ? 'no' : 'close'),
+                click: function (e) {
+                    self.hideDialog();
+                    if (_IE && self.cmd) {
+                        self.cmd.select();
+                    }
+                }
+            });
+            if (self.dialogAlignType != 'page') {
+                options.alignEl = self.container;
+            }
+            options.cls = 'ke-dialog-' + self.themeType;
+            if (self.dialogs.length > 0) {
+                var firstDialog = self.dialogs[0],
+                    parentDialog = self.dialogs[self.dialogs.length - 1];
+                firstDialog.setMaskIndex(parentDialog.z + 2);
+                options.z = parentDialog.z + 3;
+                options.showMask = false;
+            }
+            var dialog = _dialog(options);
+            self.dialogs.push(dialog);
+            return dialog;
+        },
+        hideDialog: function () {
+            var self = this;
+            if (self.dialogs.length > 0) {
+                self.dialogs.pop().remove();
+            }
+            if (self.dialogs.length > 0) {
+                var firstDialog = self.dialogs[0],
+                    parentDialog = self.dialogs[self.dialogs.length - 1];
+                firstDialog.setMaskIndex(parentDialog.z - 1);
+            }
+            return self;
+        },
+        errorDialog: function (html) {
+            var self = this;
+            var dialog = self.createDialog({
+                width: 750,
+                title: self.lang('uploadError'),
+                body: '<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'
+            });
+            var iframe = K('iframe', dialog.div), doc = K.iframeDoc(iframe);
+            doc.open();
+            doc.write(html);
+            doc.close();
+            K(doc.body).css('background-color', '#FFF');
+            iframe[0].contentWindow.focus();
+            return self;
+        }
+    };
+
+    function _editor(options) {
+        return new KEditor(options);
+    }
+
+    var _instances = [];
+
+    function _create(expr, options) {
+        options = options || {};
+        options.basePath = _undef(options.basePath, K.basePath);
+        options.themesPath = _undef(options.themesPath, options.basePath + 'themes/');
+        options.langPath = _undef(options.langPath, options.basePath + 'lang/');
+        options.pluginsPath = _undef(options.pluginsPath, options.basePath + 'plugins/');
+        if (typeof options.errorMsgHandler == "function") {
+            K.options.errorMsgHandler = options.errorMsgHandler;
+        }
+        if (_undef(options.loadStyleMode, K.options.loadStyleMode)) {
+            var themeType = _undef(options.themeType, K.options.themeType);
+            _loadStyle(options.themesPath + themeType + '/editor.min.css');
+        }
+
+        function create(editor) {
+            _each(_plugins, function (name, fn) {
+                if (_isFunction(fn)) {
+                    fn.call(editor, KindEditor);
+                    if (!editor._pluginStatus) {
+                        editor._pluginStatus = {};
+                    }
+                    editor._pluginStatus[name] = 'inited';
+                }
+            });
+            return editor.create();
+        }
+
+        var knode = K(expr);
+        if (!knode || knode.length === 0) {
+            return;
+        }
+        if (knode.length > 1) {
+            knode.each(function () {
+                _create(this, options);
+            });
+            return _instances[0];
+        }
+        options.srcElement = knode[0];
+        var editor = new KEditor(options);
+        _instances.push(editor);
+        if (_language[editor.langType]) {
+            return create(editor);
+        }
+        _loadScript(editor.langPath + editor.langType + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function () {
+            create(editor);
+        });
+        return editor;
+    }
+
+    function _eachEditor(expr, fn) {
+        K(expr).each(function (i, el) {
+            K.each(_instances, function (j, editor) {
+                if (editor && editor.srcElement[0] == el) {
+                    fn.call(editor, j);
+                    return false;
+                }
+            });
+        });
+    }
+
+    K.remove = function (expr) {
+        _eachEditor(expr, function (i) {
+            this.remove();
+            _instances.splice(i, 1);
+        });
+    };
+    K.sync = function (expr) {
+        _eachEditor(expr, function () {
+            this.sync();
+        });
+    };
+    K.html = function (expr, val) {
+        _eachEditor(expr, function () {
+            this.html(val);
+        });
+    };
+    K.insertHtml = function (expr, val) {
+        _eachEditor(expr, function () {
+            this.insertHtml(val);
+        });
+    };
+    K.appendHtml = function (expr, val) {
+        _eachEditor(expr, function () {
+            this.appendHtml(val);
+        });
+    };
+
+
+    if (_IE && _V < 7) {
+        _nativeCommand(document, 'BackgroundImageCache', true);
+    }
+    K.EditorClass = KEditor;
+    K.editor = _editor;
+    K.create = _create;
+    K.instances = _instances;
+    K.plugin = _plugin;
+    K.lang = _lang;
+
+
+    _plugin('core', function (K) {
+        var self = this,
+            shortcutKeys = {
+                undo: 'Z', redo: 'Y', bold: 'B', italic: 'I', underline: 'U', print: 'P', selectall: 'A'
+            };
+        self.afterSetHtml(function () {
+            if (self.options.afterChange) {
+                self.options.afterChange.call(self);
+            }
+        });
+        self.afterCreate(function () {
+            if (self.syncType != 'form') {
+                return;
+            }
+            var el = K(self.srcElement), hasForm = false;
+            while ((el = el.parent())) {
+                if (el.name == 'form') {
+                    hasForm = true;
+                    break;
+                }
+            }
+            if (hasForm) {
+                el.bind('submit', function (e) {
+                    self.sync();
+                    K(window).bind('unload', function () {
+                        self.edit.textarea.remove();
+                    });
+                });
+                var resetBtn = K('[type="reset"]', el);
+                resetBtn.click(function () {
+                    self.html(self.initContent);
+                    self.cmd.selection();
+                });
+                self.beforeRemove(function () {
+                    el.unbind();
+                    resetBtn.unbind();
+                });
+            }
+        });
+        self.clickToolbar('source', function () {
+            if (self.edit.designMode) {
+                self.toolbar.disableAll(true);
+                self.edit.design(false);
+                self.toolbar.select('source');
+            } else {
+                self.toolbar.disableAll(false);
+                self.edit.design(true);
+                self.toolbar.unselect('source');
+                if (_GECKO) {
+                    setTimeout(function () {
+                        self.cmd.selection();
+                    }, 0);
+                } else {
+                    self.cmd.selection();
+                }
+            }
+            self.designMode = self.edit.designMode;
+        });
+        self.afterCreate(function () {
+            if (!self.designMode) {
+                self.toolbar.disableAll(true).select('source');
+            }
+        });
+        self.clickToolbar('fullscreen', function () {
+            self.fullscreen();
+        });
+        if (self.fullscreenShortcut) {
+            var loaded = false;
+            self.afterCreate(function () {
+                K(self.edit.doc, self.edit.textarea).keyup(function (e) {
+                    if (e.which == 27) {
+                        setTimeout(function () {
+                            self.fullscreen();
+                        }, 0);
+                    }
+                });
+                if (loaded) {
+                    if (_IE && !self.designMode) {
+                        return;
+                    }
+                    self.focus();
+                }
+                if (!loaded) {
+                    loaded = true;
+                }
+            });
+        }
+        _each('undo,redo'.split(','), function (i, name) {
+            if (shortcutKeys[name]) {
+                self.afterCreate(function () {
+                    _ctrl(this.edit.doc, shortcutKeys[name], function () {
+                        self.clickToolbar(name);
+                    });
+                });
+            }
+            self.clickToolbar(name, function () {
+                self[name]();
+            });
+        });
+        self.clickToolbar('formatblock', function () {
+            var blocks = self.lang('formatblock.formatBlock'),
+                heights = {
+                    h1: 28,
+                    h2: 24,
+                    h3: 18,
+                    H4: 14,
+                    p: 12
+                },
+                curVal = self.cmd.val('formatblock'),
+                menu = self.createMenu({
+                    name: 'formatblock',
+                    width: self.langType == 'en' ? 200 : 150
+                });
+            _each(blocks, function (key, val) {
+                var style = 'font-size:' + heights[key] + 'px;';
+                if (key.charAt(0) === 'h') {
+                    style += 'font-weight:bold;';
+                }
+                menu.addItem({
+                    title: '<span style="' + style + '" unselectable="on">' + val + '</span>',
+                    height: heights[key] + 12,
+                    checked: (curVal === key || curVal === val),
+                    click: function () {
+                        self.select().exec('formatblock', '<' + key + '>').hideMenu();
+                    }
+                });
+            });
+        });
+        self.clickToolbar('fontname', function () {
+            var curVal = self.cmd.val('fontname'),
+                menu = self.createMenu({
+                    name: 'fontname',
+                    width: 150
+                });
+            console
+            _each(self.lang('fontname.fontName'), function (key, val) {
+                menu.addItem({
+                    title: '<span style="font-family: ' + key + ';" unselectable="on">' + val + '</span>',
+                    checked: (curVal === key.toLowerCase() || curVal === val.toLowerCase()),
+                    click: function () {
+                        self.exec('fontname', key).hideMenu();
+                    }
+                });
+            });
+        });
+        self.clickToolbar('fontsize', function () {
+            var curVal = self.cmd.val('fontsize'),
+                menu = self.createMenu({
+                    name: 'fontsize',
+                    width: 150
+                });
+            _each(self.fontSizeTable, function (i, val) {
+                menu.addItem({
+                    title: '<span style="font-size:' + val + ';" unselectable="on">' + val + '</span>',
+                    height: _removeUnit(val) + 12,
+                    checked: curVal === val,
+                    click: function () {
+                        self.exec('fontsize', val).hideMenu();
+                    }
+                });
+            });
+        });
+        _each('forecolor,hilitecolor'.split(','), function (i, name) {
+            self.clickToolbar(name, function () {
+                self.createMenu({
+                    name: name,
+                    selectedColor: self.cmd.val(name) || 'default',
+                    colors: self.colorTable,
+                    click: function (color) {
+                        self.exec(name, color).hideMenu();
+                    }
+                });
+            });
+        });
+        _each(('cut,copy,paste').split(','), function (i, name) {
+            self.clickToolbar(name, function () {
+                self.focus();
+                try {
+                    self.exec(name, null);
+                } catch (e) {
+                    K.options.errorMsgHandler(self.lang(name + 'Error'), "error");
+                }
+            });
+        });
+        self.clickToolbar('about', function () {
+            var html = '<div style="margin:20px;">' +
+                '<div>NKeditor ' + _VERSION + '</div>' +
+                '<div>Forked from KindEditor By BlackFox. <a href="http://git.oschina.net/blackfox/kindeditor">Git项目地址</a>.</div>' +
+                '</div>';
+            self.createDialog({
+                name: 'about',
+                width: 350,
+                title: self.lang('about'),
+                body: html
+            });
+        });
+        self.plugin.getSelectedLink = function () {
+            return self.cmd.commonAncestor('a');
+        };
+        self.plugin.getSelectedImage = function () {
+            return _getImageFromRange(self.edit.cmd.range, function (img) {
+                return !/^ke-\w+$/i.test(img[0].className);
+            });
+        };
+        self.plugin.getSelectedFlash = function () {
+            return _getImageFromRange(self.edit.cmd.range, function (img) {
+                return img[0].className == 'ke-flash';
+            });
+        };
+        self.plugin.getSelectedMedia = function () {
+            return _getImageFromRange(self.edit.cmd.range, function (img) {
+                return img[0].className == 'ke-media' || img[0].className == 'ke-rm';
+            });
+        };
+        self.plugin.getSelectedAnchor = function () {
+            return _getImageFromRange(self.edit.cmd.range, function (img) {
+                return img[0].className == 'ke-anchor';
+            });
+        };
+        _each('link,image,flash,media,anchor'.split(','), function (i, name) {
+            var uName = name.charAt(0).toUpperCase() + name.substr(1);
+            _each('edit,delete'.split(','), function (j, val) {
+                self.addContextmenu({
+                    title: self.lang(val + uName),
+                    click: function () {
+                        self.loadPlugin(name, function () {
+                            self.plugin[name][val]();
+                            self.hideMenu();
+                        });
+                    },
+                    cond: self.plugin['getSelected' + uName],
+                    width: 150,
+                    iconClass: val == 'edit' ? 'ke-icon-' + name : undefined
+                });
+            });
+            self.addContextmenu({title: '-'});
+        });
+        self.plugin.getSelectedTable = function () {
+            return self.cmd.commonAncestor('table');
+        };
+        self.plugin.getSelectedRow = function () {
+            return self.cmd.commonAncestor('tr');
+        };
+        self.plugin.getSelectedCell = function () {
+            return self.cmd.commonAncestor('td');
+        };
+        _each(('prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,' +
+            'rowsplit,colsplit,coldelete,rowdelete,insert,delete').split(','), function (i, val) {
+            var cond = _inArray(val, ['prop', 'delete']) < 0 ? self.plugin.getSelectedCell : self.plugin.getSelectedTable;
+            self.addContextmenu({
+                title: self.lang('table' + val),
+                click: function () {
+                    self.loadPlugin('table', function () {
+                        self.plugin.table[val]();
+                        self.hideMenu();
+                    });
+                },
+                cond: cond,
+                width: 170,
+                iconClass: 'ke-icon-table' + val
+            });
+        });
+        self.addContextmenu({title: '-'});
+        _each(('selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
+            'insertunorderedlist,indent,outdent,subscript,superscript,hr,print,' +
+            'bold,italic,underline,strikethrough,removeformat,unlink').split(','), function (i, name) {
+            if (shortcutKeys[name]) {
+                self.afterCreate(function () {
+                    _ctrl(this.edit.doc, shortcutKeys[name], function () {
+                        self.cmd.selection();
+                        self.clickToolbar(name);
+                    });
+                });
+            }
+            self.clickToolbar(name, function () {
+                self.focus().exec(name, null);
+            });
+        });
+        self.afterCreate(function () {
+            var doc = self.edit.doc, cmd, bookmark, div,
+                cls = '__kindeditor_paste__', pasting = false;
+
+            function movePastedData() {
+                cmd.range.moveToBookmark(bookmark);
+                cmd.select();
+                if (_WEBKIT) {
+                    K('div.' + cls, div).each(function () {
+                        K(this).after('<br />').remove(true);
+                    });
+                    K('span.Apple-style-span', div).remove(true);
+                    K('span.Apple-tab-span', div).remove(true);
+                    K('span[style]', div).each(function () {
+                        if (K(this).css('white-space') == 'nowrap') {
+                            K(this).remove(true);
+                        }
+                    });
+                    K('meta', div).remove();
+                }
+                var html = div[0].innerHTML;
+                div.remove();
+                if (html === '') {
+                    return;
+                }
+                if (_WEBKIT) {
+                    html = html.replace(/(<br>)\1/ig, '$1');
+                }
+                if (self.pasteType === 2) {
+                    html = html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig, '');
+                    if (/schemas-microsoft-com|worddocument|mso-\w+/i.test(html)) {
+                        html = _clearMsWord(html, self.filterMode ? self.htmlTags : K.options.htmlTags);
+                    } else {
+                        html = _formatHtml(html, self.filterMode ? self.htmlTags : null);
+                        html = self.beforeSetHtml(html);
+                    }
+                }
+                if (self.pasteType === 1) {
+                    html = html.replace(/&nbsp;/ig, ' ');
+                    html = html.replace(/\n\s*\n/g, '\n');
+                    html = html.replace(/<br[^>]*>/ig, '\n');
+                    html = html.replace(/<\/p><p[^>]*>/ig, '\n');
+                    html = html.replace(/<[^>]+>/g, '');
+                    html = html.replace(/ {2}/g, ' &nbsp;');
+                    if (self.newlineTag == 'p') {
+                        if (/\n/.test(html)) {
+                            html = html.replace(/^/, '<p>').replace(/$/, '<br /></p>').replace(/\n/g, '<br /></p><p>');
+                        }
+                    } else {
+                        html = html.replace(/\n/g, '<br />$&');
+                    }
+                }
+                self.insertHtml(html, true);
+            }
+
+            K(doc.body).bind('paste', function (e) {
+                if (self.pasteType === 0) {
+                    e.stop();
+                    return;
+                }
+                if (pasting) {
+                    return;
+                }
+                pasting = true;
+                K('div.' + cls, doc).remove();
+                cmd = self.cmd.selection();
+                bookmark = cmd.range.createBookmark();
+                div = K('<div class="' + cls + '"></div>', doc).css({
+                    position: 'absolute',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden',
+                    left: '-1981px',
+                    top: K(bookmark.start).pos().y + 'px',
+                    'white-space': 'nowrap'
+                });
+                K(doc.body).append(div);
+                if (_IE) {
+                    var rng = cmd.range.get(true);
+                    rng.moveToElementText(div[0]);
+                    rng.select();
+                    rng.execCommand('paste');
+                    e.preventDefault();
+                } else {
+                    cmd.range.selectNodeContents(div[0]);
+                    cmd.select();
+                    div[0].tabIndex = -1;
+                    div[0].focus();
+                }
+                setTimeout(function () {
+                    movePastedData();
+                    pasting = false;
+                }, 0);
+            });
+        });
+        self.beforeGetHtml(function (html) {
+            if (_IE && _V <= 8) {
+                html = html.replace(/<div\s+[^>]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function (full, tag) {
+                    return unescape(tag);
+                });
+                html = html.replace(/(<input)((?:\s+[^>]*)?>)/ig, function ($0, $1, $2) {
+                    if (!/\s+type="[^"]+"/i.test($0)) {
+                        return $1 + ' type="text"' + $2;
+                    }
+                    return $0;
+                });
+            }
+            return html.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig, function ($0, $1, $2, $3) {
+                return $1 + _unescape($2).replace(/\s+/g, ' ') + $3;
+            })
+                .replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/ig, function (full) {
+                    var imgAttrs = _getAttrList(full);
+                    var styles = _getCssList(imgAttrs.style || '');
+                    var attrs = _mediaAttrs(imgAttrs['data-ke-tag']);
+                    var width = _undef(styles.width, '');
+                    var height = _undef(styles.height, '');
+                    if (/px/i.test(width)) {
+                        width = _removeUnit(width);
+                    }
+                    if (/px/i.test(height)) {
+                        height = _removeUnit(height);
+                    }
+                    attrs.width = _undef(imgAttrs.width, width);
+                    attrs.height = _undef(imgAttrs.height, height);
+                    return _mediaEmbed(attrs);
+                })
+                .replace(/<img[^>]*class="?ke-anchor"?[^>]*>/ig, function (full) {
+                    var imgAttrs = _getAttrList(full);
+                    return '<a name="' + unescape(imgAttrs['data-ke-name']) + '"></a>';
+                })
+                .replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function (full, attr, code) {
+                    return '<script' + unescape(attr) + '>' + unescape(code) + '</script>';
+                })
+                .replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function (full, attr, code) {
+                    return '<noscript' + unescape(attr) + '>' + unescape(code) + '</noscript>';
+                })
+                .replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig, function (full, start, src, end) {
+                    full = full.replace(/(\s+(?:href|src)=")[^"]*(")/i, function ($0, $1, $2) {
+                        return $1 + _unescape(src) + $2;
+                    });
+                    full = full.replace(/\s+data-ke-src="[^"]*"/i, '');
+                    return full;
+                })
+                .replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig, function (full, start, end) {
+                    return start + end;
+                });
+        });
+        self.beforeSetHtml(function (html) {
+            if (_IE && _V <= 8) {
+                html = html.replace(/<input[^>]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/ig, function (full) {
+                    var attrs = _getAttrList(full);
+                    var styles = _getCssList(attrs.style || '');
+                    if (styles.display == 'none') {
+                        return '<div class="ke-display-none" data-ke-input-tag="' + escape(full) + '"></div>';
+                    }
+                    return full;
+                });
+            }
+            return html.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig, function (full) {
+                var attrs = _getAttrList(full);
+                attrs.src = _undef(attrs.src, '');
+                attrs.width = _undef(attrs.width, 0);
+                attrs.height = _undef(attrs.height, 0);
+                return _mediaImg(self.themesPath + 'common/blank.gif', attrs);
+            })
+                .replace(/<video[^>]*type="([^"]+)"[^>]*>(?:<\/video>)?/ig, function (full) {
+                    var attrs = _getAttrList(full);
+                    attrs.src = _undef(attrs.src, '');
+                    attrs.width = _undef(attrs.width, 0);
+                    attrs.height = _undef(attrs.height, 0);
+                    return _mediaImg(self.themesPath + 'common/blank.gif', attrs);
+                })
+                .replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig, function (full) {
+                    var attrs = _getAttrList(full);
+                    if (attrs.href !== undefined) {
+                        return full;
+                    }
+                    return '<img class="ke-anchor" src="' + self.themesPath + 'common/anchor.gif" data-ke-name="' + escape(attrs.name) + '" />';
+                })
+                .replace(/<script([^>]*)>([\s\S]*?)<\/script>/ig, function (full, attr, code) {
+                    return '<div class="ke-script" data-ke-script-attr="' + escape(attr) + '">' + escape(code) + '</div>';
+                })
+                .replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/ig, function (full, attr, code) {
+                    return '<div class="ke-noscript" data-ke-noscript-attr="' + escape(attr) + '">' + escape(code) + '</div>';
+                })
+                .replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig, function (full, start, key, src, end) {
+                    if (full.match(/\sdata-ke-src="[^"]*"/i)) {
+                        return full;
+                    }
+                    full = start + key + '="' + src + '"' + ' data-ke-src="' + _escape(src) + '"' + end;
+                    return full;
+                })
+                .replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig, function (full, start, end) {
+                    return start + 'data-ke-' + end;
+                })
+                .replace(/<table[^>]*\s+border="0"[^>]*>/ig, function (full) {
+                    if (full.indexOf('ke-zeroborder') >= 0) {
+                        return full;
+                    }
+                    return _addClassToTag(full, 'ke-zeroborder');
+                });
+        });
+    });
+
+
+})(window);
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.lang({
+    source: 'HTML代码',
+    preview: '预览',
+    undo: '后退(Ctrl+Z)',
+    redo: '前进(Ctrl+Y)',
+    cut: '剪切(Ctrl+X)',
+    copy: '复制(Ctrl+C)',
+    paste: '粘贴(Ctrl+V)',
+    plainpaste: '粘贴为无格式文本',
+    wordpaste: '从Word粘贴',
+    selectall: '全选(Ctrl+A)',
+    justifyleft: '左对齐',
+    justifycenter: '居中',
+    justifyright: '右对齐',
+    justifyfull: '两端对齐',
+    insertorderedlist: '编号',
+    insertunorderedlist: '项目符号',
+    indent: '增加缩进',
+    outdent: '减少缩进',
+    subscript: '下标',
+    superscript: '上标',
+    formatblock: '段落',
+    fontname: '字体',
+    fontsize: '文字大小',
+    forecolor: '文字颜色',
+    hilitecolor: '文字背景',
+    bold: '粗体(Ctrl+B)',
+    italic: '斜体(Ctrl+I)',
+    underline: '下划线(Ctrl+U)',
+    strikethrough: '删除线',
+    removeformat: '删除格式',
+    image: '图片',
+    multiimage: '批量图片上传',
+    graft: '涂鸦',
+    flash: 'Flash',
+    media: '视音频',
+    table: '表格',
+    tablecell: '单元格',
+    hr: '插入横线',
+    emoticons: '插入表情',
+    link: '超级链接',
+    unlink: '取消超级链接',
+    fullscreen: '全屏显示',
+    about: '关于',
+    print: '打印(Ctrl+P)',
+    filemanager: '文件空间',
+    code: '插入程序代码',
+    quote: '插入引用',
+    map: 'Google地图',
+    baidumap: '百度地图',
+    lineheight: '行距',
+    clearhtml: '清理HTML代码',
+    pagebreak: '插入分页符',
+    quickformat: '一键排版',
+    insertfile: '插入文件',
+    template: '插入模板',
+    anchor: '锚点',
+    yes: '确定',
+    no: '取消',
+    close: '关闭',
+    editImage: '图片属性',
+    deleteImage: '删除图片',
+    editFlash: 'Flash属性',
+    deleteFlash: '删除Flash',
+    editMedia: '视音频属性',
+    deleteMedia: '删除视音频',
+    editLink: '超级链接属性',
+    deleteLink: '取消超级链接',
+    editAnchor: '锚点属性',
+    deleteAnchor: '删除锚点',
+    tableprop: '表格属性',
+    tablecellprop: '单元格属性',
+    tableinsert: '插入表格',
+    tabledelete: '删除表格',
+    tablecolinsertleft: '左侧插入列',
+    tablecolinsertright: '右侧插入列',
+    tablerowinsertabove: '上方插入行',
+    tablerowinsertbelow: '下方插入行',
+    tablerowmerge: '向下合并单元格',
+    tablecolmerge: '向右合并单元格',
+    tablerowsplit: '拆分行',
+    tablecolsplit: '拆分列',
+    tablecoldelete: '删除列',
+    tablerowdelete: '删除行',
+    noColor: '无颜色',
+    pleaseSelectFile: '请选择文件。',
+    invalidImg: "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。",
+    invalidMedia: "请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
+    invalidWidth: "宽度必须为数字。",
+    invalidHeight: "高度必须为数字。",
+    invalidBorder: "边框必须为数字。",
+    invalidUrl: "请输入有效的URL地址。",
+    invalidRows: '行数为必选项,只允许输入大于0的数字。',
+    invalidCols: '列数为必选项,只允许输入大于0的数字。',
+    invalidPadding: '边距必须为数字。',
+    invalidSpacing: '间距必须为数字。',
+    invalidJson: '服务器发生故障。',
+    uploadSuccess: '上传成功。',
+    cutError: '您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。',
+    copyError: '您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。',
+    pasteError: '您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。',
+    ajaxLoading: '加载中,请稍候 ...',
+    uploadLoading: '上传中,请稍候 ...',
+    uploadError: '上传错误',
+    'plainpaste.comment': '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+    'wordpaste.comment': '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+    'code.pleaseInput': '请输入程序代码。',
+    'link.url': 'URL',
+    'link.linkType': '打开类型',
+    'link.newWindow': '新窗口',
+    'link.selfWindow': '当前窗口',
+    'flash.url': 'URL',
+    'flash.width': '宽度',
+    'flash.height': '高度',
+    'flash.upload': '上传',
+    'flash.viewServer': '文件空间',
+    'media.url': 'URL',
+    'media.width': '宽度',
+    'media.height': '高度',
+    'media.autostart': '自动播放',
+    'media.upload': '上传',
+    'media.viewServer': '文件空间',
+    'image.remoteImage': '网络图片',
+    'image.localImage': '本地上传',
+    'image.remoteUrl': '图片地址',
+    'image.localUrl': '上传文件',
+    'image.size': '图片大小',
+    'image.width': '宽',
+    'image.height': '高',
+    'image.resetSize': '重置大小',
+    'image.align': '对齐方式',
+    'image.defaultAlign': '默认方式',
+    'image.leftAlign': '左对齐',
+    'image.rightAlign': '右对齐',
+    'image.imgTitle': '图片说明',
+    'image.upload': '浏览...',
+    'image.viewServer': '图片空间',
+    'multiimage.title': '多图上传',
+    'multiimage.uploadDesc': '共选择了 <%=numSelect%> 张图片,共 <%=totalSize%>, 还可以添加 <%=numLeft%> 张图片.',
+    'multiimage.startUpload': '开始上传',
+    'multiimage.noListUrl': '无法获取图片,请先配置 fileManagerJson.',
+    'multiimage.noSearchUrl': '无法进行图片搜索,请先配置 imageSearchJson.',
+    'multiimage.noDataText': '(⊙o⊙)亲,没有多数据了。',
+    'multiimage.closeText': '关闭对话框',
+    'multiimage.confirmBtnText': '确定',
+    'multiimage.cancelBtnText': '取消',
+    'multiimage.loadMoreData': '往下拉动滚动条可以加载更多数据.',
+    'multiimage.depJQueryError': '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+    'multiimage.localUpload': '本地上传',
+    'multiimage.fileServer': '文件服务器',
+    'multiimage.imgSearch': '图片搜索',
+    'multiimage.selectFile': '点击选择图片',
+    'multiimage.continueAdd': '继续添加',
+    'multiimage.searchBtn': '搜索一下',
+    'multiimage.searchPlaceholder': '请输入搜索关键词',
+    'multiimage.searchClear': '清空搜索',
+    'multiimage.noFileAdded': '请至少添加一个文件!',
+    'multiimage.uploading': '正在上传',
+    'multiimage.fileNotUpload': '您还有文件没有上传!',
+    'multiimage.uploadLimit': '您本次最多上传 <%=uploadLimit%> 个文件.',
+    'multiimage.sizeLimit': '文件大小不能超过 <%=sizeLimit%> KB.',
+    'multiimage.invalidExt': '非法的文件后缀 <%=invalidExt%>.',
+    'multiimage.remove': '删除',
+    'multiimage.rotateRight': '向右旋转',
+    'multiimage.rotateLeft': '向左旋转',
+    'multiimage.uploadFail': '发生异常,上传失败!',
+    'multiimage.noFileSelected': '请至少选择一个文件或一张图片.',
+    'filemanager.noDataText': '(⊙o⊙)亲,没有多数据了。',
+    'filemanager.title': '文件服务器',
+    'filemanager.noListUrl': '无法获取图片,请先配置 fileManagerJson.',
+    'filemanager.closeText': '关闭对话框',
+    'filemanager.confirmBtnText': '确定',
+    'filemanager.cancelBtnText': '取消',
+    'filemanager.loadMoreData': '往下拉动滚动条可以加载更多数据.',
+    'filemanager.depJQueryError': '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+    'filemanager.fileType': '类型',
+    'graft.btnText': '保存并插入涂鸦',
+    'graft.uploadSuccess': '涂鸦上传成功',
+    'graft.uploadFaild': '涂鸦上传失败',
+    'graft.empty': '您没有在画布上绘制任何图像',
+    'insertfile.url': 'URL',
+    'insertfile.title': '文件说明',
+    'insertfile.upload': '上传',
+    'insertfile.viewServer': '文件空间',
+    'table.cells': '单元格数',
+    'table.rows': '行数',
+    'table.cols': '列数',
+    'table.size': '大小',
+    'table.width': '宽度',
+    'table.height': '高度',
+    'table.percent': '%',
+    'table.px': 'px',
+    'table.space': '边距间距',
+    'table.padding': '边距',
+    'table.spacing': '间距',
+    'table.align': '对齐方式',
+    'table.textAlign': '水平对齐',
+    'table.verticalAlign': '垂直对齐',
+    'table.alignDefault': '默认',
+    'table.alignLeft': '左对齐',
+    'table.alignCenter': '居中',
+    'table.alignRight': '右对齐',
+    'table.alignTop': '顶部',
+    'table.alignMiddle': '中部',
+    'table.alignBottom': '底部',
+    'table.alignBaseline': '基线',
+    'table.border': '边框',
+    'table.borderWidth': '宽度',
+    'table.borderColor': '颜色',
+    'table.backgroundColor': '背景颜色',
+    'map.address': '地址: ',
+    'map.search': '搜索',
+    'baidumap.address': '地址: ',
+    'baidumap.search': '搜索',
+    'baidumap.insertDynamicMap': '插入动态地图',
+    'anchor.name': '锚点名称',
+    'formatblock.formatBlock': {
+        h1: '标题 1',
+        h2: '标题 2',
+        h3: '标题 3',
+        h4: '标题 4',
+        p: '正 文'
+    },
+    'fontname.fontName': {
+        'SimSun': '宋体',
+        'NSimSun': '新宋体',
+        'FangSong': '仿宋',
+        'KaiTi': '楷体',
+        'SimHei': '黑体',
+        'Microsoft YaHei': '微软雅黑',
+        'Arial': 'Arial',
+        'Arial Black': 'Arial Black',
+        'Times New Roman': 'Times New Roman',
+        'Courier New': 'Courier New',
+        'Tahoma': 'Tahoma',
+        'Verdana': 'Verdana'
+    },
+    'lineheight.lineHeight': [
+        {'1': '单倍行距'},
+        {'1.5': '1.5倍行距'},
+        {'2': '2倍行距'},
+        {'2.5': '2.5倍行距'},
+        {'3': '3倍行距'}
+    ],
+    'template.selectTemplate': '可选模板',
+    'template.replaceContent': '替换当前内容',
+    'template.fileList': {
+        '1.html': '图片和文字',
+        '2.html': '表格',
+        '3.html': '项目编号'
+    }
+}, 'zh-CN');
+KindEditor.options.langType = 'zh-CN';
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('anchor', function (K) {
+    var self = this, name = 'anchor', lang = self.lang(name + '.');
+    self.plugin.anchor = {
+        edit: function () {
+            var html = ['<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keName">' + lang.name + ':</label>',
+                '<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',
+                '</div>',
+                '</div>'].join('');
+            var dialog = self.createDialog({
+                name: name,
+                width: 300,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus();
+                    }
+                }
+            });
+            var div = dialog.div,
+                nameBox = K('input[name="name"]', div);
+            var img = self.plugin.getSelectedAnchor();
+            if (img) {
+                nameBox.val(unescape(img.attr('data-ke-name')));
+            }
+            nameBox[0].focus();
+            nameBox[0].select();
+        },
+        'delete': function () {
+            self.plugin.getSelectedAnchor().remove();
+        }
+    };
+    self.clickToolbar(name, self.plugin.anchor.edit);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('autoheight', function (K) {
+    var self = this;
+    if (!self.autoHeightMode) {
+        return;
+    }
+    var minHeight;
+
+    function hideScroll() {
+        var edit = self.edit;
+        var body = edit.doc.body;
+        edit.iframe[0].scroll = 'no';
+        body.style.overflowY = 'hidden';
+    }
+
+    function resetHeight() {
+        if (self.fullscreenMode) {
+            return;
+        }
+        var edit = self.edit;
+        var body = edit.doc.body;
+        edit.iframe.height(minHeight);
+        self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 76, minHeight));
+    }
+
+    function init() {
+        minHeight = K.removeUnit(self.height);
+        self.edit.afterChange(resetHeight);
+        if (!self.fullscreenMode) {
+            hideScroll();
+        }
+        resetHeight();
+    }
+
+    if (self.isCreated) {
+        init();
+    } else {
+        self.afterCreate(init);
+    }
+});
+/*
+* 如何实现真正的自动高度?
+* 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。
+* 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。
+* 由此就实现了真正的自动高度
+* 测试:chrome、firefox、IE9、IE8
+* */
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('baidumap', function (K) {
+    var self = this, name = 'baidumap', lang = self.lang(name + '.');
+    var mapWidth = K.undef(self.mapWidth, 558);
+    var mapHeight = K.undef(self.mapHeight, 360);
+    self.clickToolbar(name, function () {
+        var html = ['<div class="ke-dialog-content-inner" style="padding-top: 0">',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<div class="ke-header">' + lang.address,
+            '<input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+            '<span>',
+            '<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" style="line-height:22px;padding:0 10px;" />',
+            '</span>',
+            '<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" style="display:inline-block;" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>',
+            '</div>',
+            '</div>',
+            '<div class="ke-map" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></div>',
+            '</div>'].join('');
+        var dialog = self.createDialog({
+            name: name,
+            width: mapWidth + 42,
+            title: self.lang(name),
+            body: html,
+            yesBtn: {
+                name: self.lang('yes'),
+                click: function (e) {
+                    var map = win.map;
+                    var centerObj = map.getCenter();
+                    var center = centerObj.lng + ',' + centerObj.lat;
+                    var zoom = map.getZoom();
+                    var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'https://api.map.baidu.com/staticimage',
+                        '?center=' + encodeURIComponent(center),
+                        '&zoom=' + encodeURIComponent(zoom),
+                        '&width=' + mapWidth,
+                        '&height=' + mapHeight,
+                        '&markers=' + encodeURIComponent(center),
+                        '&markerStyles=' + encodeURIComponent('l,A')].join('');
+                    if (checkbox[0].checked) {
+                        self.insertHtml('<iframe src="' + url + '" frameborder="0" style="width:' + (mapWidth + 2) + 'px;height:' + (mapHeight + 2) + 'px;"></iframe>');
+                    } else {
+                        self.exec('insertimage', url);
+                    }
+                    self.hideDialog().focus();
+                }
+            },
+            beforeRemove: function () {
+                searchBtn.remove();
+                if (doc) {
+                    doc.write('');
+                }
+                iframe.remove();
+            }
+        });
+        var div = dialog.div,
+            addressBox = K('[name="address"]', div),
+            searchBtn = K('[name="searchBtn"]', div),
+            checkbox = K('[name="insertDynamicMap"]', dialog.div),
+            win, doc;
+        var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></iframe>');
+
+        function ready() {
+            win = iframe[0].contentWindow;
+            doc = K.iframeDoc(iframe);
+        }
+
+        iframe.bind('load', function () {
+            iframe.unbind('load');
+            if (K.IE) {
+                ready();
+            } else {
+                setTimeout(ready, 0);
+            }
+        });
+        K('.ke-map', div).replaceWith(iframe);
+        searchBtn.click(function () {
+            win.search(addressBox.val());
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+
+
+KindEditor.plugin('map', function (K) {
+    var self = this, name = 'map', lang = self.lang(name + '.');
+    self.clickToolbar(name, function () {
+        var html = ['<div style="padding:10px 20px;">',
+            '<div class="ke-dialog-row">',
+            lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+            '<span class="ke-button-common ke-button-outer">',
+            '<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
+            '</span>',
+            '</div>',
+            '<div class="ke-map" style="width:558px;height:360px;"></div>',
+            '</div>'].join('');
+        var dialog = self.createDialog({
+            name: name,
+            width: 600,
+            title: self.lang(name),
+            body: html,
+            yesBtn: {
+                name: self.lang('yes'),
+                click: function (e) {
+                    var geocoder = win.geocoder,
+                        map = win.map,
+                        center = map.getCenter().lat() + ',' + map.getCenter().lng(),
+                        zoom = map.getZoom(),
+                        maptype = map.getMapTypeId(),
+                        url = 'https://maps.googleapis.com/maps/api/staticmap';
+                    url += '?center=' + encodeURIComponent(center);
+                    url += '&zoom=' + encodeURIComponent(zoom);
+                    url += '&size=558x360';
+                    url += '&maptype=' + encodeURIComponent(maptype);
+                    url += '&markers=' + encodeURIComponent(center);
+                    url += '&language=' + self.langType;
+                    url += '&sensor=false';
+                    self.exec('insertimage', url).hideDialog().focus();
+                }
+            },
+            beforeRemove: function () {
+                searchBtn.remove();
+                if (doc) {
+                    doc.write('');
+                }
+                iframe.remove();
+            }
+        });
+        var div = dialog.div,
+            addressBox = K('[name="address"]', div),
+            searchBtn = K('[name="searchBtn"]', div),
+            win, doc;
+        var iframeHtml = ['<!doctype html><html><head>',
+            '<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',
+            '<style>',
+            '	html { height: 100% }',
+            '	body { height: 100%; margin: 0; padding: 0; background-color: #FFF }',
+            '	#map_canvas { height: 100% }',
+            '</style>',
+            '<script src="https://maps.googleapis.com/maps/api/js?sensor=false&language=' + self.langType + '"></script>',
+            '<script>',
+            'var map, geocoder;',
+            'function initialize() {',
+            '	var latlng = new google.maps.LatLng(31.230393, 121.473704);',
+            '	var options = {',
+            '		zoom: 11,',
+            '		center: latlng,',
+            '		disableDefaultUI: true,',
+            '		panControl: true,',
+            '		zoomControl: true,',
+            '		mapTypeControl: true,',
+            '		scaleControl: true,',
+            '		streetViewControl: false,',
+            '		overviewMapControl: true,',
+            '		mapTypeId: google.maps.MapTypeId.ROADMAP',
+            '	};',
+            '	map = new google.maps.Map(document.getElementById("map_canvas"), options);',
+            '	geocoder = new google.maps.Geocoder();',
+            '	geocoder.geocode({latLng: latlng}, function(results, status) {',
+            '		if (status == google.maps.GeocoderStatus.OK) {',
+            '			if (results[3]) {',
+            '				parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',
+            '			}',
+            '		}',
+            '	});',
+            '}',
+            'function search(address) {',
+            '	if (!map) return;',
+            '	geocoder.geocode({address : address}, function(results, status) {',
+            '		if (status == google.maps.GeocoderStatus.OK) {',
+            '			map.setZoom(11);',
+            '			map.setCenter(results[0].geometry.location);',
+            '			var marker = new google.maps.Marker({',
+            '				map: map,',
+            '				position: results[0].geometry.location',
+            '			});',
+            '		} else {',
+            '			alert("Invalid address: " + address);',
+            '		}',
+            '	});',
+            '}',
+            '</script>',
+            '</head>',
+            '<body onload="initialize();">',
+            '<div id="map_canvas" style="width:100%; height:100%"></div>',
+            '</body></html>'].join('\n');
+        var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'map/map.html" style="width:558px;height:360px;"></iframe>');
+
+        function ready() {
+            win = iframe[0].contentWindow;
+            doc = K.iframeDoc(iframe);
+        }
+
+        iframe.bind('load', function () {
+            iframe.unbind('load');
+            if (K.IE) {
+                ready();
+            } else {
+                setTimeout(ready, 0);
+            }
+        });
+        K('.ke-map', div).replaceWith(iframe);
+        searchBtn.click(function () {
+            win.search(addressBox.val());
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('clearhtml', function (K) {
+    var self = this, name = 'clearhtml';
+    self.clickToolbar(name, function () {
+        self.focus();
+        var html = self.html();
+        html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, '');
+        html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, '');
+        html = K.formatHtml(html, {
+            a: ['href', 'target'],
+            embed: ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess', 'controls'],
+            img: ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'],
+            table: ['border'],
+            'td,th': ['rowspan', 'colspan'],
+            'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6': []
+        });
+        self.html(html);
+        self.cmd.selection(true);
+        self.addBookmark();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+
+
+
+KindEditor.plugin('code', function (K) {
+    var self = this, name = 'code';
+    self.clickToolbar(name, function () {
+        var lang = self.lang(name + '.'),
+            html = ['<div style="margin: 0px 20px;">',
+                '<div class="ke-dialog-row">',
+                '<select class="ke-select" style="margin-bottom: 5px;">',
+                '<option value="javascript">JavaScript</option>',
+                '<option value="html">HTML</option>',
+                '<option value="css">CSS</option>',
+                '<option value="php">PHP</option>',
+                '<option value="perl">Perl</option>',
+                '<option value="python">Python</option>',
+                '<option value="ruby">Ruby</option>',
+                '<option value="java">Java</option>',
+                '<option value="go">Go</option>',
+                '<option value="asp">ASP/VB</option>',
+                '<option value="csharp">C#</option>',
+                '<option value="cpp">C/C++</option>',
+                '<option value="cs">C#</option>',
+                '<option value="bash">Shell</option>',
+                '<option value="sql">SQL</option>',
+                '<option value="markup">Other</option>',
+                '</select>',
+                '</div>',
+                '<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
+                '</div>'].join(''),
+            dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var type = K('.ke-select', dialog.div).val(),
+                            code = textarea.val(),
+                            cls = type === '' ? '' : 'language-' + type,
+                            html = '<pre class="' + cls + '"><code>' + K.escape(code) + '</code></pre> <br/>';
+                        if (K.trim(code) === '') {
+                            K.options.errorMsgHandler(lang.pleaseInput, "error");
+                            textarea[0].focus();
+                            return;
+                        }
+                        self.insertHtml(html).hideDialog().focus();
+                    }
+                }
+            }),
+            textarea = K('textarea', dialog.div);
+        textarea[0].focus();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('emoticons', function (K) {
+    var self = this, name = 'emoticons',
+        path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'),
+        allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons,
+        currentPageNum = 1;
+    self.clickToolbar(name, function () {
+        var rows = 5, cols = 9, total = 135, startNum = 0,
+            cells = rows * cols, pages = Math.ceil(total / cells),
+            colsHalf = Math.floor(cols / 2),
+            wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'),
+            elements = [],
+            menu = self.createMenu({
+                name: name,
+                beforeRemove: function () {
+                    removeEvent();
+                }
+            });
+        menu.div.append(wrapperDiv);
+        var previewDiv, previewImg;
+        if (allowPreview) {
+            previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
+            previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />');
+            wrapperDiv.append(previewDiv);
+            previewDiv.append(previewImg);
+        }
+
+        function bindCellEvent(cell, j, num) {
+            if (previewDiv) {
+                cell.mouseover(function () {
+                    if (j > colsHalf) {
+                        previewDiv.css('left', 0);
+                        previewDiv.css('right', '');
+                    } else {
+                        previewDiv.css('left', '');
+                        previewDiv.css('right', 0);
+                    }
+                    previewImg.attr('src', path + num + '.gif');
+                    K(this).addClass('ke-on');
+                });
+            } else {
+                cell.mouseover(function () {
+                    K(this).addClass('ke-on');
+                });
+            }
+            cell.mouseout(function () {
+                K(this).removeClass('ke-on');
+            });
+            cell.click(function (e) {
+                self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus();
+                e.stop();
+            });
+        }
+
+        function createEmoticonsTable(pageNum, parentDiv) {
+            var table = document.createElement('table');
+            parentDiv.append(table);
+            if (previewDiv) {
+                K(table).mouseover(function () {
+                    previewDiv.show('block');
+                });
+                K(table).mouseout(function () {
+                    previewDiv.hide();
+                });
+                elements.push(K(table));
+            }
+            table.className = 'ke-table';
+            table.cellPadding = 0;
+            table.cellSpacing = 0;
+            table.border = 0;
+            var num = (pageNum - 1) * cells + startNum;
+            for (var i = 0; i < rows; i++) {
+                var row = table.insertRow(i);
+                for (var j = 0; j < cols; j++) {
+                    var cell = K(row.insertCell(j));
+                    cell.addClass('ke-cell');
+                    bindCellEvent(cell, j, num);
+                    var span = K('<span class="ke-img"></span>')
+                        .css('background-position', '-' + (24 * num) + 'px 0px')
+                        .css('background-image', 'url(' + path + 'static.gif)');
+                    cell.append(span);
+                    elements.push(cell);
+                    num++;
+                }
+            }
+            return table;
+        }
+
+        var table = createEmoticonsTable(currentPageNum, wrapperDiv);
+
+        function removeEvent() {
+            K.each(elements, function () {
+                this.unbind();
+            });
+        }
+
+        var pageDiv;
+
+        function bindPageEvent(el, pageNum) {
+            el.click(function (e) {
+                removeEvent();
+                table.parentNode.removeChild(table);
+                pageDiv.remove();
+                table = createEmoticonsTable(pageNum, wrapperDiv);
+                createPageTable(pageNum);
+                currentPageNum = pageNum;
+                e.stop();
+            });
+        }
+
+        function createPageTable(currentPageNum) {
+            pageDiv = K('<div class="ke-page"></div>');
+            wrapperDiv.append(pageDiv);
+            for (var pageNum = 1; pageNum <= pages; pageNum++) {
+                if (currentPageNum !== pageNum) {
+                    var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
+                    bindPageEvent(a, pageNum);
+                    pageDiv.append(a);
+                    elements.push(a);
+                } else {
+                    pageDiv.append(K('@[' + pageNum + ']'));
+                }
+                pageDiv.append(K('@&nbsp;'));
+            }
+        }
+
+        createPageTable(currentPageNum);
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('flash', function (K) {
+    var self = this, name = 'flash', lang = self.lang(name + '.'),
+        allowFlashUpload = K.undef(self.allowFlashUpload, true),
+        allowFileManager = K.undef(self.allowFileManager, false),
+        formatUploadUrl = K.undef(self.formatUploadUrl, true),
+        extraParams = K.undef(self.extraFileUploadParams, {}),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+    self.plugin.flash = {
+        edit: function () {
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+                '<div class="row-right">',
+                '<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+                '<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+                '<span class="ke-button-common ke-button-outer">',
+                '<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+                '</span>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keWidth" class="row-left">' + lang.width + ':</label>',
+                '<div class="row-right">',
+                '<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keHeight" class="row-left">' + lang.height + ':</label>',
+                '<div class="row-right">',
+                '<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 450,
+                    title: self.lang(name),
+                    body: html,
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var url = K.trim(urlBox.val()),
+                                width = widthBox.val(),
+                                height = heightBox.val();
+                            if (url == 'http://' || K.invalidUrl(url)) {
+                                K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                                urlBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(width)) {
+                                K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                                widthBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(height)) {
+                                K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                                heightBox[0].focus();
+                                return;
+                            }
+                            var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+                                src: url,
+                                type: K.mediaType('.swf'),
+                                width: width,
+                                height: height,
+                                quality: 'high'
+                            });
+                            self.insertHtml(html).hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div,
+                urlBox = K('[name="url"]', div),
+                viewServerBtn = K('[name="viewServer"]', div),
+                widthBox = K('[name="width"]', div),
+                heightBox = K('[name="height"]', div);
+            urlBox.val('http://');
+            if (allowFlashUpload) {
+                var callback = function (data) {
+                    dialog.hideLoading();
+                    if (data.code === "000") {
+                        var url = data.data.url;
+                        if (formatUploadUrl) {
+                            url = K.formatUrl(url, 'absolute');
+                        }
+                        urlBox.val(url);
+                        if (self.afterUpload) {
+                            self.afterUpload.call(self, url, data, name);
+                        }
+                        //K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+                    } else {
+                        K.options.errorMsgHandler(data.message, "error");
+                    }
+                };
+                var uploadbutton = K.uploadbutton({
+                    button: K('.ke-upload-button', div)[0],
+                    fieldName: filePostName,
+                    extraParams: extraParams,
+                    url: K.addParam(uploadJson, 'fileType=flash'),
+                    beforeUpload: function () {
+                        if (typeof self.beforeUpload == 'function') {
+                            self.beforeUpload.call(this, callback);
+                            return false;
+                        } else {
+                            return true;
+                        }
+                    },
+                    afterUpload: function (data) {
+                        callback(data);
+                    },
+                    afterError: function (html) {
+                        dialog.hideLoading();
+                        self.errorDialog(html);
+                    }
+                });
+                uploadbutton.fileBox.change(function (e) {
+                    dialog.showLoading(self.lang('uploadLoading'));
+                    uploadbutton.submit();
+                });
+            } else {
+                K('.ke-upload-button', div).hide();
+            }
+            if (allowFileManager) {
+                viewServerBtn.click(function (e) {
+                    self.loadPlugin('filemanager', function () {
+                        self.plugin.filemanagerDialog({
+                            dirName: 'flash',
+                            clickFn: function (url) {
+                                K('[name="url"]', div).val(url);
+                                if (self.afterSelectFile) {
+                                    self.afterSelectFile.call(self, url);
+                                }
+                            }
+                        });
+                    });
+                });
+            } else {
+                K('[name="url"]').css("width", "250px");
+                viewServerBtn.hide();
+            }
+            var img = self.plugin.getSelectedFlash();
+            if (img) {
+                var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+                urlBox.val(attrs.src);
+                widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+                heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+            }
+            urlBox[0].focus();
+            urlBox[0].select();
+        },
+        'delete': function () {
+            self.plugin.getSelectedFlash().remove();
+            self.addBookmark();
+        }
+    };
+    self.clickToolbar(name, self.plugin.flash.edit);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('image', function (K) {
+    var self = this, name = 'image',
+        allowImageUpload = K.undef(self.allowImageUpload, true),
+        allowImageRemote = K.undef(self.allowImageRemote, true),
+        formatUploadUrl = K.undef(self.formatUploadUrl, true),
+        allowFileManager = K.undef(self.allowFileManager, false),
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+        imageTabIndex = K.undef(self.imageTabIndex, 0),
+        imgPath = self.pluginsPath + 'image/images/',
+        extraParams = K.undef(self.extraFileUploadParams, {}),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false),
+        lang = self.lang(name + '.');
+    self.plugin.imageDialog = function (options) {
+        var imageUrl = options.imageUrl,
+            imageWidth = K.undef(options.imageWidth, ''),
+            imageHeight = K.undef(options.imageHeight, ''),
+            imageTitle = K.undef(options.imageTitle, ''),
+            imageAlign = K.undef(options.imageAlign, ''),
+            showRemote = K.undef(options.showRemote, true),
+            showLocal = K.undef(options.showLocal, true),
+            tabIndex = K.undef(options.tabIndex, 0),
+            clickFn = options.clickFn;
+        var target = 'kindeditor_upload_iframe_' + new Date().getTime();
+        var hiddenElements = [];
+        for (var k in extraParams) {
+            hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+        }
+        var html = [
+            '<div class="ke-dialog-content-inner">',
+            '<div class="tabs"></div>',
+            '<div class="tab1" style="display:none;">',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label for="remoteUrl" class="row-left">' + lang.remoteUrl + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:250px;" /> &nbsp;',
+            '<span class="ke-button-common ke-button-outer">',
+            '<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+            '</span>',
+            '</div>',
+            '</div>',
+            '<div class="ke-dialog-row ke-clearfix ">',
+            '<label for="remoteWidth" class="row-left">' + lang.size + ':</label>',
+            '<div class="row-right">' + lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',
+            lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ',
+            '<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />',
+            '</div>',
+            '</div>',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label class="row-left">' + lang.align + ':</label>',
+            '<div class="row-right">',
+            '<span><input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> ' +
+            '<img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" /></span>',
+            ' <span><input type="radio" name="align" class="ke-inline-block" value="left" /> ' +
+            '<img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" /></span>',
+            ' <span><input type="radio" name="align" class="ke-inline-block" value="right" /> ' +
+            '<img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" /></span>',
+            '</div>',
+            '</div>',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label for="remoteTitle" class="row-left">' + lang.imgTitle + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:250px;" />',
+            '</div>',
+            '</div>',
+            '</div>',
+            '<div class="tab2" style="display:none;">',
+            '<iframe name="' + target + '" style="display:none;"></iframe>',
+            '<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'fileType=image') + '">',
+            '<div class="ke-dialog-row ke-clearfix">',
+            hiddenElements.join(''),
+            '<label class="row-left">' + lang.localUrl + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:250px;" readonly="true" /> &nbsp;',
+            '<input type="button" class="ke-upload-button" value="' + lang.upload + '" />',
+            '</div>',
+            '</div>',
+            '</form>',
+            '</div>',
+            '</div>'
+        ].join('');
+        var dialogWidth = showLocal || allowFileManager ? 450 : 400,
+            dialogHeight = showLocal && showRemote ? 310 : 260;
+        var dialog = self.createDialog({
+                name: name,
+                width: dialogWidth,
+                height: dialogHeight,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        if (dialog.isLoading) {
+                            return;
+                        }
+                        if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) {
+                            if (uploadbutton.fileBox.val() == '') {
+                                K.options.errorMsgHandler(self.lang('pleaseSelectFile'), "error");
+                                return;
+                            }
+                            dialog.showLoading(self.lang('uploadLoading'));
+                            uploadbutton.submit();
+                            localUrlBox.val('');
+                            return;
+                        }
+                        var url = K.trim(urlBox.val()),
+                            width = widthBox.val(),
+                            height = heightBox.val(),
+                            title = titleBox.val(),
+                            align = '';
+                        alignBox.each(function () {
+                            if (this.checked) {
+                                align = this.value;
+                                return false;
+                            }
+                        });
+                        if (url == 'http://' || K.invalidUrl(url)) {
+                            K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                            urlBox[0].focus();
+                            return;
+                        }
+                        if (!/^\d*$/.test(width)) {
+                            K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                            widthBox[0].focus();
+                            return;
+                        }
+                        if (!/^\d*$/.test(height)) {
+                            K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                            heightBox[0].focus();
+                            return;
+                        }
+                        clickFn.call(self, url, title, width, height, 0, align);
+                    }
+                },
+                beforeRemove: function () {
+                    viewServerBtn.unbind();
+                    widthBox.unbind();
+                    heightBox.unbind();
+                    refreshBtn.unbind();
+                }
+            }),
+            div = dialog.div;
+        var urlBox = K('[name="url"]', div),
+            localUrlBox = K('[name="localUrl"]', div),
+            viewServerBtn = K('[name="viewServer"]', div),
+            widthBox = K('.tab1 [name="width"]', div),
+            heightBox = K('.tab1 [name="height"]', div),
+            refreshBtn = K('.ke-refresh-btn', div),
+            titleBox = K('.tab1 [name="title"]', div),
+            alignBox = K('.tab1 [name="align"]', div);
+        var tabs;
+        if (showRemote && showLocal) {
+            tabs = K.tabs({
+                src: K('.tabs', div),
+                afterSelect: function (i) {
+                }
+            });
+            tabs.add({
+                title: lang.remoteImage,
+                panel: K('.tab1', div)
+            });
+            tabs.add({
+                title: lang.localImage,
+                panel: K('.tab2', div)
+            });
+            tabs.select(tabIndex);
+        } else if (showRemote) {
+            K('.tab1', div).show();
+        } else if (showLocal) {
+            K('.tab2', div).show();
+        }
+        var callback = function (data) {
+            if (data.code == "000") {
+                dialog.hideLoading();
+                //K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+                var url = data.data.url;
+                if (formatUploadUrl) {
+                    url = K.formatUrl(url, 'absolute');
+                }
+                if (!fillDescAfterUploadImage) {
+                    clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align);
+                } else {
+                    K(".ke-dialog-row #remoteUrl", div).val(url);
+                    K(".ke-tabs-li", div)[0].click();
+                    K(".ke-refresh-btn", div).click();
+                }
+            } else {
+                K.options.errorMsgHandler(data.message, "error");
+            }
+        };
+        var uploadbutton = K.uploadbutton({
+            button: K('.ke-upload-button', div)[0],
+            fieldName: filePostName,
+            form: K('.ke-form', div),
+            target: target,
+            width: 60,
+            beforeUpload: function () {
+                if (typeof self.beforeUpload == 'function') {
+                    self.beforeUpload.call(this, callback);
+                    return false;
+                } else {
+                    return true;
+                }
+            },
+            afterUpload: function (data) {
+                callback(data);
+            },
+            afterError: function (html) {
+                dialog.hideLoading();
+                self.errorDialog(html);
+            }
+        });
+        uploadbutton.fileBox.change(function (e) {
+            localUrlBox.val(uploadbutton.fileBox.val());
+        });
+        if (allowFileManager) {
+            viewServerBtn.click(function (e) {
+                self.loadPlugin('filemanager', function () {
+                    self.plugin.filemanagerDialog({
+                        dirName: 'image',
+                        clickFn: function (url) {
+                            K('[name="url"]', div).val(url);
+                            if (self.afterSelectFile) {
+                                self.afterSelectFile.call(self, url);
+                            }
+                        }
+                    });
+                });
+            });
+        } else {
+            viewServerBtn.hide();
+        }
+        var originalWidth = 0, originalHeight = 0;
+
+        function setSize(width, height) {
+            widthBox.val(width);
+            heightBox.val(height);
+            originalWidth = width;
+            originalHeight = height;
+        }
+
+        refreshBtn.click(function (e) {
+            var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({
+                position: 'absolute',
+                visibility: 'hidden',
+                top: 0,
+                left: '-1000px'
+            });
+            tempImg.bind('load', function () {
+                setSize(tempImg.width(), tempImg.height());
+                tempImg.remove();
+            });
+            K(document.body).append(tempImg);
+        });
+        widthBox.change(function (e) {
+            if (originalWidth > 0) {
+                heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10)));
+            }
+        });
+        heightBox.change(function (e) {
+            if (originalHeight > 0) {
+                widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10)));
+            }
+        });
+        urlBox.val(options.imageUrl);
+        setSize(options.imageWidth, options.imageHeight);
+        titleBox.val(options.imageTitle);
+        alignBox.each(function () {
+            if (this.value === options.imageAlign) {
+                this.checked = true;
+                return false;
+            }
+        });
+        if (showRemote && tabIndex === 0) {
+            urlBox[0].focus();
+            urlBox[0].select();
+        }
+        return dialog;
+    };
+    self.plugin.image = {
+        edit: function () {
+            var img = self.plugin.getSelectedImage();
+            self.plugin.imageDialog({
+                imageUrl: img ? img.attr('data-ke-src') : 'http://',
+                imageWidth: img ? img.width() : '',
+                imageHeight: img ? img.height() : '',
+                imageTitle: img ? img.attr('title') : '',
+                imageAlign: img ? img.attr('align') : '',
+                showRemote: allowImageRemote,
+                showLocal: allowImageUpload,
+                tabIndex: img ? 0 : imageTabIndex,
+                clickFn: function (url, title, width, height, border, align) {
+                    if (img) {
+                        img.attr('src', url);
+                        img.attr('data-ke-src', url);
+                        img.attr('width', width);
+                        img.attr('height', height);
+                        img.attr('title', title);
+                        img.attr('align', align);
+                        img.attr('alt', title);
+                    } else {
+                        self.exec('insertimage', url, title, width, height, border, align);
+                    }
+                    setTimeout(function () {
+                        self.hideDialog().focus();
+                    }, 0);
+                }
+            });
+        },
+        'delete': function () {
+            var target = self.plugin.getSelectedImage();
+            if (target.parent().name == 'a') {
+                target = target.parent();
+            }
+            target.remove();
+            self.addBookmark();
+        }
+    };
+    self.clickToolbar(name, self.plugin.image.edit);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('insertfile', function (K) {
+    var self = this, name = 'insertfile',
+        allowFileUpload = K.undef(self.allowFileUpload, true),
+        allowFileManager = K.undef(self.allowFileManager, false),
+        formatUploadUrl = K.undef(self.formatUploadUrl, true),
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+        extraParams = K.undef(self.extraFileUploadParams, {}),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        lang = self.lang(name + '.');
+    self.plugin.fileDialog = function (options) {
+        var fileUrl = K.undef(options.fileUrl, 'http://'),
+            fileTitle = K.undef(options.fileTitle, ''),
+            clickFn = options.clickFn;
+        var html = [
+            '<div class="ke-dialog-content-inner">',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;',
+            '<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+            '<span class="ke-button-common ke-button-outer">',
+            '<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+            '</span>',
+            '</div>',
+            '</div>',
+            '<div class="ke-dialog-row ke-clearfix">',
+            '<label for="keTitle" class="row-left">' + lang.title + ':</label>',
+            '<div class="row-right">',
+            '<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',
+            '</div>',
+            '</div>',
+            '</form>',
+            '</div>'
+        ].join('');
+        var dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var url = K.trim(urlBox.val()),
+                            title = titleBox.val();
+                        if (url == 'http://' || K.invalidUrl(url)) {
+                            K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                            urlBox[0].focus();
+                            return;
+                        }
+                        if (K.trim(title) === '') {
+                            title = url;
+                        }
+                        clickFn.call(self, url, title);
+                    }
+                }
+            }),
+            div = dialog.div;
+        var urlBox = K('[name="url"]', div),
+            viewServerBtn = K('[name="viewServer"]', div),
+            titleBox = K('[name="title"]', div);
+        if (allowFileUpload) {
+            var callback = function (data) {
+                dialog.hideLoading();
+                if (data.code === "000") {
+                    var url = data.data.url;
+                    if (formatUploadUrl) {
+                        url = K.formatUrl(url, 'absolute');
+                    }
+                    urlBox.val(url);
+                    if (self.afterUpload) {
+                        self.afterUpload.call(self, url, data, name);
+                    }
+                    //K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+                } else {
+                    K.options.errorMsgHandler(data.message, "error");
+                }
+            };
+            var uploadbutton = K.uploadbutton({
+                button: K('.ke-upload-button', div)[0],
+                fieldName: filePostName,
+                url: K.addParam(uploadJson, 'fileType=file'),
+                extraParams: extraParams,
+                beforeUpload: function () {
+                    if (typeof self.beforeUpload == 'function') {
+                        self.beforeUpload.call(this, callback);
+                        return false;
+                    } else {
+                        return true;
+                    }
+                },
+                afterUpload: function (data) {
+                    callback(data);
+                },
+                afterError: function (html) {
+                    dialog.hideLoading();
+                    self.errorDialog(html);
+                }
+            });
+            uploadbutton.fileBox.change(function (e) {
+                dialog.showLoading(self.lang('uploadLoading'));
+                uploadbutton.submit();
+            });
+        } else {
+            K('.ke-upload-button', div).hide();
+        }
+        if (allowFileManager) {
+            viewServerBtn.click(function (e) {
+                self.loadPlugin('filemanager', function () {
+                    self.plugin.filemanagerDialog({
+                        viewType: 'LIST',
+                        dirName: 'file',
+                        clickFn: function (url) {
+                            K('[name="url"]', div).val(url);
+                            if (self.afterSelectFile) {
+                                self.afterSelectFile.call(self, url);
+                            }
+                        }
+                    });
+                });
+            });
+        } else {
+            K("#keUrl").css("width", "250px");
+            viewServerBtn.hide();
+        }
+        urlBox.val(fileUrl);
+        titleBox.val(fileTitle);
+        urlBox[0].focus();
+        urlBox[0].select();
+    };
+    self.clickToolbar(name, function () {
+        self.plugin.fileDialog({
+            clickFn: function (url, title) {
+                var html = '<a class="ke-insertfile" href="' + url + '" data-ke-src="' + url + '" target="_blank">' + title + '</a>';
+                self.insertHtml(html).hideDialog().focus();
+            }
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('lineheight', function (K) {
+    var self = this, name = 'lineheight', lang = self.lang(name + '.');
+    self.clickToolbar(name, function () {
+        var curVal = '', commonNode = self.cmd.commonNode({'*': '.line-height'});
+        if (commonNode) {
+            curVal = commonNode.css('line-height');
+        }
+        var menu = self.createMenu({
+            name: name,
+            width: 150
+        });
+        K.each(lang.lineHeight, function (i, row) {
+            K.each(row, function (key, val) {
+                menu.addItem({
+                    title: val,
+                    checked: curVal === key,
+                    click: function () {
+                        self.cmd.toggle('<span style="line-height:' + key + ';"></span>', {
+                            span: '.line-height=' + key
+                        });
+                        self.updateState();
+                        self.addBookmark();
+                        self.hideMenu();
+                    }
+                });
+            });
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('link', function (K) {
+    var self = this, name = 'link';
+    self.plugin.link = {
+        edit: function () {
+            var lang = self.lang(name + '.'),
+                html = ['<div class="ke-dialog-content-inner">',
+                    '<div class="ke-dialog-row ke-clearfix">',
+                    '<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+                    '<div class="row-right">',
+                    '<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" />',
+                    '</div>',
+                    '</div>',
+                    '<div class="ke-dialog-row ke-clearfix"">',
+                    '<label for="keType" class="row-left">' + lang.linkType + ':</label>',
+                    '<div class="row-right">',
+                    '<select id="keType" class="ke-select" name="type"></select>',
+                    '</div>',
+                    '</div>',
+                    '</div>'].join(""),
+                dialog = self.createDialog({
+                    name: name,
+                    width: 450,
+                    title: self.lang(name),
+                    body: html,
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var url = K.trim(urlBox.val());
+                            if (url == 'http://' || K.invalidUrl(url)) {
+                                K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                                urlBox[0].focus();
+                                return;
+                            }
+                            self.exec('createlink', url, typeBox.val()).hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div,
+                urlBox = K('input[name="url"]', div),
+                typeBox = K('select[name="type"]', div);
+            urlBox.val('http://');
+            typeBox[0].options[0] = new Option(lang.newWindow, '_blank');
+            typeBox[0].options[1] = new Option(lang.selfWindow, '');
+            self.cmd.selection();
+            var a = self.plugin.getSelectedLink();
+            if (a) {
+                self.cmd.range.selectNode(a[0]);
+                self.cmd.select();
+                urlBox.val(a.attr('data-ke-src'));
+                typeBox.val(a.attr('target'));
+            }
+            urlBox[0].focus();
+            urlBox[0].select();
+        },
+        'delete': function () {
+            self.exec('unlink', null);
+        }
+    };
+    self.clickToolbar(name, self.plugin.link.edit);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('media', function (K) {
+    var self = this, name = 'media', lang = self.lang(name + '.'),
+        allowMediaUpload = K.undef(self.allowMediaUpload, false),
+        allowFileManager = K.undef(self.allowFileManager, false),
+        formatUploadUrl = K.undef(self.formatUploadUrl, true),
+        extraParams = K.undef(self.extraFileUploadParams, {}),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+    self.plugin.media = {
+        edit: function () {
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+                '<div class="row-right">',
+                '<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:180px;" /> &nbsp;',
+                '<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+                '<span class="ke-button-common ke-button-outer">',
+                '<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+                '</span>',
+                '<div style="margin-top:5px;color:#aaa;">支持优酷、爱奇艺、腾讯视频等视频网站【<span style="color:green">通用代码</span>】',
+                '</div>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keWidth" class="row-left">' + lang.width + ':</label>',
+                '<div class="row-right">',
+                '<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keHeight" class="row-left">' + lang.height + ':</label>',
+                '<div class="row-right">',
+                '<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keAutostart" class="row-left">' + lang.autostart + ':</label>',
+                '<div class="row-right">',
+                '<input type="checkbox" id="keAutostart" name="autostart" class="ke-input-checkbox" value="" /> ',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 450,
+                    height: 260,
+                    title: self.lang(name),
+                    body: html,
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var url = K.trim(urlBox.val()),
+                                width = widthBox.val(),
+                                height = heightBox.val();
+                            var match = url.match(/^<iframe\s(.*?)src=('|")(.*?)('|")/);
+                            if (!match) {
+                                if (url == 'http://' || K.invalidUrl(url)) {
+                                    K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                                    urlBox[0].focus();
+                                    return;
+                                }
+                            }
+                            if (!/^\d*$/.test(width)) {
+                                K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                                widthBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(height)) {
+                                K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                                heightBox[0].focus();
+                                return;
+                            }
+                            if (!match) {
+                                var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+                                    src: url,
+                                    type: K.mediaType(url),
+                                    width: width,
+                                    height: height,
+                                    autostart: autostartBox[0].checked ? 'true' : 'false',
+                                    loop: 'true'
+                                });
+                            } else {
+                                var html = '<iframe src="' + match[3] + '" frameborder="0" style="width:' + width + 'px;height:' + height + 'px;"></iframe>';
+                            }
+                            self.insertHtml(html).hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div,
+                urlBox = K('[name="url"]', div),
+                viewServerBtn = K('[name="viewServer"]', div),
+                widthBox = K('[name="width"]', div),
+                heightBox = K('[name="height"]', div),
+                autostartBox = K('[name="autostart"]', div);
+            urlBox.val('http://');
+            if (allowMediaUpload) {
+                var callback = function (data) {
+                    dialog.hideLoading();
+                    if (data.code == "000") {
+                        var url = data.data.url;
+                        if (formatUploadUrl) {
+                            url = K.formatUrl(url, 'absolute');
+                        }
+                        urlBox.val(url);
+                        if (self.afterUpload) {
+                            self.afterUpload.call(self, url, data, name);
+                        }
+                        //K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+                    } else {
+                        K.options.errorMsgHandler(data.message, "error", "error");
+                    }
+                };
+                var uploadbutton = K.uploadbutton({
+                    button: K('.ke-upload-button', div)[0],
+                    fieldName: filePostName,
+                    extraParams: extraParams,
+                    url: K.addParam(uploadJson, 'fileType=media'),
+                    beforeUpload: function () {
+                        if (typeof self.beforeUpload == 'function') {
+                            self.beforeUpload.call(this, callback);
+                            return false;
+                        } else {
+                            return true;
+                        }
+                    },
+                    afterUpload: function (data) {
+                        callback(data);
+                    },
+                    afterError: function (html) {
+                        dialog.hideLoading();
+                        self.errorDialog(html);
+                    }
+                });
+                uploadbutton.fileBox.change(function (e) {
+                    dialog.showLoading(self.lang('uploadLoading'));
+                    uploadbutton.submit();
+                });
+            } else {
+                K('.ke-upload-button', div).hide();
+            }
+            if (allowMediaUpload && allowFileManager) {
+                viewServerBtn.click(function (e) {
+                    self.loadPlugin('filemanager', function () {
+                        self.plugin.filemanagerDialog({
+                            dirName: 'media',
+                            clickFn: function (url) {
+                                K('[name="url"]', div).val(url);
+                                if (self.afterSelectFile) {
+                                    self.afterSelectFile.call(self, url);
+                                }
+                            }
+                        });
+                    });
+                });
+            } else {
+                K("#keUrl").css("width", "250px");
+                viewServerBtn.hide();
+            }
+            var img = self.plugin.getSelectedMedia();
+            if (img) {
+                var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+                urlBox.val(attrs.src);
+                widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+                heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+                autostartBox[0].checked = (attrs.autostart === 'true');
+            }
+            urlBox[0].focus();
+            urlBox[0].select();
+        },
+        'delete': function () {
+            self.plugin.getSelectedMedia().remove();
+            self.addBookmark();
+        }
+    };
+    self.clickToolbar(name, self.plugin.media.edit);
+});
+
+KindEditor.plugin('multiimage', function (K) {
+    var self = this, name = 'multiimage',
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+        fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'),
+        imageSizeLimit = K.undef(self.imageSizeLimit, 2048),
+        imageFileTypes = K.undef(self.imageFileTypes, 'jpg|png|gif|jpeg'),
+        imageUploadLimit = K.undef(self.imageUploadLimit, 20),
+        filePostName = K.undef(self.filePostName, 'imgFile'),
+        lang = self.lang(name + '.');
+    if (typeof jQuery == 'undefined') {
+        K.options.errorMsgHandler(lang.depJQueryError, "error");
+        return;
+    } else {
+        K.loadScript(K.options.pluginsPath + name + "/BUpload.js");
+        K.loadStyle(K.options.pluginsPath + name + "/css/upload.css");
+    }
+    K.locker = function () {
+        var docWidth = Math.max(document.documentElement.clientWidth, document.body.clientWidth);
+        var docHeight = Math.max(document.documentElement.clientHeight, document.body.clientHeight, $(document).height()) + document.documentElement.scrollTop;
+        return K.widget({
+            x: 0,
+            y: 0,
+            cls: 'ke-dialog-lock',
+            width: docWidth,
+            height: docHeight
+        });
+    }
+    self.plugin.multiImageDialog = function (options) {
+
+        var clickFn = options.clickFn;
+        var locker = K.locker();
+        locker.show();
+        var dialog = new BUpload({
+            src: filePostName,
+            upload_url: uploadJson,
+            list_url: fileManagerJson,
+            max_filesize: imageSizeLimit,
+            max_filenum: imageUploadLimit,
+            ext_allow: imageFileTypes,
+            lang: lang,
+            top: self.dialogOffset,
+            fileType: "image",
+            errorHandler: K.options.errorMsgHandler,
+            callback: function (data) {
+                clickFn.call(this, data);
+            },
+            close: function () {
+                locker.remove();
+            }
+        });
+        return dialog;
+    };
+    self.clickToolbar(name, function () {
+        self.plugin.multiImageDialog({
+            clickFn: function (urlList) {
+                if (urlList.length === 0) {
+                    return;
+                }
+                K.each(urlList, function (i, data) {
+                    if (self.afterUpload) {
+                        self.afterUpload.call(self, data, data, 'multiimage');
+                    }
+                    self.exec('insertimage', data);
+                });
+                setTimeout(function () {
+                    self.hideDialog().focus();
+                }, 0);
+            }
+        });
+    });
+});
+
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('graft', function (K) {
+    var self = this, name = 'graft',
+        uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+        allowUploadGraft = K.undef(self.allowUploadGraft, true),
+        lang = self.lang(name + '.');
+    if (typeof jQuery == 'undefined') {
+        K.options.errorMsgHandler(lang.depJQueryError, "error");
+        return;
+    } else {
+        K.loadStyle(K.options.pluginsPath + "graft/css/scrawl.css");
+        K.loadScript(K.options.pluginsPath + "graft/scrawl.js");
+    }
+    self.plugin.graftDialog = function (options) {
+        var clickFn = options.clickFn;
+        var html = [
+            '<div class="scrawl-main" id="scrawl-main">',
+            '<div class="hot">',
+            '<div class="drawBoard border_style">',
+            '<canvas id="canvas-borad" class="brushBorad">你的浏览器不支持 canvas 绘图</canvas>',
+            '<div class="picBoard" id="picBoard" style=""></div>',
+            '</div>',
+            '<div class="operateBar">',
+            '<button id="J_prevStep" class="prevStep" title="上一步">',
+            '<em class="icon"></em>',
+            '</button>',
+            '<button id="J_nextStep" class="nextStep" title="下一步">',
+            '<em class="icon"></em>',
+            '</button>',
+            '<button id="J_clearBoard" class="clearBoard" title="清空">',
+            '<em class="icon"></em>',
+            '</button>',
+            '</div>',
+            '</div>',
+            '<div class="drawToolbar border_style">',
+            '<div class="colorBar">',
+            '<span data-color="#0099CC" style="background:#0099CC;" class="active"></span>',
+            '<span data-color="#003366" style="background:#003366;"></span>',
+            '<span data-color="#993333" style="background:#993333;"></span>',
+            '<span data-color="#FF9900" style="background:#FF9900;"></span>',
+            '<span data-color="#0000CC" style="background:#0000CC;"></span>',
+            '<span data-color="#CC3333" style="background:#CC3333;"></span>',
+            '<span data-color="#F4D03F" style="background:#641E16;"></span>',
+            '<span data-color="#4A235A" style="background:#4A235A;"></span>',
+            '<span data-color="#009966" style="background:#009966;"></span>',
+            '<span data-color="#ffff00" style="background:#ffff00;"></span>',
+            '<span data-color="#7D6608" style="background:#7D6608;"></span>',
+            '<span data-color="#FF33CC" style="background:#FF33CC;"></span>',
+            '<span data-color="#990066" style="background:#990066;"></span>',
+            '<span data-color="#ffffff" style="background:#ffffff;"></span>',
+            '<span data-color="#9bbb59" style="background:#9bbb59;"></span>',
+            '<span data-color="#CCFFFF" style="background:#CCFFFF;"></span>',
+            '<span data-color="#FFCCCC" style="background:#FFCCCC;"></span>',
+            '<span data-color="#CC99CC" style="background:#CC99CC;"></span>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<em class="brushIcon"></em>',
+            '<a href="javascript:void(0)" class="brush-size size1">1</a>',
+            '<a href="javascript:void(0)" class="brush-size size2">3</a>',
+            '<a href="javascript:void(0)" class="brush-size size3">5</a>',
+            '<a href="javascript:void(0)" class="brush-size size4">7</a>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<em class="eraserIcon"></em>',
+            '<a href="javascript:void(0)" class="eraser-size size1">5</a>',
+            '<a href="javascript:void(0)" class="eraser-size size2">10</a>',
+            '<a href="javascript:void(0)" class="eraser-size size3">15</a>',
+            '<a href="javascript:void(0)" class="eraser-size size4">20</a>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<em class="blurIcon"></em>',
+            '<a href="javascript:void(0)" class="blur-size size1">2</a>',
+            '<a href="javascript:void(0)" class="blur-size size2">4</a>',
+            '<a href="javascript:void(0)" class="blur-size size3">6</a>',
+            '<a href="javascript:void(0)" class="blur-size size4">8</a>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<span id="clearSetting" class="clearSetting">',
+            '<em class="icon"></em>',
+            '<em class="text">初始化设置</em>',
+            '</span>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<div id="J_addImg" class="addImgH">',
+            '<em class="icon"></em>',
+            '<em class="text">添加背景</em>',
+            '<input type="file" class="upload" id="J_canvas_bg" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>',
+            '</div>',
+            '</div>',
+            '<div class="sectionBar">',
+            '<span id="J_removeImg" class="removeImg">',
+            '<em class="icon"></em>',
+            '<em class="text">删除背景</em>',
+            '</span>',
+            '</div>',
+            '</div>'
+        ].join('');
+        var dataURLtoFile = function (dataurl, filename) {
+            var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
+                bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
+            while (n--) {
+                u8arr[n] = bstr.charCodeAt(n);
+            }
+            return new File([u8arr], filename, {type: mime});
+        };
+        var dialog = self.createDialog({
+            name: name,
+            width: 750,
+            height: 440,
+            title: self.lang(name),
+            body: html,
+            yesBtn: {
+                name: lang.btnText,
+                click: function (e) {
+                    if (dialog.isLoading) {
+                        return;
+                    }
+                    if (canvas.isEmpty()) {
+                        K.options.errorMsgHandler(lang.empty, "error");
+                        return;
+                    }
+                    canvas.save(function (data) {
+                        if (allowUploadGraft) {
+                            var callback = function (res) {
+                                dialog.hideLoading();
+                                if (res.code == "000") {
+                                    //K.options.errorMsgHandler(lang.uploadSuccess, "ok");
+                                    clickFn.call(self, res.data.url);
+                                    self.hideDialog().focus();
+                                } else {
+                                    K.options.errorMsgHandler(lang.uploadFaild, "error");
+                                }
+                            };
+                            dialog.showLoading(self.lang('uploadLoading'));
+                            if (typeof self.beforeUpload == 'function') {
+                                var file = dataURLtoFile(data, "graft.png");
+                                self.beforeUpload.call(this, callback, file);
+                            } else {
+                                $.post(uploadJson, {
+                                    img_base64_data: data,
+                                    fileType: "image",
+                                    base64: 1
+                                }, function (res) {
+                                    callback(res);
+                                }, "json");
+                            }
+                        } else {
+                            clickFn.call(self, data);
+                            self.hideDialog().focus();
+                        }
+                    });
+                }
+            }
+        });
+        var canvas = new Canvas({
+            canvasId: "canvas-borad",
+            width: 600,
+            height: 320
+        });
+    };
+    self.clickToolbar(name, function () {
+        self.plugin.graftDialog({
+            clickFn: function (url) {
+                self.exec('insertimage', url);
+            }
+        });
+    });
+});
+/**
+ * 文件服务器管理
+ * @author yangjian <yangjian102621@gmail.com>
+ * @since v4.1.12(2017-09-12)
+ * @site http://git.oschina.net/blackfox/kindeditor
+ */
+KindEditor.plugin('filemanager', function (K) {
+    var self = this;
+    var fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php');
+    var lang = self.lang('filemanager.');
+    if (typeof jQuery == 'undefined') {
+        K.options.errorMsgHandler(lang.depJQueryError, "error");
+        return;
+    } else {
+        K.loadScript(K.options.pluginsPath + "filemanager/FManager.js");
+        K.loadStyle(K.options.pluginsPath + "multiimage/css/upload.css");
+    }
+
+    self.plugin.filemanagerDialog = function (options) {
+
+        var clickFn = options.clickFn;
+        new FManager({
+            list_url: fileManagerJson,	//图片列表数据获取url
+            lang: lang, //语言包
+            fileType: options.dirName,
+            top: self.dialogOffset,
+            multiple: options.multiple ? true : false,
+            callback: function (data) {
+                clickFn.call(this, options.multiple ? data : data[0]);
+            }
+        });
+        //return dialog;
+    }
+
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('pagebreak', function (K) {
+    var self = this;
+    var name = 'pagebreak';
+    var pagebreakHtml = K.undef(self.pagebreakHtml, '<hr style="page-break-after: always;" class="ke-pagebreak" />');
+    self.clickToolbar(name, function () {
+        var cmd = self.cmd, range = cmd.range;
+        self.focus();
+        var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : '<span id="__kindeditor_tail_tag__"></span>';
+        self.insertHtml(pagebreakHtml + tail);
+        if (tail !== '') {
+            var p = K('#__kindeditor_tail_tag__', self.edit.doc);
+            range.selectNodeContents(p[0]);
+            p.removeAttr('id');
+            cmd.select();
+        }
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('plainpaste', function (K) {
+    var self = this, name = 'plainpaste';
+    self.clickToolbar(name, function () {
+        var lang = self.lang(name + '.'),
+            html = '<div style="padding:10px 20px;">' +
+                '<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+                '<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>' +
+                '</div>',
+            dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var html = textarea.val();
+                        html = K.escape(html);
+                        html = html.replace(/ {2}/g, ' &nbsp;');
+                        if (self.newlineTag == 'p') {
+                            html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>');
+                        } else {
+                            html = html.replace(/\n/g, '<br />$&');
+                        }
+                        self.insertHtml(html).hideDialog().focus();
+                    }
+                }
+            }),
+            textarea = K('textarea', dialog.div);
+        textarea[0].focus();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('preview', function (K) {
+    var self = this, name = 'preview', undefined;
+    self.clickToolbar(name, function () {
+        var lang = self.lang(name + '.'),
+            width = document.documentElement.clientWidth * 0.9,
+            height = document.documentElement.clientHeight - 160,
+            html = '<div style="padding:10px 20px;">' +
+                '<iframe class="ke-textarea" frameborder="0" style="width:' + (width - 42) + 'px;height:' + height + 'px;"></iframe>' +
+                '</div>',
+            dialog = self.createDialog({
+                name: name,
+                width: width,
+                title: self.lang(name),
+                body: html
+            }),
+            iframe = K('iframe', dialog.div),
+            doc = K.iframeDoc(iframe);
+        doc.open();
+        var cssPath = self.options.cssPath;
+        var jsPath = self.options.jsPath;
+        var arr = [
+            '<html lang="en">',
+            '<head><meta charset="utf-8" /><title></title>',
+            '<style>',
+            'html {margin:0;padding:0;}',
+            'body {margin:0;padding:5px;}',
+            'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
+            'body, p, div {word-wrap: break-word;}',
+            'p {margin:5px 0;}',
+            'table {border-collapse:collapse;}',
+            'img {border:0;}',
+            'noscript {display:none;}',
+            'table.ke-zeroborder td {border:1px dotted #AAA;}',
+            'img.ke-flash {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + self.options.themesPath + 'common/flash.svg);',
+            '	*background-image:url(' + self.options.themesPath + 'common/flash.png);',
+            '	background-size:64px 64px;',
+            '	background-position:center center;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-rm {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + self.options.themesPath + 'common/rm.gif);',
+            '	background-position:center center;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-media {',
+            '	border:1px solid #AAA;',
+            '	background-image:url(' + self.options.themesPath + 'common/play.svg);',
+            '	*background-image:url(' + self.options.themesPath + 'common/play.png);',
+            '	background-position:center center;',
+            '	background-size:64px 64px;',
+            '	background-repeat:no-repeat;',
+            '	width:100px;',
+            '	height:100px;',
+            '}',
+            'img.ke-anchor {',
+            '	border:1px dashed #666;',
+            '	width:16px;',
+            '	height:16px;',
+            '}',
+            '.ke-script, .ke-noscript, .ke-display-none {',
+            '	display:none;',
+            '	font-size:0;',
+            '	width:0;',
+            '	height:0;',
+            '}',
+            '.ke-pagebreak {',
+            '	border:1px dotted #AAA;',
+            '	font-size:0;',
+            '	height:2px;',
+            '}'
+        ];
+        if (self.options.showHelpGrid) {
+            arr.push('p,ul,ol,li,div{border: 1px dashed #c1c1c1;}');
+            arr.push('li{margin:5px 0px}');
+            arr.push('div,ul,ol{margin-bottom:10px}');
+        }
+        arr.push('</style>');
+        if (!K.isArray(cssPath)) {
+            cssPath = [cssPath];
+        }
+        if (K.inArray(self.options.pluginsPath + 'code/prism.css', cssPath) < 0) {
+            cssPath.push(self.options.pluginsPath + 'code/prism.css');
+        }
+        K.each(cssPath, function (i, path) {
+            if (path) {
+                arr.push('<link href="' + path + '" rel="stylesheet" />');
+            }
+        });
+        if (self.options.cssData) {
+            arr.push('<style>' + self.options.cssData + '</style>');
+        }
+        arr.push('</head><body ' + (self.options.bodyClass ? 'class="' + self.options.bodyClass + '"' : '') + '>');
+        arr.push(self.fullHtml());
+        if (!K.isArray(jsPath)) {
+            jsPath = [jsPath];
+        }
+        if (K.inArray(self.options.pluginsPath + 'code/prism.js', jsPath) < 0) {
+            jsPath.push(self.options.pluginsPath + 'code/prism.js');
+        }
+        K.each(jsPath, function (i, path) {
+            if (path) {
+                arr.push('<script type="text/javascript" src="' + path + '"></script>');
+            }
+        });
+        arr.push('</body></html>');
+        doc.write(arr.join('\n'));
+        doc.close();
+        K(doc.body).css('background-color', '#FFF');
+        iframe[0].contentWindow.focus();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('quickformat', function (K) {
+    var self = this, name = 'quickformat',
+        blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p');
+
+    function getFirstChild(knode) {
+        var child = knode.first();
+        while (child && child.first()) {
+            child = child.first();
+        }
+        return child;
+    }
+
+    self.clickToolbar(name, function () {
+        self.focus();
+        var doc = self.edit.doc,
+            range = self.cmd.range,
+            child = K(doc.body).first(), next,
+            nodeList = [], subList = [],
+            bookmark = range.createBookmark(true);
+        while (child) {
+            next = child.next();
+            var firstChild = getFirstChild(child);
+            if (!firstChild || firstChild.name != 'img') {
+                if (blockMap[child.name]) {
+                    child.html(child.html().replace(/^(\s|&nbsp;| )+/ig, ''));
+                    child.css('text-indent', '2em');
+                } else {
+                    subList.push(child);
+                }
+                if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) {
+                    if (subList.length > 0) {
+                        nodeList.push(subList);
+                    }
+                    subList = [];
+                }
+            }
+            child = next;
+        }
+        K.each(nodeList, function (i, subList) {
+            var wrapper = K('<p style="text-indent:2em;"></p>', doc);
+            subList[0].before(wrapper);
+            K.each(subList, function (i, knode) {
+                wrapper.append(knode);
+            });
+        });
+        range.moveToBookmark(bookmark);
+        self.addBookmark();
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('table', function (K) {
+    var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder';
+    var borderColor = K.undef(self.options.tableBorderColor, '#cccccc');
+
+    function _setColor(box, color) {
+        color = color.toUpperCase();
+        box.css('background-color', color);
+        box.css('color', color === '#000000' ? '#FFFFFF' : '#000000');
+        box.html(color);
+    }
+
+    var pickerList = [];
+
+    function _initColorPicker(dialogDiv, colorBox) {
+        colorBox.bind('click,mousedown', function (e) {
+            e.stopPropagation();
+        });
+
+        function removePicker() {
+            K.each(pickerList, function () {
+                this.remove();
+            });
+            pickerList = [];
+            K(document).unbind('click,mousedown', removePicker);
+            dialogDiv.unbind('click,mousedown', removePicker);
+        }
+
+        colorBox.click(function (e) {
+            removePicker();
+            var box = K(this),
+                pos = box.pos();
+            var picker = K.colorpicker({
+                x: pos.x,
+                y: pos.y + box.height(),
+                z: 811214,
+                selectedColor: K(this).html(),
+                colors: self.colorTable,
+                noColor: self.lang('noColor'),
+                shadowMode: self.shadowMode,
+                click: function (color) {
+                    _setColor(box, color);
+                    removePicker();
+                }
+            });
+            pickerList.push(picker);
+            K(document).bind('click,mousedown', removePicker);
+            dialogDiv.bind('click,mousedown', removePicker);
+        });
+    }
+
+    function _getCellIndex(table, row, cell) {
+        var rowSpanCount = 0;
+        for (var i = 0, len = row.cells.length; i < len; i++) {
+            if (row.cells[i] == cell) {
+                break;
+            }
+            rowSpanCount += row.cells[i].rowSpan - 1;
+        }
+        return cell.cellIndex - rowSpanCount;
+    }
+
+    self.plugin.table = {
+        prop: function (isInsert) {
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keRows" class="row-left">' + lang.cells + ':</label>',
+                '<div class="row-right">',
+                lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',
+                lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keWidth" class="row-left">' + lang.size + ':</label>',
+                '<div class="row-right">',
+                lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+                '<select name="widthType" class="ke-select">',
+                '<option value="%">' + lang.percent + '</option>',
+                '<option value="px">' + lang.px + '</option>',
+                '</select> &nbsp; ',
+                lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+                '<select name="heightType" class="ke-select">',
+                '<option value="%">' + lang.percent + '</option>',
+                '<option value="px">' + lang.px + '</option>',
+                '</select>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="kePadding" class="row-left">' + lang.space + ':</label>',
+                '<div class="row-right">',
+                lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',
+                lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keAlign" class="row-left">' + lang.align + ':</label>',
+                '<div class="row-right">',
+                '<select id="keAlign" class="ke-select" name="align">',
+                '<option value="">' + lang.alignDefault + '</option>',
+                '<option value="left">' + lang.alignLeft + '</option>',
+                '<option value="center">' + lang.alignCenter + '</option>',
+                '<option value="right">' + lang.alignRight + '</option>',
+                '</select>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keBorder" class="row-left">' + lang.border + ':</label>',
+                '<div class="row-right">',
+                lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+                lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+                '</div>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keBgColor" class="row-left">' + lang.backgroundColor + ':</label>',
+                '<div class="row-right">',
+                '<span class="ke-inline-block ke-input-color"></span>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var bookmark = self.cmd.range.createBookmark();
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 500,
+                    title: self.lang(name),
+                    body: html,
+                    beforeRemove: function () {
+                        colorBox.unbind();
+                    },
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var rows = rowsBox.val(),
+                                cols = colsBox.val(),
+                                width = widthBox.val(),
+                                height = heightBox.val(),
+                                widthType = widthTypeBox.val(),
+                                heightType = heightTypeBox.val(),
+                                padding = paddingBox.val(),
+                                spacing = spacingBox.val(),
+                                align = alignBox.val(),
+                                border = borderBox.val(),
+                                borderColor = K(colorBox[0]).html() || '',
+                                bgColor = K(colorBox[1]).html() || '';
+                            if (rows == 0 || !/^\d+$/.test(rows)) {
+                                K.options.errorMsgHandler(self.lang('invalidRows'), "error");
+                                rowsBox[0].focus();
+                                return;
+                            }
+                            if (cols == 0 || !/^\d+$/.test(cols)) {
+                                K.options.errorMsgHandler(self.lang('invalidRows'), "error");
+                                colsBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(width)) {
+                                K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                                widthBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(height)) {
+                                K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                                heightBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(padding)) {
+                                K.options.errorMsgHandler(self.lang('invalidPadding'), "error");
+                                paddingBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(spacing)) {
+                                K.options.errorMsgHandler(self.lang('invalidSpacing'), "error");
+                                spacingBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(border)) {
+                                K.options.errorMsgHandler(self.lang('invalidBorder'), "error");
+                                borderBox[0].focus();
+                                return;
+                            }
+                            if (table) {
+                                if (width !== '') {
+                                    table.width(width + widthType);
+                                } else {
+                                    table.css('width', '');
+                                }
+                                if (table[0].width !== undefined) {
+                                    table.removeAttr('width');
+                                }
+                                if (height !== '') {
+                                    table.height(height + heightType);
+                                } else {
+                                    table.css('height', '');
+                                }
+                                if (table[0].height !== undefined) {
+                                    table.removeAttr('height');
+                                }
+                                table.css('background-color', bgColor);
+                                if (table[0].bgColor !== undefined) {
+                                    table.removeAttr('bgColor');
+                                }
+                                if (padding !== '') {
+                                    table[0].cellPadding = padding;
+                                } else {
+                                    table.removeAttr('cellPadding');
+                                }
+                                if (spacing !== '') {
+                                    table[0].cellSpacing = spacing;
+                                } else {
+                                    table.removeAttr('cellSpacing');
+                                }
+                                if (align !== '') {
+                                    table[0].align = align;
+                                } else {
+                                    table.removeAttr('align');
+                                }
+                                if (border !== '') {
+                                    table.attr('border', border);
+                                } else {
+                                    table.removeAttr('border');
+                                }
+                                if (border === '' || border === '0') {
+                                    table.addClass(zeroborder);
+                                } else {
+                                    table.removeClass(zeroborder);
+                                }
+                                if (borderColor !== '') {
+                                    table.attr('borderColor', borderColor);
+                                } else {
+                                    table.removeAttr('borderColor');
+                                }
+                                self.hideDialog().focus();
+                                self.cmd.range.moveToBookmark(bookmark);
+                                self.cmd.select();
+                                self.addBookmark();
+                                return;
+                            }
+                            var style = '';
+                            if (width !== '') {
+                                style += 'width:' + width + widthType + ';';
+                            }
+                            if (height !== '') {
+                                style += 'height:' + height + heightType + ';';
+                            }
+                            if (bgColor !== '') {
+                                style += 'background-color:' + bgColor + ';';
+                            }
+                            var html = '<table class="table"';
+                            if (style !== '') {
+                                html += ' style="' + style + '"';
+                            }
+                            if (padding !== '') {
+                                html += ' cellpadding="' + padding + '"';
+                            }
+                            if (spacing !== '') {
+                                html += ' cellspacing="' + spacing + '"';
+                            }
+                            if (align !== '') {
+                                html += ' align="' + align + '"';
+                            }
+                            if (border !== '') {
+                                html += ' border="' + border + '"';
+                            }
+                            if (border === '' || border === '0') {
+                                html += ' class="table ' + zeroborder + '"';
+                            }
+                            if (borderColor !== '') {
+                                html += ' bordercolor="' + borderColor + '"';
+                            }
+                            html += '>';
+                            for (var i = 0; i < rows; i++) {
+                                html += '<tr>';
+                                for (var j = 0; j < cols; j++) {
+                                    html += '<td>' + (K.IE ? '&nbsp;' : '<br />') + '</td>';
+                                }
+                                html += '</tr>';
+                            }
+                            html += '</table>';
+                            if (!K.IE) {
+                                html += '<br />';
+                            }
+
+                            function getAncestorTag(range) {
+                                var ancestor = K(range.commonAncestor());
+                                while (ancestor) {
+                                    if (ancestor.type == 1 && !ancestor.isStyle()) {
+                                        break;
+                                    }
+                                    ancestor = ancestor.parent();
+                                }
+                                return ancestor;
+                            }
+
+                            var tag = getAncestorTag(self.cmd.range);
+                            if (tag.name == 'p') {
+                                tag.before(K(html));
+                                tag.remove();
+                                self.cmd.selection();
+                                self.insertHtml('<br />');
+                                self.select().hideDialog().focus();
+                            } else {
+                                self.insertHtml(html);
+                                self.select().hideDialog().focus();
+                                self.addBookmark();
+                            }
+                        }
+                    }
+                }),
+                div = dialog.div,
+                rowsBox = K('[name="rows"]', div).val(3),
+                colsBox = K('[name="cols"]', div).val(2),
+                widthBox = K('[name="width"]', div).val(100),
+                heightBox = K('[name="height"]', div),
+                widthTypeBox = K('[name="widthType"]', div),
+                heightTypeBox = K('[name="heightType"]', div),
+                paddingBox = K('[name="padding"]', div).val(0),
+                spacingBox = K('[name="spacing"]', div).val(0),
+                alignBox = K('[name="align"]', div),
+                borderBox = K('[name="border"]', div).val(1),
+                colorBox = K('.ke-input-color', div);
+            _initColorPicker(div, colorBox.eq(0));
+            _initColorPicker(div, colorBox.eq(1));
+            _setColor(colorBox.eq(1), '');
+            rowsBox[0].focus();
+            rowsBox[0].select();
+            var table;
+            if (isInsert) {
+                return;
+            }
+            table = self.plugin.getSelectedTable();
+            if (table) {
+                rowsBox.val(table[0].rows.length);
+                colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0);
+                rowsBox.attr('disabled', true);
+                colsBox.attr('disabled', true);
+                var match,
+                    tableWidth = table[0].style.width || table[0].width,
+                    tableHeight = table[0].style.height || table[0].height;
+                if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) {
+                    widthBox.val(match[1]);
+                    widthTypeBox.val(match[2]);
+                } else {
+                    widthBox.val('');
+                }
+                if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) {
+                    heightBox.val(match[1]);
+                    heightTypeBox.val(match[2]);
+                }
+                paddingBox.val(table[0].cellPadding || '');
+                spacingBox.val(table[0].cellSpacing || '');
+                alignBox.val(table[0].align || '');
+                borderBox.val(table[0].border === undefined ? '' : table[0].border);
+                _setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || ''));
+                _setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || ''));
+                widthBox[0].focus();
+                widthBox[0].select();
+            }
+        },
+        cellprop: function () {
+            var html = [
+                '<div style="padding:20px;">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
+                lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+                '<select name="widthType">',
+                '<option value="%">' + lang.percent + '</option>',
+                '<option value="px">' + lang.px + '</option>',
+                '</select> &nbsp; ',
+                lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+                '<select name="heightType">',
+                '<option value="%">' + lang.percent + '</option>',
+                '<option value="px">' + lang.px + '</option>',
+                '</select>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
+                lang.textAlign + ' <select id="keAlign" name="textAlign">',
+                '<option value="">' + lang.alignDefault + '</option>',
+                '<option value="left">' + lang.alignLeft + '</option>',
+                '<option value="center">' + lang.alignCenter + '</option>',
+                '<option value="right">' + lang.alignRight + '</option>',
+                '</select> ',
+                lang.verticalAlign + ' <select name="verticalAlign">',
+                '<option value="">' + lang.alignDefault + '</option>',
+                '<option value="top">' + lang.alignTop + '</option>',
+                '<option value="middle">' + lang.alignMiddle + '</option>',
+                '<option value="bottom">' + lang.alignBottom + '</option>',
+                '<option value="baseline">' + lang.alignBaseline + '</option>',
+                '</select>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
+                lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+                lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+                '</div>',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
+                '<span class="ke-inline-block ke-input-color"></span>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var bookmark = self.cmd.range.createBookmark();
+            var dialog = self.createDialog({
+                    name: name,
+                    width: 500,
+                    title: self.lang('tablecell'),
+                    body: html,
+                    beforeRemove: function () {
+                        colorBox.unbind();
+                    },
+                    yesBtn: {
+                        name: self.lang('yes'),
+                        click: function (e) {
+                            var width = widthBox.val(),
+                                height = heightBox.val(),
+                                widthType = widthTypeBox.val(),
+                                heightType = heightTypeBox.val(),
+                                padding = paddingBox.val(),
+                                spacing = spacingBox.val(),
+                                textAlign = textAlignBox.val(),
+                                verticalAlign = verticalAlignBox.val(),
+                                border = borderBox.val(),
+                                borderColor = K(colorBox[0]).html() || '',
+                                bgColor = K(colorBox[1]).html() || '';
+                            if (!/^\d*$/.test(width)) {
+                                K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                                widthBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(height)) {
+                                K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                                heightBox[0].focus();
+                                return;
+                            }
+                            if (!/^\d*$/.test(border)) {
+                                K.options.errorMsgHandler(self.lang('invalidBorder'), "error");
+                                borderBox[0].focus();
+                                return;
+                            }
+                            cell.css({
+                                width: width !== '' ? (width + widthType) : '',
+                                height: height !== '' ? (height + heightType) : '',
+                                'background-color': bgColor,
+                                'text-align': textAlign,
+                                'vertical-align': verticalAlign,
+                                'border-width': border,
+                                'border-style': border !== '' ? 'solid' : '',
+                                'border-color': borderColor
+                            });
+                            self.hideDialog().focus();
+                            self.cmd.range.moveToBookmark(bookmark);
+                            self.cmd.select();
+                            self.addBookmark();
+                        }
+                    }
+                }),
+                div = dialog.div,
+                widthBox = K('[name="width"]', div).val(100),
+                heightBox = K('[name="height"]', div),
+                widthTypeBox = K('[name="widthType"]', div),
+                heightTypeBox = K('[name="heightType"]', div),
+                paddingBox = K('[name="padding"]', div).val(0),
+                spacingBox = K('[name="spacing"]', div).val(0),
+                textAlignBox = K('[name="textAlign"]', div),
+                verticalAlignBox = K('[name="verticalAlign"]', div),
+                borderBox = K('[name="border"]', div).val(1),
+                colorBox = K('.ke-input-color', div);
+            _initColorPicker(div, colorBox.eq(0));
+            _initColorPicker(div, colorBox.eq(1));
+            _setColor(colorBox.eq(1), '');
+            widthBox[0].focus();
+            widthBox[0].select();
+            var cell = self.plugin.getSelectedCell();
+            var match,
+                cellWidth = cell[0].style.width || cell[0].width || '',
+                cellHeight = cell[0].style.height || cell[0].height || '';
+            if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) {
+                widthBox.val(match[1]);
+                widthTypeBox.val(match[2]);
+            } else {
+                widthBox.val('');
+            }
+            if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) {
+                heightBox.val(match[1]);
+                heightTypeBox.val(match[2]);
+            }
+            textAlignBox.val(cell[0].style.textAlign || '');
+            verticalAlignBox.val(cell[0].style.verticalAlign || '');
+            var border = cell[0].style.borderWidth || '';
+            if (border) {
+                border = parseInt(border);
+            }
+            borderBox.val(border);
+            _setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || ''));
+            _setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || ''));
+            widthBox[0].focus();
+            widthBox[0].select();
+        },
+        insert: function () {
+            this.prop(true);
+        },
+        'delete': function () {
+            var table = self.plugin.getSelectedTable();
+            self.cmd.range.setStartBefore(table[0]).collapse(true);
+            self.cmd.select();
+            table.remove();
+            self.addBookmark();
+        },
+        colinsert: function (offset) {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                index = cell.cellIndex + offset;
+            index += table.rows[0].cells.length - row.cells.length;
+            for (var i = 0, len = table.rows.length; i < len; i++) {
+                var newRow = table.rows[i],
+                    newCell = newRow.insertCell(index);
+                newCell.innerHTML = K.IE ? '' : '<br />';
+                index = _getCellIndex(table, newRow, newCell);
+            }
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        colinsertleft: function () {
+            this.colinsert(0);
+        },
+        colinsertright: function () {
+            this.colinsert(1);
+        },
+        rowinsert: function (offset) {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0];
+            var rowIndex = row.rowIndex;
+            if (offset === 1) {
+                rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset;
+            }
+            var newRow = table.insertRow(rowIndex);
+            for (var i = 0, len = row.cells.length; i < len; i++) {
+                if (row.cells[i].rowSpan > 1) {
+                    len -= row.cells[i].rowSpan - 1;
+                }
+                var newCell = newRow.insertCell(i);
+                if (offset === 1 && row.cells[i].colSpan > 1) {
+                    newCell.colSpan = row.cells[i].colSpan;
+                }
+                newCell.innerHTML = K.IE ? '' : '<br />';
+            }
+            for (var j = rowIndex; j >= 0; j--) {
+                var cells = table.rows[j].cells;
+                if (cells.length > i) {
+                    for (var k = cell.cellIndex; k >= 0; k--) {
+                        if (cells[k].rowSpan > 1) {
+                            cells[k].rowSpan += 1;
+                        }
+                    }
+                    break;
+                }
+            }
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        rowinsertabove: function () {
+            this.rowinsert(0);
+        },
+        rowinsertbelow: function () {
+            this.rowinsert(1);
+        },
+        rowmerge: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                rowIndex = row.rowIndex,
+                nextRowIndex = rowIndex + cell.rowSpan,
+                nextRow = table.rows[nextRowIndex];
+            if (table.rows.length <= nextRowIndex) {
+                return;
+            }
+            var cellIndex = cell.cellIndex;
+            if (nextRow.cells.length <= cellIndex) {
+                return;
+            }
+            var nextCell = nextRow.cells[cellIndex];
+            if (cell.colSpan !== nextCell.colSpan) {
+                return;
+            }
+            cell.rowSpan += nextCell.rowSpan;
+            nextRow.deleteCell(cellIndex);
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        colmerge: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                rowIndex = row.rowIndex,
+                cellIndex = cell.cellIndex,
+                nextCellIndex = cellIndex + 1;
+            if (row.cells.length <= nextCellIndex) {
+                return;
+            }
+            var nextCell = row.cells[nextCellIndex];
+            if (cell.rowSpan !== nextCell.rowSpan) {
+                return;
+            }
+            cell.colSpan += nextCell.colSpan;
+            row.deleteCell(nextCellIndex);
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        rowsplit: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                rowIndex = row.rowIndex;
+            if (cell.rowSpan === 1) {
+                return;
+            }
+            var cellIndex = _getCellIndex(table, row, cell);
+            for (var i = 1, len = cell.rowSpan; i < len; i++) {
+                var newRow = table.rows[rowIndex + i],
+                    newCell = newRow.insertCell(cellIndex);
+                if (cell.colSpan > 1) {
+                    newCell.colSpan = cell.colSpan;
+                }
+                newCell.innerHTML = K.IE ? '' : '<br />';
+                cellIndex = _getCellIndex(table, newRow, newCell);
+            }
+            K(cell).removeAttr('rowSpan');
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        colsplit: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                cellIndex = cell.cellIndex;
+            if (cell.colSpan === 1) {
+                return;
+            }
+            for (var i = 1, len = cell.colSpan; i < len; i++) {
+                var newCell = row.insertCell(cellIndex + i);
+                if (cell.rowSpan > 1) {
+                    newCell.rowSpan = cell.rowSpan;
+                }
+                newCell.innerHTML = K.IE ? '' : '<br />';
+            }
+            K(cell).removeAttr('colSpan');
+            self.cmd.range.selectNodeContents(cell).collapse(true);
+            self.cmd.select();
+            self.addBookmark();
+        },
+        coldelete: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                index = cell.cellIndex;
+            for (var i = 0, len = table.rows.length; i < len; i++) {
+                var newRow = table.rows[i],
+                    newCell = newRow.cells[index];
+                if (newCell.colSpan > 1) {
+                    newCell.colSpan -= 1;
+                    if (newCell.colSpan === 1) {
+                        K(newCell).removeAttr('colSpan');
+                    }
+                } else {
+                    newRow.deleteCell(index);
+                }
+                if (newCell.rowSpan > 1) {
+                    i += newCell.rowSpan - 1;
+                }
+            }
+            if (row.cells.length === 0) {
+                self.cmd.range.setStartBefore(table).collapse(true);
+                self.cmd.select();
+                K(table).remove();
+            } else {
+                self.cmd.selection(true);
+            }
+            self.addBookmark();
+        },
+        rowdelete: function () {
+            var table = self.plugin.getSelectedTable()[0],
+                row = self.plugin.getSelectedRow()[0],
+                cell = self.plugin.getSelectedCell()[0],
+                rowIndex = row.rowIndex;
+            for (var i = cell.rowSpan - 1; i >= 0; i--) {
+                table.deleteRow(rowIndex + i);
+            }
+            if (table.rows.length === 0) {
+                self.cmd.range.setStartBefore(table).collapse(true);
+                self.cmd.select();
+                K(table).remove();
+            } else {
+                self.cmd.selection(true);
+            }
+            self.addBookmark();
+        }
+    };
+    self.clickToolbar(name, self.plugin.table.prop);
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('template', function (K) {
+    var self = this, name = 'template', lang = self.lang(name + '.'),
+        htmlPath = self.pluginsPath + name + '/html/';
+
+    function getFilePath(fileName) {
+        return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION);
+    }
+
+    self.clickToolbar(name, function () {
+        var lang = self.lang(name + '.'),
+            arr = ['<div class="ke-dialog-content-inner" style="padding-top:0">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<div class="ke-header" style="height: 32px;">',
+                lang.selectTemplate + ' <select class="ke-select">'];
+        K.each(lang.fileList, function (key, val) {
+            arr.push('<option value="' + key + '">' + val + '</option>');
+        });
+        html = [arr.join(''),
+            '</select>',
+            '<input type="checkbox" id="keReplaceFlag" class="checkbox" name="replaceFlag" value="1" /> <label for="keReplaceFlag">' + lang.replaceContent + '</label>',
+            '</div>',
+            '</div>',
+            '<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',
+            '</div>'].join('');
+        var dialog = self.createDialog({
+            name: name,
+            width: 500,
+            title: self.lang(name),
+            body: html,
+            yesBtn: {
+                name: self.lang('yes'),
+                click: function (e) {
+                    var doc = K.iframeDoc(iframe);
+                    self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus();
+                }
+            }
+        });
+        var selectBox = K('select', dialog.div),
+            checkbox = K('[name="replaceFlag"]', dialog.div),
+            iframe = K('iframe', dialog.div);
+        checkbox[0].checked = true;
+        iframe.attr('src', getFilePath(selectBox.val()));
+        selectBox.change(function () {
+            iframe.attr('src', getFilePath(this.value));
+        });
+    });
+});
+
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+KindEditor.plugin('wordpaste', function (K) {
+    var self = this, name = 'wordpaste';
+    self.clickToolbar(name, function () {
+        var jsonp = function (url, callback) {
+            var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
+            window[callbackName] = function (data) {
+                delete window[callbackName];
+                document.body.removeChild(script);
+                callback(data);
+            };
+
+            var script = document.createElement('script');
+            script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
+            document.body.appendChild(script);
+        };
+        var lang = self.lang(name + '.'),
+            html = '<div style="padding:10px 20px;">' +
+                '<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+                '<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>' +
+                '</div>',
+            dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var str = doc.body.innerHTML;
+                        str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags);
+                        if (typeof self.wordImageServer !== 'undefined' && self.wordImageServer) {
+                            var i = 0;
+                            var arr = [];
+                            var replacedStr = str.replace(/file:\/\/+(localhost)?(\S+\.(png|jpg|jpeg|gif|bmp))/ig, function (value) {
+                                arr[i] = value;
+                                var replaced = "##" + i + "##";
+                                i++;
+                                return replaced;
+                            });
+                            for (var j = 0; j < arr.length; j++) {
+                                jsonp("http://" + self.wordImageServer + "/word?index=" + j + "&file=" + encodeURIComponent(arr[j]), function (data) {
+                                    K.uploadwordimage.call(self, data.index, data.info);
+                                });
+                            }
+                            str = replacedStr;
+                        }
+                        self.insertHtml(str).hideDialog().focus();
+                    }
+                }
+            }),
+            div = dialog.div,
+            iframe = K('iframe', div),
+            doc = K.iframeDoc(iframe);
+        if (!K.IE) {
+            doc.designMode = 'on';
+        }
+        doc.open();
+        doc.write('<!doctype html><html><head><title>WordPaste</title></head>');
+        doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');
+        if (!K.IE) {
+            doc.write('<br />');
+        }
+        doc.write('</body></html>');
+        doc.close();
+        if (K.IE) {
+            doc.body.contentEditable = 'true';
+        }
+        iframe[0].contentWindow.focus();
+    });
+});
+
+
+KindEditor.plugin('fixtoolbar', function (K) {
+    var self = this;
+    if (!self.fixToolBar) {
+        return;
+    }
+
+    function init() {
+        var toolbar = K('.ke-toolbar');
+        var originY = toolbar.pos().y;
+        K(window).bind('scroll', function () {
+            if (toolbar.css('position') == 'fixed') {
+                if (document.body.scrollTop - originY < 0) {
+                    toolbar.css('position', 'static');
+                    toolbar.css('top', 'auto');
+                }
+            } else {
+                if (toolbar.pos().y - document.body.scrollTop < 0) {
+                    toolbar.css('position', 'fixed');
+                    toolbar.css('top', 0);
+                }
+            }
+        });
+    }
+
+    if (self.isCreated) {
+        init();
+    } else {
+        self.afterCreate(init);
+    }
+});
diff --git a/public/assets/addons/nkeditor/nkeditor.min.js b/public/assets/addons/nkeditor/nkeditor.min.js
new file mode 100644
index 0000000..1c399aa
--- /dev/null
+++ b/public/assets/addons/nkeditor/nkeditor.min.js
@@ -0,0 +1 @@
+(function(window,undefined){if(window.KindEditor){return}if(!window.console){window.console={}}if(!console.log){console.log=function(){}}var _VERSION="5.0.3 (2018-10-25)",_ua=navigator.userAgent.toLowerCase(),_IE=_ua.indexOf("msie")>-1&&_ua.indexOf("opera")==-1,_NEWIE=_ua.indexOf("msie")==-1&&_ua.indexOf("trident")>-1,_GECKO=_ua.indexOf("gecko")>-1&&_ua.indexOf("khtml")==-1,_WEBKIT=_ua.indexOf("applewebkit")>-1,_OPERA=_ua.indexOf("opera")>-1,_MOBILE=_ua.indexOf("mobile")>-1,_IOS=/ipad|iphone|ipod/.test(_ua),_QUIRKS=document.compatMode!="CSS1Compat",_IERANGE=!window.getSelection,_matches=/(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(_ua),_V=_matches?_matches[1]:"0",_TIME=(new Date).getTime();function _isArray(val){if(!val){return false}return Object.prototype.toString.call(val)==="[object Array]"}function _isFunction(val){if(!val){return false}return Object.prototype.toString.call(val)==="[object Function]"}function _inArray(val,arr){for(var i=0,len=arr.length;i<len;i++){if(val===arr[i]){return i}}return-1}function _each(obj,fn){if(_isArray(obj)){for(var i=0,len=obj.length;i<len;i++){if(fn.call(obj[i],i,obj[i])===false){break}}}else{for(var key in obj){if(obj.hasOwnProperty(key)){if(fn.call(obj[key],key,obj[key])===false){break}}}}}function _trim(str){return str.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"")}function _inString(val,str,delimiter){delimiter=delimiter===undefined?",":delimiter;return(delimiter+str+delimiter).indexOf(delimiter+val+delimiter)>=0}function _addUnit(val,unit){unit=unit||"px";return val&&/^-?\d+(?:\.\d+)?$/.test(val)?val+unit:val}function _removeUnit(val){var match;return val&&(match=/(\d+)/.exec(val))?parseInt(match[1],10):0}function _escape(val){return val.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function _unescape(val){return val.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&amp;/g,"&")}function _toCamel(str){var arr=str.split("-");str="";_each(arr,function(key,val){str+=key>0?val.charAt(0).toUpperCase()+val.substr(1):val});return str}function _toHex(val){function hex(d){var s=parseInt(d,10).toString(16).toUpperCase();return s.length>1?s:"0"+s}return val.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/gi,function($0,$1,$2,$3){return"#"+hex($1)+hex($2)+hex($3)})}function _toMap(val,delimiter){delimiter=delimiter===undefined?",":delimiter;var map={},arr=_isArray(val)?val:val.split(delimiter),match;_each(arr,function(key,val){if(match=/^(\d+)\.\.(\d+)$/.exec(val)){for(var i=parseInt(match[1],10);i<=parseInt(match[2],10);i++){map[i.toString()]=true}}else{map[val]=true}});return map}function _toArray(obj,offset){return Array.prototype.slice.call(obj,offset||0)}function _undef(val,defaultVal){return val===undefined?defaultVal:val}function _invalidUrl(url){return!url||/[<>"]/.test(url)}function _addParam(url,param){return url.indexOf("?")>=0?url+"&"+param:url+"?"+param}function _extend(child,parent,proto){if(!proto){proto=parent;parent=null}var childProto;if(parent){var fn=function(){};fn.prototype=parent.prototype;childProto=new fn;_each(proto,function(key,val){childProto[key]=val})}else{childProto=proto}childProto.constructor=child;child.prototype=childProto;child.parent=parent?parent.prototype:null}function _json(text){var match;if(match=/\{[\s\S]*\}|\[[\s\S]*\]/.exec(text)){text=match[0]}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){return eval("("+text+")")}throw"JSON parse error"}function _merge(distObj,obj){for(var name in distObj){obj[name]=distObj[name]}return obj}var _round=Math.round;var K={DEBUG:false,VERSION:_VERSION,IE:_IE,GECKO:_GECKO,WEBKIT:_WEBKIT,OPERA:_OPERA,V:_V,TIME:_TIME,each:_each,isArray:_isArray,isFunction:_isFunction,inArray:_inArray,inString:_inString,trim:_trim,addUnit:_addUnit,removeUnit:_removeUnit,escape:_escape,unescape:_unescape,toCamel:_toCamel,toHex:_toHex,toMap:_toMap,toArray:_toArray,undef:_undef,invalidUrl:_invalidUrl,addParam:_addParam,extend:_extend,merge:_merge,json:_json};var _INLINE_TAG_MAP=_toMap("a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"),_BLOCK_TAG_MAP=_toMap("address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul"),_SINGLE_TAG_MAP=_toMap("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed"),_STYLE_TAG_MAP=_toMap("b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u"),_CONTROL_TAG_MAP=_toMap("img,table,input,textarea,button"),_PRE_TAG_MAP=_toMap("pre,style,script"),_NOSPLIT_TAG_MAP=_toMap("html,head,body,td,tr,table,ol,ul,li"),_AUTOCLOSE_TAG_MAP=_toMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"),_FILL_ATTR_MAP=_toMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),_VALUE_TAG_MAP=_toMap("input,button,textarea,select");function _getBasePath(){var els=document.getElementsByTagName("script"),src;for(var i=0,len=els.length;i<len;i++){src=els[i].src||"";if(/NKeditor[\w\-\.]*\.js/i.test(src)){return src.substring(0,src.lastIndexOf("/")+1)}}return""}K.basePath=_getBasePath();K.options={designMode:true,fullscreenMode:false,filterMode:true,wellFormatMode:true,loadStyleMode:true,basePath:K.basePath,themesPath:K.basePath+"themes/",langPath:K.basePath+"lang/",pluginsPath:K.basePath+"plugins/",themeType:"primary",langType:"zh-CN",urlType:"",newlineTag:"p",resizeType:2,syncType:"form",pasteType:2,dialogAlignType:"page",useContextmenu:true,fullscreenShortcut:false,bodyClass:"ke-content",indentChar:"\t",cssPath:[],jsPath:[],showHelpGrid:false,cssData:"",minWidth:650,minHeight:300,minChangeSize:50,zIndex:811213,items:["source","undo","redo","preview","print","template","code","quote","cut","copy","paste","plainpaste","wordpaste","justifyleft","justifycenter","justifyright","justifyfull","insertorderedlist","insertunorderedlist","indent","outdent","subscript","superscript","clearhtml","quickformat","selectall","formatblock","fontname","fontsize","forecolor","hilitecolor","bold","italic","underline","strikethrough","lineheight","removeformat","image","multiimage","graft","flash","media","insertfile","table","hr","emoticons","baidumap","pagebreak","anchor","link","unlink","about","fullscreen"],noDisableItems:["source","fullscreen"],colorTable:[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#DDDDDD","#999999","#666666","#333333","#000000"]],fontSizeTable:["9px","10px","12px","14px","16px","18px","24px","32px"],htmlTags:{font:["id","class","color","size","face",".background-color"],span:["id","class",".color",".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".line-height"],div:["id","class","align",".border",".margin",".padding",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".background",".font-style",".text-decoration",".vertical-align",".margin-left"],table:["id","class","border","cellspacing","cellpadding","width","height","align","bordercolor",".padding",".margin",".border","bgcolor",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".background",".width",".height",".border-collapse"],"td,th":["id","class","align","valign","width","height","colspan","rowspan","bgcolor",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".vertical-align",".background",".border"],a:["id","class","href","target","name"],embed:["id","class","src","width","height","type","loop","autostart","quality",".width",".height","align","allowscriptaccess","wmode","controls"],img:["id","class","src","width","height","border","alt","title","align",".width",".height",".border"],"p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6":["id","class","align",".text-align",".color",".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".text-indent",".margin-left"],pre:["id","class"],hr:["id","class",".page-break-after"],"br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del":["id","class"],iframe:["id","class","src","frameborder","width","height",".width",".height"]},layout:'<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>',afterBlur:function(){this.sync()},errorMsgHandler:function(message,type){console.log(message);console.log(type);alert(message)},dialogOffset:0,allowUploadGraft:true,resLoadCache:{},tableBorderColor:"#cccccc"};var _useCapture=false;var _INPUT_KEY_MAP=_toMap("8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222");var _CURSORMOVE_KEY_MAP=_toMap("33..40");var _CHANGE_KEY_MAP={};_each(_INPUT_KEY_MAP,function(key,val){_CHANGE_KEY_MAP[key]=val});_each(_CURSORMOVE_KEY_MAP,function(key,val){_CHANGE_KEY_MAP[key]=val});function _bindEvent(el,type,fn){if(el.addEventListener){el.addEventListener(type,fn,_useCapture)}else if(el.attachEvent){el.attachEvent("on"+type,fn)}}function _unbindEvent(el,type,fn){if(el.removeEventListener){el.removeEventListener(type,fn,_useCapture)}else if(el.detachEvent){el.detachEvent("on"+type,fn)}}var _EVENT_PROPS=("altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,"+"data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,"+"pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which").split(",");function KEvent(el,event){this.init(el,event)}_extend(KEvent,{init:function(el,event){var self=this,doc=el.ownerDocument||el.document||el;self.event=event;_each(_EVENT_PROPS,function(key,val){self[val]=event[val]});if(!self.target){self.target=self.srcElement||doc}if(self.target.nodeType===3){self.target=self.target.parentNode}if(!self.relatedTarget&&self.fromElement){self.relatedTarget=self.fromElement===self.target?self.toElement:self.fromElement}if(self.pageX==null&&self.clientX!=null){var d=doc.documentElement,body=doc.body;self.pageX=self.clientX+(d&&d.scrollLeft||body&&body.scrollLeft||0)-(d&&d.clientLeft||body&&body.clientLeft||0);self.pageY=self.clientY+(d&&d.scrollTop||body&&body.scrollTop||0)-(d&&d.clientTop||body&&body.clientTop||0)}if(!self.which&&(self.charCode||self.charCode===0?self.charCode:self.keyCode)){self.which=self.charCode||self.keyCode}if(!self.metaKey&&self.ctrlKey){self.metaKey=self.ctrlKey}if(!self.which&&self.button!==undefined){self.which=self.button&1?1:self.button&2?3:self.button&4?2:0}switch(self.which){case 186:self.which=59;break;case 187:case 107:case 43:self.which=61;break;case 189:case 45:self.which=109;break;case 42:self.which=106;break;case 47:self.which=111;break;case 78:self.which=110;break}if(self.which>=96&&self.which<=105){self.which-=48}},preventDefault:function(){var ev=this.event;if(ev.preventDefault){ev.preventDefault()}else{ev.returnValue=false}},stopPropagation:function(){var ev=this.event;if(ev.stopPropagation){ev.stopPropagation()}else{ev.cancelBubble=true}},stop:function(){this.preventDefault();this.stopPropagation()}});var _eventExpendo="kindeditor_"+_TIME,_eventId=0,_eventData={};function _getId(el){return el[_eventExpendo]||null}function _setId(el){el[_eventExpendo]=++_eventId;return _eventId}function _removeId(el){try{delete el[_eventExpendo]}catch(e){if(el.removeAttribute){el.removeAttribute(_eventExpendo)}}}function _bind(el,type,fn){if(type.indexOf(",")>=0){_each(type.split(","),function(){_bind(el,this,fn)});return}var id=_getId(el);if(!id){id=_setId(el)}if(_eventData[id]===undefined){_eventData[id]={}}var events=_eventData[id][type];if(events&&events.length>0){_unbindEvent(el,type,events[0])}else{_eventData[id][type]=[];_eventData[id].el=el}events=_eventData[id][type];if(events.length===0){events[0]=function(e){var kevent=e?new KEvent(el,e):undefined;_each(events,function(i,event){if(i>0&&event){event.call(el,kevent)}})}}if(_inArray(fn,events)<0){events.push(fn)}_bindEvent(el,type,events[0])}function _unbind(el,type,fn){if(type&&type.indexOf(",")>=0){_each(type.split(","),function(){_unbind(el,this,fn)});return}var id=_getId(el);if(!id){return}if(type===undefined){if(id in _eventData){_each(_eventData[id],function(key,events){if(key!="el"&&events.length>0){_unbindEvent(el,key,events[0])}});delete _eventData[id];_removeId(el)}return}if(!_eventData[id]){return}var events=_eventData[id][type];if(events&&events.length>0){if(fn===undefined){_unbindEvent(el,type,events[0]);delete _eventData[id][type]}else{_each(events,function(i,event){if(i>0&&event===fn){events.splice(i,1)}});if(events.length==1){_unbindEvent(el,type,events[0]);delete _eventData[id][type]}}var count=0;_each(_eventData[id],function(){count++});if(count<2){delete _eventData[id];_removeId(el)}}}function _fire(el,type){if(type.indexOf(",")>=0){_each(type.split(","),function(){_fire(el,this)});return}var id=_getId(el);if(!id){return}var events=_eventData[id][type];if(_eventData[id]&&events&&events.length>0){events[0]()}}function _ctrl(el,key,fn){var self=this;key=/^\d{2,}$/.test(key)?key:key.toUpperCase().charCodeAt(0);_bind(el,"keydown",function(e){if(e.ctrlKey&&e.which==key&&!e.shiftKey&&!e.altKey){fn.call(el);e.stop()}})}var _readyFinished=false;function _ready(fn){if(_readyFinished){fn(KindEditor);return}var loaded=false;function readyFunc(){if(!loaded){loaded=true;fn(KindEditor);_readyFinished=true}}function ieReadyFunc(){if(!loaded){try{document.documentElement.doScroll("left")}catch(e){setTimeout(ieReadyFunc,100);return}readyFunc()}}function ieReadyStateFunc(){if(document.readyState==="complete"){readyFunc()}}if(document.addEventListener){_bind(document,"DOMContentLoaded",readyFunc)}else if(document.attachEvent){_bind(document,"readystatechange",ieReadyStateFunc);var toplevel=false;try{toplevel=window.frameElement==null}catch(e){}if(document.documentElement.doScroll&&toplevel){ieReadyFunc()}}_bind(window,"load",readyFunc)}if(window.attachEvent){window.attachEvent("onunload",function(){_each(_eventData,function(key,events){if(events.el){_unbind(events.el)}})})}K.ctrl=_ctrl;K.ready=_ready;function _getCssList(css){css=css.replace(/&quot;/g,'"');var list={},reg=/\s*([\w\-]+)\s*:([^;]*)(;|$)/g,match;while(match=reg.exec(css)){var key=_trim(match[1].toLowerCase()),val=_trim(_toHex(match[2]));list[key]=val}return list}function _getAttrList(tag){var list={},reg=/\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,match;while(match=reg.exec(tag)){var key=(match[1]||match[2]||match[4]||match[6]).toLowerCase(),val=(match[2]?match[3]:match[4]?match[5]:match[7])||"";list[key]=val}return list}function _addClassToTag(tag,className){if(/\s+class\s*=/.test(tag)){tag=tag.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/,function($0,$1,$2,$3){if((" "+$2+" ").indexOf(" "+className+" ")<0){return $2===""?$1+className+$3:$1+$2+" "+className+$3}else{return $0}})}else{tag=tag.substr(0,tag.length-1)+' class="'+className+'">'}return tag}function _formatCss(css){var str="";_each(_getCssList(css),function(key,val){str+=key+":"+val+";"});return str}function _formatUrl(url,mode,host,pathname){mode=_undef(mode,"").toLowerCase();if(url.substr(0,5)!="data:"){url=url.replace(/([^:])\/\//g,"$1/")}if(_inArray(mode,["absolute","relative","domain"])<0){return url}host=host||location.protocol+"//"+location.host;if(pathname===undefined){var m=location.pathname.match(/^(\/.*)\//);pathname=m?m[1]:""}if(/^\w+:/.test(url)){return url}var match;if(match=/^(\w+:\/\/[^\/]*)/.exec(url)){if(match[1]!==host){return url}}function getRealPath(path){var parts=path.split("/"),paths=[];for(var i=0,len=parts.length;i<len;i++){var part=parts[i];if(part==".."){if(paths.length>0){paths.pop()}}else if(part!==""&&part!="."){paths.push(part)}}return"/"+paths.join("/")}if(/^\//.test(url)){url=host+getRealPath(url.substr(1))}else if(!/^\w+:\/\//.test(url)){url=host+getRealPath(pathname+"/"+url)}function getRelativePath(path,depth){if(url.substr(0,path.length)===path){var arr=[];for(var i=0;i<depth;i++){arr.push("..")}var prefix=".";if(arr.length>0){prefix+="/"+arr.join("/")}if(pathname=="/"){prefix+="/"}return prefix+url.substr(path.length)}else{if(match=/^(.*)\//.exec(path)){return getRelativePath(match[1],++depth)}}}if(mode==="relative"){url=getRelativePath(host+pathname,0).substr(2)}else if(mode==="absolute"){if(url.substr(0,host.length)===host){url=url.substr(host.length)}}return url}function _formatHtml(html,htmlTags,urlType,wellFormatted,indentChar){if(html==null){html=""}urlType=urlType||"";wellFormatted=_undef(wellFormatted,false);indentChar=_undef(indentChar,"\t");var fontSizeList="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");html=html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/gi,function($0,$1,$2,$3){return $1+$2.replace(/<(?:br|br\s[^>]*)>/gi,"\n")+$3});html=html.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/gi,"</p>");html=html.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/gi,"$1<br />$2");html=html.replace(/\u200B/g,"");html=html.replace(/\u00A9/g,"&copy;");html=html.replace(/\u00AE/g,"&reg;");html=html.replace(/\u2003/g,"&emsp;");html=html.replace(/\u3000/g,"&emsp;");html=html.replace(/<[^>]+/g,function($0){return $0.replace(/\s+/g," ")});var htmlTagMap={};if(htmlTags){_each(htmlTags,function(key,val){var arr=key.split(",");for(var i=0,len=arr.length;i<len;i++){htmlTagMap[arr[i]]=_toMap(val)}});if(!htmlTagMap.script){html=html.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/gi,"")}if(!htmlTagMap.style){html=html.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/gi,"")}}var re=/(\s*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>(\s*)/g;var tagStack=[];html=html.replace(re,function($0,$1,$2,$3,$4,$5,$6){var full=$0,startNewline=$1||"",startSlash=$2||"",tagName=$3.toLowerCase(),attr=$4||"",endSlash=$5?" "+$5:"",endNewline=$6||"";if(tagName=="code"){return full}if(htmlTags&&!htmlTagMap[tagName]){return""}if(endSlash===""&&_SINGLE_TAG_MAP[tagName]){endSlash=" /"}if(_INLINE_TAG_MAP[tagName]){if(startNewline){startNewline=" "}if(endNewline){endNewline=" "}}if(_PRE_TAG_MAP[tagName]){if(startSlash){endNewline="\n"}else{startNewline="\n"}}if(wellFormatted&&tagName=="br"){endNewline="\n"}if(_BLOCK_TAG_MAP[tagName]&&!_PRE_TAG_MAP[tagName]){if(wellFormatted){if(startSlash&&tagStack.length>0&&tagStack[tagStack.length-1]===tagName){tagStack.pop()}else{tagStack.push(tagName)}startNewline="\n";endNewline="\n";for(var i=0,len=startSlash?tagStack.length:tagStack.length-1;i<len;i++){startNewline+=indentChar;if(!startSlash){endNewline+=indentChar}}if(endSlash){tagStack.pop()}else if(!startSlash){endNewline+=indentChar}}else{startNewline=endNewline=""}}if(attr!==""){var attrMap=_getAttrList(full);if(tagName==="font"){var fontStyleMap={},fontStyle="";_each(attrMap,function(key,val){if(key==="color"){fontStyleMap.color=val;delete attrMap[key]}if(key==="size"){fontStyleMap["font-size"]=fontSizeList[parseInt(val,10)-1]||"";delete attrMap[key]}if(key==="face"){fontStyleMap["font-family"]=val;delete attrMap[key]}if(key==="style"){fontStyle=val}});if(fontStyle&&!/;$/.test(fontStyle)){fontStyle+=";"}_each(fontStyleMap,function(key,val){if(val===""){return}if(/\s/.test(val)){val="'"+val+"'"}fontStyle+=key+":"+val+";"});attrMap.style=fontStyle}_each(attrMap,function(key,val){if(_FILL_ATTR_MAP[key]){attrMap[key]=key}if(_inArray(key,["src","href"])>=0){attrMap[key]=_formatUrl(val,urlType)}if(htmlTags&&key!=="style"&&!htmlTagMap[tagName]["*"]&&!htmlTagMap[tagName][key]||tagName==="body"&&key==="contenteditable"||/^kindeditor_\d+$/.test(key)){delete attrMap[key]}if(key==="style"&&val!==""){var styleMap=_getCssList(val);_each(styleMap,function(k,v){if(htmlTags&&!htmlTagMap[tagName].style&&!htmlTagMap[tagName]["."+k]){delete styleMap[k]}});var style="";_each(styleMap,function(k,v){style+=k+":"+v+";"});attrMap.style=style}});attr="";_each(attrMap,function(key,val){if(key==="style"&&val===""){return}val=val.replace(/"/g,"&quot;");attr+=" "+key+'="'+val+'"'})}if(tagName==="font"){tagName="span"}return startNewline+"<"+startSlash+tagName+attr+endSlash+">"+endNewline});html=html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/gi,function($0,$1,$2,$3){return $1+$2.replace(/\n/g,'<span id="__kindeditor_pre_newline__">\n')+$3});html=html.replace(/\n\s*\n/g,"\n");html=html.replace(/<span id="__kindeditor_pre_newline__">\n/g,"\n");return _trim(html)}function _clearMsWord(html,htmlTags){html=html.replace(/<meta[\s\S]*?>/gi,"").replace(/<![\s\S]*?>/gi,"").replace(/<style[^>]*>[\s\S]*?<\/style>/gi,"").replace(/<script[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/gi,"").replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/gi,"").replace(/<xml>[\s\S]*?<\/xml>/gi,"").replace(/<(?:table|td)[^>]*>/gi,function(full){return full.replace(/border-bottom:([#\w\s]+)/gi,"border:$1")});return _formatHtml(html,htmlTags)}function _mediaType(src){if(/\.(rm|rmvb)(\?|$)/i.test(src)){return"audio/x-pn-realaudio-plugin"}if(/\.(mp4)(\?|$)/i.test(src)){return"video/mpeg4"}if(/\.(swf|flv)(\?|$)/i.test(src)){return"application/x-shockwave-flash"}return"video/x-ms-asf-plugin"}function _mediaClass(type){if(/realaudio/i.test(type)){return"ke-rm"}if(/flash/i.test(type)){return"ke-flash"}return"ke-media"}function _mediaAttrs(srcTag){return _getAttrList(unescape(srcTag))}function _mediaEmbed(attrs){var type=attrs.type=="video/mpeg4"?"video":"embed";if(type=="video"){attrs.controls="controls"}var html="<"+type+" ";_each(attrs,function(key,val){html+=key+'="'+val+'" '});html+="/>";return html}function _mediaImg(blankPath,attrs){var width=attrs.width,height=attrs.height,type=attrs.type||_mediaType(attrs.src),srcTag=_mediaEmbed(attrs),style="";if(/\D/.test(width)){style+="width:"+width+";"}else if(width>0){style+="width:"+width+"px;"}if(/\D/.test(height)){style+="height:"+height+";"}else if(height>0){style+="height:"+height+"px;"}var html='<img class="'+_mediaClass(type)+'" src="'+blankPath+'" ';if(style!==""){html+='style="'+style+'" '}html+='data-ke-tag="'+escape(srcTag)+'" alt="" />';return html}function _tmpl(str,data){var fn=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};"+"with(obj){p.push('"+str.replace(/[\r\t\n]/g," ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return data?fn(data):fn}K.formatUrl=_formatUrl;K.formatHtml=_formatHtml;K.getCssList=_getCssList;K.getAttrList=_getAttrList;K.mediaType=_mediaType;K.mediaAttrs=_mediaAttrs;K.mediaEmbed=_mediaEmbed;K.mediaImg=_mediaImg;K.clearMsWord=_clearMsWord;K.tmpl=_tmpl;function _contains(nodeA,nodeB){if(nodeA.nodeType==9&&nodeB.nodeType!=9){return true}while(nodeB=nodeB.parentNode){if(nodeB==nodeA){return true}}return false}var _getSetAttrDiv=document.createElement("div");_getSetAttrDiv.setAttribute("className","t");var _GET_SET_ATTRIBUTE=_getSetAttrDiv.className!=="t";function _getAttr(el,key){key=key.toLowerCase();var val=null;if(!_GET_SET_ATTRIBUTE&&el.nodeName.toLowerCase()!="script"){var div=el.ownerDocument.createElement("div");div.appendChild(el.cloneNode(false));var list=_getAttrList(_unescape(div.innerHTML));if(key in list){val=list[key]}}else{try{val=el.getAttribute(key,2)}catch(e){val=el.getAttribute(key,1)}}if(key==="style"&&val!==null){val=_formatCss(val)}return val}function _queryAll(expr,root){var exprList=expr.split(",");if(exprList.length>1){var mergedResults=[];_each(exprList,function(){_each(_queryAll(this,root),function(){if(_inArray(this,mergedResults)<0){mergedResults.push(this)}})});return mergedResults}root=root||document;function escape(str){if(typeof str!="string"){return str}return str.replace(/([^\w\-])/g,"\\$1")}function stripslashes(str){return str.replace(/\\/g,"")}function cmpTag(tagA,tagB){return tagA==="*"||tagA.toLowerCase()===escape(tagB.toLowerCase())}function byId(id,tag,root){var arr=[],doc=root.ownerDocument||root,el=doc.getElementById(stripslashes(id));if(el){if(cmpTag(tag,el.nodeName)&&_contains(root,el)){arr.push(el)}}return arr}function byClass(className,tag,root){var doc=root.ownerDocument||root,arr=[],els,i,len,el;if(root.getElementsByClassName){els=root.getElementsByClassName(stripslashes(className));for(i=0,len=els.length;i<len;i++){el=els[i];if(cmpTag(tag,el.nodeName)){arr.push(el)}}}else if(doc.querySelectorAll){els=doc.querySelectorAll((root.nodeName!=="#document"?root.nodeName+" ":"")+tag+"."+className);for(i=0,len=els.length;i<len;i++){el=els[i];if(_contains(root,el)){arr.push(el)}}}else{els=root.getElementsByTagName(tag);className=" "+className+" ";for(i=0,len=els.length;i<len;i++){el=els[i];if(el.nodeType==1){var cls=el.className;if(cls&&(" "+cls+" ").indexOf(className)>-1){arr.push(el)}}}}return arr}function byName(name,tag,root){var arr=[],doc=root.ownerDocument||root,els=doc.getElementsByName(stripslashes(name)),el;for(var i=0,len=els.length;i<len;i++){el=els[i];if(cmpTag(tag,el.nodeName)&&_contains(root,el)){if(el.getAttribute("name")!==null){arr.push(el)}}}return arr}function byAttr(key,val,tag,root){var arr=[],els=root.getElementsByTagName(tag),el;for(var i=0,len=els.length;i<len;i++){el=els[i];if(el.nodeType==1){if(val===null){if(_getAttr(el,key)!==null){arr.push(el)}}else{if(val===escape(_getAttr(el,key))){arr.push(el)}}}}return arr}function select(expr,root){var arr=[],matches;matches=/^((?:\\.|[^.#\s\[<>])+)/.exec(expr);var tag=matches?matches[1]:"*";if(matches=/#((?:[\w\-]|\\.)+)$/.exec(expr)){arr=byId(matches[1],tag,root)}else if(matches=/\.((?:[\w\-]|\\.)+)$/.exec(expr)){arr=byClass(matches[1],tag,root)}else if(matches=/\[((?:[\w\-]|\\.)+)\]/.exec(expr)){arr=byAttr(matches[1].toLowerCase(),null,tag,root)}else if(matches=/\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(expr)){var key=matches[1].toLowerCase(),val=matches[2];if(key==="id"){arr=byId(val,tag,root)}else if(key==="class"){arr=byClass(val,tag,root)}else if(key==="name"){arr=byName(val,tag,root)}else{arr=byAttr(key,val,tag,root)}}else{var els=root.getElementsByTagName(tag),el;for(var i=0,len=els.length;i<len;i++){el=els[i];if(el.nodeType==1){arr.push(el)}}}return arr}var parts=[],arr,re=/((?:\\.|[^\s>])+|[\s>])/g;while(arr=re.exec(expr)){if(arr[1]!==" "){parts.push(arr[1])}}var results=[];if(parts.length==1){return select(parts[0],root)}var isChild=false,part,els,subResults,val,v,i,j,k,length,len,l;for(i=0,lenth=parts.length;i<lenth;i++){part=parts[i];if(part===">"){isChild=true;continue}if(i>0){els=[];for(j=0,len=results.length;j<len;j++){val=results[j];subResults=select(part,val);for(k=0,l=subResults.length;k<l;k++){v=subResults[k];if(isChild){if(val===v.parentNode){els.push(v)}}else{els.push(v)}}}results=els}else{results=select(part,root)}if(results.length===0){return[]}}return results}function _query(expr,root){var arr=_queryAll(expr,root);return arr.length>0?arr[0]:null}K.query=_query;K.queryAll=_queryAll;function _get(val){return K(val)[0]}function _getDoc(node){if(!node){return document}return node.ownerDocument||node.document||node}function _getWin(node){if(!node){return window}var doc=_getDoc(node);return doc.parentWindow||doc.defaultView}function _setHtml(el,html){if(el.nodeType!=1){return}var doc=_getDoc(el);try{el.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+html;var temp=doc.getElementById("__kindeditor_temp_tag__");temp.parentNode.removeChild(temp)}catch(e){K(el).empty();K("@"+html,doc).each(function(){el.appendChild(this)})}}function _hasClass(el,cls){return _inString(cls,el.className," ")}function _setAttr(el,key,val){if(_IE&&_V<8&&key.toLowerCase()=="class"){key="className"}el.setAttribute(key,""+val)}function _removeAttr(el,key){if(_IE&&_V<8&&key.toLowerCase()=="class"){key="className"}_setAttr(el,key,"");el.removeAttribute(key)}function _getNodeName(node){if(!node||!node.nodeName){return""}return node.nodeName.toLowerCase()}function _computedCss(el,key){var self=this,win=_getWin(el),camelKey=_toCamel(key),val="";if(win.getComputedStyle){var style=win.getComputedStyle(el,null);val=style[camelKey]||style.getPropertyValue(key)||el.style[camelKey]}else if(el.currentStyle){val=el.currentStyle[camelKey]||el.style[camelKey]}return val}function _hasVal(node){return!!_VALUE_TAG_MAP[_getNodeName(node)]}function _docElement(doc){doc=doc||document;return _QUIRKS?doc.body:doc.documentElement}function _docHeight(doc){var el=_docElement(doc);return Math.max(el.scrollHeight,el.clientHeight)}function _docWidth(doc){var el=_docElement(doc);return Math.max(el.scrollWidth,el.clientWidth)}function _getScrollPos(doc){doc=doc||document;var x,y;if(_IE||_NEWIE||_OPERA){x=_docElement(doc).scrollLeft;y=_docElement(doc).scrollTop}else{x=_getWin(doc).scrollX;y=_getWin(doc).scrollY}return{x:x,y:y}}function KNode(node){this.init(node)}_extend(KNode,{init:function(node){var self=this;node=_isArray(node)?node:[node];var length=0;for(var i=0,len=node.length;i<len;i++){if(node[i]){self[i]=node[i].constructor===KNode?node[i][0]:node[i];length++}}self.length=length;self.doc=_getDoc(self[0]);self.name=_getNodeName(self[0]);self.type=self.length>0?self[0].nodeType:null;self.win=_getWin(self[0])},each:function(fn){var self=this;for(var i=0;i<self.length;i++){if(fn.call(self[i],i,self[i])===false){return self}}return self},bind:function(type,fn){this.each(function(){_bind(this,type,fn)});return this},unbind:function(type,fn){this.each(function(){_unbind(this,type,fn)});return this},fire:function(type){if(this.length<1){return this}_fire(this[0],type);return this},hasAttr:function(key){if(this.length<1){return false}return!!_getAttr(this[0],key)},attr:function(key,val){var self=this;if(key===undefined){return _getAttrList(self.outer())}if(typeof key==="object"){_each(key,function(k,v){self.attr(k,v)});return self}if(val===undefined){val=self.length<1?null:_getAttr(self[0],key);return val===null?"":val}self.each(function(){_setAttr(this,key,val)});return self},removeAttr:function(key){this.each(function(){_removeAttr(this,key)});return this},get:function(i){if(this.length<1){return null}return this[i||0]},eq:function(i){if(this.length<1){return null}return this[i]?new KNode(this[i]):null},hasClass:function(cls){if(this.length<1){return false}return _hasClass(this[0],cls)},addClass:function(cls){this.each(function(){if(!_hasClass(this,cls)){this.className=_trim(this.className+" "+cls)}});return this},removeClass:function(cls){this.each(function(){if(_hasClass(this,cls)){this.className=_trim(this.className.replace(new RegExp("(^|\\s)"+cls+"(\\s|$)")," "))}});return this},html:function(val){var self=this;if(val===undefined){if(self.length<1||self.type!=1){return""}return _formatHtml(self[0].innerHTML)}self.each(function(){_setHtml(this,val)});return self},text:function(){var self=this;if(self.length<1){return""}return _IE?self[0].innerText:self[0].textContent},hasVal:function(){if(this.length<1){return false}return _hasVal(this[0])},val:function(val){var self=this;if(val===undefined){if(self.length<1){return""}return self.hasVal()?self[0].value:self.attr("value")}else{self.each(function(){if(_hasVal(this)){this.value=val}else{_setAttr(this,"value",val)}});return self}},css:function(key,val){var self=this;if(key===undefined){return _getCssList(self.attr("style"))}if(typeof key==="object"){_each(key,function(k,v){self.css(k,v)});return self}if(val===undefined){if(self.length<1){return""}return self[0].style[_toCamel(key)]||_computedCss(self[0],key)||""}self.each(function(){this.style[_toCamel(key)]=val});return self},width:function(val){var self=this;if(val===undefined){if(self.length<1){return 0}return self[0].offsetWidth}return self.css("width",_addUnit(val))},height:function(val){var self=this;if(val===undefined){if(self.length<1){return 0}return self[0].offsetHeight}return self.css("height",_addUnit(val))},opacity:function(val){this.each(function(){if(this.style.opacity===undefined){this.style.filter=val==1?"":"alpha(opacity="+val*100+")"}else{this.style.opacity=val==1?"":val}});return this},data:function(key,val){var self=this;key="kindeditor_data_"+key;if(val===undefined){if(self.length<1){return null}return self[0][key]}this.each(function(){this[key]=val});return self},pos:function(){var self=this,node=self[0],x=0,y=0;if(node){if(node.getBoundingClientRect){var box=node.getBoundingClientRect(),pos=_getScrollPos(self.doc);x=box.left+pos.x;y=box.top+pos.y}else{while(node){x+=node.offsetLeft;y+=node.offsetTop;node=node.offsetParent}}}return{x:_round(x),y:_round(y)}},clone:function(bool){if(this.length<1){return new KNode([])}return new KNode(this[0].cloneNode(bool))},append:function(expr){this.each(function(){if(this.appendChild){this.appendChild(_get(expr))}});return this},appendTo:function(expr){this.each(function(){_get(expr).appendChild(this)});return this},before:function(expr){this.each(function(){try{this.parentNode.insertBefore(_get(expr),this)}catch(e){}});return this},after:function(expr){this.each(function(){if(this.nextSibling){this.parentNode.insertBefore(_get(expr),this.nextSibling)}else{this.parentNode.appendChild(_get(expr))}});return this},replaceWith:function(expr){var nodes=[];this.each(function(i,node){_unbind(node);var newNode=_get(expr);node.parentNode.replaceChild(newNode,node);nodes.push(newNode)});return K(nodes)},empty:function(){var self=this;self.each(function(i,node){var child=node.firstChild;while(child){if(!node.parentNode){return}var next=child.nextSibling;child.parentNode.removeChild(child);child=next}});return self},remove:function(keepChilds){var self=this;self.each(function(i,node){if(!node.parentNode){return}_unbind(node);if(keepChilds){var child=node.firstChild;while(child){var next=child.nextSibling;node.parentNode.insertBefore(child,node);child=next}}node.parentNode.removeChild(node);delete self[i]});self.length=0;return self},show:function(val){var self=this;if(val===undefined){val=self._originDisplay||""}if(self.css("display")!="none"){return self}return self.css("display",val)},hide:function(){var self=this;if(self.length<1){return self}self._originDisplay=self[0].style.display;return self.css("display","none")},outer:function(){var self=this;if(self.length<1){return""}var div=self.doc.createElement("div"),html;div.appendChild(self[0].cloneNode(true));html=_formatHtml(div.innerHTML);div=null;return html},isSingle:function(){return!!_SINGLE_TAG_MAP[this.name]},isInline:function(){return!!_INLINE_TAG_MAP[this.name]},isBlock:function(){return!!_BLOCK_TAG_MAP[this.name]},isStyle:function(){return!!_STYLE_TAG_MAP[this.name]},isControl:function(){return!!_CONTROL_TAG_MAP[this.name]},contains:function(otherNode){if(this.length<1){return false}return _contains(this[0],_get(otherNode))},parent:function(){if(this.length<1){return null}var node=this[0].parentNode;return node?new KNode(node):null},children:function(){if(this.length<1){return new KNode([])}var list=[],child=this[0].firstChild;while(child){if(child.nodeType!=3||_trim(child.nodeValue)!==""){list.push(child)}child=child.nextSibling}return new KNode(list)},first:function(){var list=this.children();return list.length>0?list.eq(0):null},last:function(){var list=this.children();return list.length>0?list.eq(list.length-1):null},index:function(){if(this.length<1){return-1}var i=-1,sibling=this[0];while(sibling){i++;sibling=sibling.previousSibling}return i},prev:function(){if(this.length<1){return null}var node=this[0].previousSibling;return node?new KNode(node):null},next:function(){if(this.length<1){return null}var node=this[0].nextSibling;return node?new KNode(node):null},scan:function(fn,order){if(this.length<1){return}order=order===undefined?true:order;function walk(node){var n=order?node.firstChild:node.lastChild;while(n){var next=order?n.nextSibling:n.previousSibling;if(fn(n)===false){return false}if(walk(n)===false){return false}n=next}}walk(this[0]);return this}});_each(("blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,"+"change,select,submit,keydown,keypress,keyup,error,contextmenu").split(","),function(i,type){KNode.prototype[type]=function(fn){return fn?this.bind(type,fn):this.fire(type)}});var _K=K;K=function(expr,root){if(expr===undefined||expr===null){return}function newNode(node){if(!node[0]){node=[]}return new KNode(node)}if(typeof expr==="string"){if(root){root=_get(root)}var length=expr.length;if(expr.charAt(0)==="@"){expr=expr.substr(1)}if(expr.length!==length||/<.+>/.test(expr)){var doc=root?root.ownerDocument||root:document,div=doc.createElement("div"),list=[];div.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+expr;for(var i=0,len=div.childNodes.length;i<len;i++){var child=div.childNodes[i];if(child.id=="__kindeditor_temp_tag__"){continue}list.push(child)}return newNode(list)}return newNode(_queryAll(expr,root))}if(expr&&expr.constructor===KNode){return expr}if(expr.toArray){expr=expr.toArray()}if(_isArray(expr)){return newNode(expr)}return newNode(_toArray(arguments))};_each(_K,function(key,val){K[key]=val});K.NodeClass=KNode;window.KindEditor=K;var _START_TO_START=0,_START_TO_END=1,_END_TO_END=2,_END_TO_START=3,_BOOKMARK_ID=0;function _updateCollapsed(range){range.collapsed=range.startContainer===range.endContainer&&range.startOffset===range.endOffset;return range}function _copyAndDelete(range,isCopy,isDelete){var doc=range.doc,nodeList=[];function splitTextNode(node,startOffset,endOffset){var length=node.nodeValue.length,centerNode;if(isCopy){var cloneNode=node.cloneNode(true);if(startOffset>0){centerNode=cloneNode.splitText(startOffset)}else{centerNode=cloneNode}if(endOffset<length){centerNode.splitText(endOffset-startOffset)}}if(isDelete){var center=node;if(startOffset>0){center=node.splitText(startOffset);range.setStart(node,startOffset)}if(endOffset<length){var right=center.splitText(endOffset-startOffset);range.setEnd(right,0)}nodeList.push(center)}return centerNode}function removeNodes(){if(isDelete){range.up().collapse(true)}for(var i=0,len=nodeList.length;i<len;i++){var node=nodeList[i];if(node.parentNode){node.parentNode.removeChild(node)}}}var copyRange=range.cloneRange().down();var start=-1,incStart=-1,incEnd=-1,end=-1,ancestor=range.commonAncestor(),frag=doc.createDocumentFragment();if(ancestor.nodeType==3){var textNode=splitTextNode(ancestor,range.startOffset,range.endOffset);if(isCopy){frag.appendChild(textNode)}removeNodes();return isCopy?frag:range}function extractNodes(parent,frag){var node=parent.firstChild,nextNode;while(node){var testRange=new KRange(doc).selectNode(node);start=testRange.compareBoundaryPoints(_START_TO_END,range);if(start>=0&&incStart<=0){incStart=testRange.compareBoundaryPoints(_START_TO_START,range)}if(incStart>=0&&incEnd<=0){incEnd=testRange.compareBoundaryPoints(_END_TO_END,range)}if(incEnd>=0&&end<=0){end=testRange.compareBoundaryPoints(_END_TO_START,range)}if(end>=0){return false}nextNode=node.nextSibling;if(start>0){if(node.nodeType==1){if(incStart>=0&&incEnd<=0){if(isCopy){frag.appendChild(node.cloneNode(true))}if(isDelete){nodeList.push(node)}}else{var childFlag;if(isCopy){childFlag=node.cloneNode(false);frag.appendChild(childFlag)}if(extractNodes(node,childFlag)===false){return false}}}else if(node.nodeType==3){var textNode;if(node==copyRange.startContainer){textNode=splitTextNode(node,copyRange.startOffset,node.nodeValue.length)}else if(node==copyRange.endContainer){textNode=splitTextNode(node,0,copyRange.endOffset)}else{textNode=splitTextNode(node,0,node.nodeValue.length)}if(isCopy){try{frag.appendChild(textNode)}catch(e){}}}}node=nextNode}}extractNodes(ancestor,frag);if(isDelete){range.up().collapse(true)}for(var i=0,len=nodeList.length;i<len;i++){var node=nodeList[i];if(node.parentNode){node.parentNode.removeChild(node)}}return isCopy?frag:range}function _moveToElementText(range,el){var node=el;while(node){var knode=K(node);if(knode.name=="marquee"||knode.name=="select"){return}node=node.parentNode}try{range.moveToElementText(el)}catch(e){}}function _getStartEnd(rng,isStart){var doc=rng.parentElement().ownerDocument,pointRange=rng.duplicate();pointRange.collapse(isStart);var parent=pointRange.parentElement(),nodes=parent.childNodes;if(nodes.length===0){return{node:parent.parentNode,offset:K(parent).index()}}var startNode=doc,startPos=0,cmp=-1;var testRange=rng.duplicate();_moveToElementText(testRange,parent);for(var i=0,len=nodes.length;i<len;i++){var node=nodes[i];cmp=testRange.compareEndPoints("StartToStart",pointRange);if(cmp===0){return{node:node.parentNode,offset:i}}if(node.nodeType==1){var nodeRange=rng.duplicate(),dummy,knode=K(node),newNode=node;if(knode.isControl()){dummy=doc.createElement("span");knode.after(dummy);newNode=dummy;startPos+=knode.text().replace(/\r\n|\n|\r/g,"").length}_moveToElementText(nodeRange,newNode);testRange.setEndPoint("StartToEnd",nodeRange);if(cmp>0){startPos+=nodeRange.text.replace(/\r\n|\n|\r/g,"").length}else{startPos=0}if(dummy){K(dummy).remove()}}else if(node.nodeType==3){testRange.moveStart("character",node.nodeValue.length);startPos+=node.nodeValue.length}if(cmp<0){startNode=node}}if(cmp<0&&startNode.nodeType==1){return{node:parent,offset:K(parent.lastChild).index()+1}}if(cmp>0){while(startNode.nextSibling&&startNode.nodeType==1){startNode=startNode.nextSibling}}testRange=rng.duplicate();_moveToElementText(testRange,parent);testRange.setEndPoint("StartToEnd",pointRange);startPos-=testRange.text.replace(/\r\n|\n|\r/g,"").length;if(cmp>0&&startNode.nodeType==3){var prevNode=startNode.previousSibling;while(prevNode&&prevNode.nodeType==3){startPos-=prevNode.nodeValue.length;prevNode=prevNode.previousSibling}}return{node:startNode,offset:startPos}}function _getEndRange(node,offset){var doc=node.ownerDocument||node,range=doc.body.createTextRange();if(doc==node){range.collapse(true);return range}if(node.nodeType==1&&node.childNodes.length>0){var children=node.childNodes,isStart,child;if(offset===0){child=children[0];isStart=true}else{child=children[offset-1];isStart=false}if(!child){return range}if(K(child).name==="head"){if(offset===1){isStart=true}if(offset===2){isStart=false}range.collapse(isStart);return range}if(child.nodeType==1){var kchild=K(child),span;if(kchild.isControl()){span=doc.createElement("span");if(isStart){kchild.before(span)}else{kchild.after(span)}child=span}_moveToElementText(range,child);range.collapse(isStart);if(span){K(span).remove()}return range}node=child;offset=isStart?0:child.nodeValue.length}var dummy=doc.createElement("span");K(node).before(dummy);_moveToElementText(range,dummy);range.moveStart("character",offset);K(dummy).remove();return range}function _toRange(rng){var doc,range;function tr2td(start){if(K(start.node).name=="tr"){start.node=start.node.cells[start.offset];start.offset=0}}if(_IERANGE){if(rng.item){doc=_getDoc(rng.item(0));range=new KRange(doc);range.selectNode(rng.item(0));return range}doc=rng.parentElement().ownerDocument;var start=_getStartEnd(rng,true),end=_getStartEnd(rng,false);tr2td(start);tr2td(end);range=new KRange(doc);range.setStart(start.node,start.offset);range.setEnd(end.node,end.offset);return range}var startContainer=rng.startContainer;doc=startContainer.ownerDocument||startContainer;range=new KRange(doc);range.setStart(startContainer,rng.startOffset);range.setEnd(rng.endContainer,rng.endOffset);return range}function KRange(doc){this.init(doc)}_extend(KRange,{init:function(doc){var self=this;self.startContainer=doc;self.startOffset=0;self.endContainer=doc;self.endOffset=0;self.collapsed=true;self.doc=doc},commonAncestor:function(){function getParents(node){var parents=[];while(node){parents.push(node);node=node.parentNode}return parents}var parentsA=getParents(this.startContainer),parentsB=getParents(this.endContainer),i=0,lenA=parentsA.length,lenB=parentsB.length,parentA,parentB;while(++i){parentA=parentsA[lenA-i];parentB=parentsB[lenB-i];if(!parentA||!parentB||parentA!==parentB){break}}return parentsA[lenA-i+1]},setStart:function(node,offset){var self=this,doc=self.doc;self.startContainer=node;self.startOffset=offset;if(self.endContainer===doc){self.endContainer=node;self.endOffset=offset}return _updateCollapsed(this)},setEnd:function(node,offset){var self=this,doc=self.doc;self.endContainer=node;self.endOffset=offset;if(self.startContainer===doc){self.startContainer=node;self.startOffset=offset}return _updateCollapsed(this)},setStartBefore:function(node){return this.setStart(node.parentNode||this.doc,K(node).index())},setStartAfter:function(node){return this.setStart(node.parentNode||this.doc,K(node).index()+1)},setEndBefore:function(node){return this.setEnd(node.parentNode||this.doc,K(node).index())},setEndAfter:function(node){return this.setEnd(node.parentNode||this.doc,K(node).index()+1)},selectNode:function(node){return this.setStartBefore(node).setEndAfter(node)},selectNodeContents:function(node){var knode=K(node);if(knode.type==3||knode.isSingle()){return this.selectNode(node)}var children=knode.children();if(children.length>0){return this.setStartBefore(children[0]).setEndAfter(children[children.length-1])}return this.setStart(node,0).setEnd(node,0)},collapse:function(toStart){if(toStart){return this.setEnd(this.startContainer,this.startOffset)}return this.setStart(this.endContainer,this.endOffset)},compareBoundaryPoints:function(how,range){var rangeA=this.get(),rangeB=range.get();if(_IERANGE){var arr={};arr[_START_TO_START]="StartToStart";arr[_START_TO_END]="EndToStart";arr[_END_TO_END]="EndToEnd";arr[_END_TO_START]="StartToEnd";var cmp=rangeA.compareEndPoints(arr[how],rangeB);if(cmp!==0){return cmp}var nodeA,nodeB,nodeC,posA,posB;if(how===_START_TO_START||how===_END_TO_START){nodeA=this.startContainer;posA=this.startOffset}if(how===_START_TO_END||how===_END_TO_END){nodeA=this.endContainer;posA=this.endOffset}if(how===_START_TO_START||how===_START_TO_END){nodeB=range.startContainer;posB=range.startOffset}if(how===_END_TO_END||how===_END_TO_START){nodeB=range.endContainer;posB=range.endOffset}if(nodeA===nodeB){var diff=posA-posB;return diff>0?1:diff<0?-1:0}nodeC=nodeB;while(nodeC&&nodeC.parentNode!==nodeA){nodeC=nodeC.parentNode}if(nodeC){return K(nodeC).index()>=posA?-1:1}nodeC=nodeA;while(nodeC&&nodeC.parentNode!==nodeB){nodeC=nodeC.parentNode}if(nodeC){return K(nodeC).index()>=posB?1:-1}nodeC=K(nodeB).next();if(nodeC&&nodeC.contains(nodeA)){return 1}nodeC=K(nodeA).next();if(nodeC&&nodeC.contains(nodeB)){return-1}}else{return rangeA.compareBoundaryPoints(how,rangeB)}},cloneRange:function(){return new KRange(this.doc).setStart(this.startContainer,this.startOffset).setEnd(this.endContainer,this.endOffset)},toString:function(){var rng=this.get(),str=_IERANGE?rng.text:rng.toString();return str.replace(/\r\n|\n|\r/g,"")},cloneContents:function(){return _copyAndDelete(this,true,false)},deleteContents:function(){return _copyAndDelete(this,false,true)},extractContents:function(){return _copyAndDelete(this,true,true)},insertNode:function(node){var self=this,sc=self.startContainer,so=self.startOffset,ec=self.endContainer,eo=self.endOffset,firstChild,lastChild,c,nodeCount=1;if(node.nodeName.toLowerCase()==="#document-fragment"){firstChild=node.firstChild;lastChild=node.lastChild;nodeCount=node.childNodes.length}if(sc.nodeType==1){c=sc.childNodes[so];if(c){sc.insertBefore(node,c);if(sc===ec){eo+=nodeCount}}else{sc.appendChild(node)}}else if(sc.nodeType==3){if(so===0){sc.parentNode.insertBefore(node,sc);if(sc.parentNode===ec){eo+=nodeCount}}else if(so>=sc.nodeValue.length){if(sc.nextSibling){sc.parentNode.insertBefore(node,sc.nextSibling)}else{sc.parentNode.appendChild(node)}}else{if(so>0){c=sc.splitText(so)}else{c=sc}sc.parentNode.insertBefore(node,c);if(sc===ec){ec=c;eo-=so}}}if(firstChild){self.setStartBefore(firstChild).setEndAfter(lastChild)}else{self.selectNode(node)}if(self.compareBoundaryPoints(_END_TO_END,self.cloneRange().setEnd(ec,eo))>=1){return self}return self.setEnd(ec,eo)},surroundContents:function(node){node.appendChild(this.extractContents());return this.insertNode(node).selectNode(node)},isControl:function(){var self=this,sc=self.startContainer,so=self.startOffset,ec=self.endContainer,eo=self.endOffset,rng;return sc.nodeType==1&&sc===ec&&so+1===eo&&K(sc.childNodes[so]).isControl()},get:function(hasControlRange){var self=this,doc=self.doc,node,rng;if(!_IERANGE){rng=doc.createRange();try{rng.setStart(self.startContainer,self.startOffset);rng.setEnd(self.endContainer,self.endOffset)}catch(e){}return rng}if(hasControlRange&&self.isControl()){rng=doc.body.createControlRange();rng.addElement(self.startContainer.childNodes[self.startOffset]);return rng}var range=self.cloneRange().down();rng=doc.body.createTextRange();rng.setEndPoint("StartToStart",_getEndRange(range.startContainer,range.startOffset));rng.setEndPoint("EndToStart",_getEndRange(range.endContainer,range.endOffset));return rng},html:function(){return K(this.cloneContents()).outer()},down:function(){var self=this;function downPos(node,pos,isStart){if(node.nodeType!=1){return}var children=K(node).children();if(children.length===0){return}var left,right,child,offset;if(pos>0){left=children.eq(pos-1)}if(pos<children.length){right=children.eq(pos)}if(left&&left.type==3){child=left[0];offset=child.nodeValue.length}if(right&&right.type==3){child=right[0];offset=0}if(!child){return}if(isStart){self.setStart(child,offset)}else{self.setEnd(child,offset)}}downPos(self.startContainer,self.startOffset,true);downPos(self.endContainer,self.endOffset,false);return self},up:function(){var self=this;function upPos(node,pos,isStart){if(node.nodeType!=3){return}if(pos===0){if(isStart){self.setStartBefore(node)}else{self.setEndBefore(node)}}else if(pos==node.nodeValue.length){if(isStart){self.setStartAfter(node)}else{self.setEndAfter(node)}}}upPos(self.startContainer,self.startOffset,true);upPos(self.endContainer,self.endOffset,false);return self},enlarge:function(toBlock){var self=this;self.up();function enlargePos(node,pos,isStart){var knode=K(node),parent;if(knode.type==3||_NOSPLIT_TAG_MAP[knode.name]||!toBlock&&knode.isBlock()){return}if(pos===0){while(!knode.prev()){parent=knode.parent();if(!parent||_NOSPLIT_TAG_MAP[parent.name]||!toBlock&&parent.isBlock()){break}knode=parent}if(isStart){self.setStartBefore(knode[0])}else{self.setEndBefore(knode[0])}}else if(pos==knode.children().length){while(!knode.next()){parent=knode.parent();if(!parent||_NOSPLIT_TAG_MAP[parent.name]||!toBlock&&parent.isBlock()){break}knode=parent}if(isStart){self.setStartAfter(knode[0])}else{self.setEndAfter(knode[0])}}}enlargePos(self.startContainer,self.startOffset,true);enlargePos(self.endContainer,self.endOffset,false);return self},shrink:function(){var self=this,child,collapsed=self.collapsed;while(self.startContainer.nodeType==1&&(child=self.startContainer.childNodes[self.startOffset])&&child.nodeType==1&&!K(child).isSingle()){self.setStart(child,0)}if(collapsed){return self.collapse(collapsed)}while(self.endContainer.nodeType==1&&self.endOffset>0&&(child=self.endContainer.childNodes[self.endOffset-1])&&child.nodeType==1&&!K(child).isSingle()){self.setEnd(child,child.childNodes.length)}return self},createBookmark:function(serialize){var self=this,doc=self.doc,endNode,startNode=K('<span style="display:none;"></span>',doc)[0];startNode.id="__kindeditor_bookmark_start_"+_BOOKMARK_ID+++"__";if(!self.collapsed){endNode=startNode.cloneNode(true);endNode.id="__kindeditor_bookmark_end_"+_BOOKMARK_ID+++"__"}if(endNode){self.cloneRange().collapse(false).insertNode(endNode).setEndBefore(endNode)}self.insertNode(startNode).setStartAfter(startNode);return{start:serialize?"#"+startNode.id:startNode,end:endNode?serialize?"#"+endNode.id:endNode:null}},moveToBookmark:function(bookmark){var self=this,doc=self.doc,start=K(bookmark.start,doc),end=bookmark.end?K(bookmark.end,doc):null;if(!start||start.length<1){return self}self.setStartBefore(start[0]);start.remove();if(end&&end.length>0){self.setEndBefore(end[0]);end.remove()}else{self.collapse(true)}return self},dump:function(){console.log("--------------------");console.log(this.startContainer.nodeType==3?this.startContainer.nodeValue:this.startContainer,this.startOffset);console.log(this.endContainer.nodeType==3?this.endContainer.nodeValue:this.endContainer,this.endOffset)}});function _range(mixed){if(!mixed.nodeName){return mixed.constructor===KRange?mixed:_toRange(mixed)}return new KRange(mixed)}K.RangeClass=KRange;K.range=_range;K.START_TO_START=_START_TO_START;K.START_TO_END=_START_TO_END;K.END_TO_END=_END_TO_END;K.END_TO_START=_END_TO_START;function _nativeCommand(doc,key,val){try{doc.execCommand(key,false,val)}catch(e){}}function _nativeCommandValue(doc,key){var val="";try{val=doc.queryCommandValue(key)}catch(e){}if(typeof val!=="string"){val=""}return val}function _getSel(doc){var win=_getWin(doc);return _IERANGE?doc.selection:win.getSelection()}function _getRng(doc){var sel=_getSel(doc),rng;try{if(sel.rangeCount>0){rng=sel.getRangeAt(0)}else{rng=sel.createRange()}}catch(e){}if(_IERANGE&&(!rng||!rng.item&&rng.parentElement().ownerDocument!==doc)){return null}return rng}function _singleKeyMap(map){var newMap={},arr,v;_each(map,function(key,val){arr=key.split(",");for(var i=0,len=arr.length;i<len;i++){v=arr[i];newMap[v]=val}});return newMap}function _hasAttrOrCss(knode,map){return _hasAttrOrCssByKey(knode,map,"*")||_hasAttrOrCssByKey(knode,map)}function _hasAttrOrCssByKey(knode,map,mapKey){mapKey=mapKey||knode.name;if(knode.type!==1){return false}var newMap=_singleKeyMap(map);if(!newMap[mapKey]){return false}var arr=newMap[mapKey].split(",");for(var i=0,len=arr.length;i<len;i++){var key=arr[i];if(key==="*"){return true}var match=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);var method=match[1]?"css":"attr";key=match[2];var val=match[3]||"";if(val===""&&knode[method](key)!==""){return true}if(val!==""&&knode[method](key)===val){return true}}return false}function _removeAttrOrCss(knode,map){if(knode.type!=1){return}_removeAttrOrCssByKey(knode,map,"*");_removeAttrOrCssByKey(knode,map)}function _removeAttrOrCssByKey(knode,map,mapKey){mapKey=mapKey||knode.name;if(knode.type!==1){return}var newMap=_singleKeyMap(map);if(!newMap[mapKey]){return}var arr=newMap[mapKey].split(","),allFlag=false;for(var i=0,len=arr.length;i<len;i++){var key=arr[i];if(key==="*"){allFlag=true;break}var match=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);key=match[2];if(match[1]){key=_toCamel(key);if(knode[0].style[key]){knode[0].style[key]=""}}else{knode.removeAttr(key)}}if(allFlag){knode.remove(true)}}function _getInnerNode(knode){var inner=knode;while(inner.first()){inner=inner.first()}return inner}function _isEmptyNode(knode){if(knode.type!=1||knode.isSingle()){return false}return knode.html().replace(/<[^>]+>/g,"")===""}function _mergeWrapper(a,b){a=a.clone(true);var lastA=_getInnerNode(a),childA=a,merged=false;while(b){while(childA){if(childA.name===b.name){_mergeAttrs(childA,b.attr(),b.css());merged=true}childA=childA.first()}if(!merged){lastA.append(b.clone(false))}merged=false;b=b.first()}return a}function _wrapNode(knode,wrapper){wrapper=wrapper.clone(true);if(knode.type==3){_getInnerNode(wrapper).append(knode.clone(false));knode.replaceWith(wrapper);return wrapper}var nodeWrapper=knode,child;while((child=knode.first())&&child.children().length==1){knode=child}child=knode.first();var frag=knode.doc.createDocumentFragment();while(child){frag.appendChild(child[0]);child=child.next()}wrapper=_mergeWrapper(nodeWrapper,wrapper);if(frag.firstChild){_getInnerNode(wrapper).append(frag)}nodeWrapper.replaceWith(wrapper);return wrapper}function _mergeAttrs(knode,attrs,styles){_each(attrs,function(key,val){if(key!=="style"){knode.attr(key,val)}});_each(styles,function(key,val){knode.css(key,val)})}function _inPreElement(knode){while(knode&&knode.name!="body"){if(_PRE_TAG_MAP[knode.name]||knode.name=="div"&&knode.hasClass("ke-script")){return true}knode=knode.parent()}return false}function KCmd(range){this.init(range)}_extend(KCmd,{init:function(range){var self=this,doc=range.doc;self.doc=doc;self.win=_getWin(doc);self.sel=_getSel(doc);self.range=range},selection:function(forceReset){var self=this,doc=self.doc,rng=_getRng(doc);self.sel=_getSel(doc);if(rng){self.range=_range(rng);if(K(self.range.startContainer).name=="html"){self.range.selectNodeContents(doc.body).collapse(false)}return self}if(forceReset){self.range.selectNodeContents(doc.body).collapse(false)}return self},select:function(hasDummy){hasDummy=_undef(hasDummy,true);var self=this,sel=self.sel,range=self.range.cloneRange().shrink(),sc=range.startContainer,so=range.startOffset,ec=range.endContainer,eo=range.endOffset,doc=_getDoc(sc),win=self.win,rng,hasU200b=false;if(hasDummy&&sc.nodeType==1&&range.collapsed){if(_IERANGE){var dummy=K("<span>&nbsp;</span>",doc);range.insertNode(dummy[0]);rng=doc.body.createTextRange();try{rng.moveToElementText(dummy[0])}catch(ex){}rng.collapse(false);rng.select();dummy.remove();win.focus();return self}if(_WEBKIT){var children=sc.childNodes;if(K(sc).isInline()||so>0&&K(children[so-1]).isInline()||children[so]&&K(children[so]).isInline()){range.insertNode(doc.createTextNode("​"));hasU200b=true}}}if(_IERANGE){try{rng=range.get(true);rng.select()}catch(e){}}else{if(hasU200b){range.collapse(false)}rng=range.get(true);sel.removeAllRanges();sel.addRange(rng);if(doc!==document){var pos=K(rng.endContainer).pos();win.scrollTo(pos.x,pos.y)}}win.focus();return self},wrap:function(val){var self=this,doc=self.doc,range=self.range,wrapper;wrapper=K(val,doc);if(range.collapsed){range.shrink();range.insertNode(wrapper[0]).selectNodeContents(wrapper[0]);return self}if(wrapper.isBlock()){var copyWrapper=wrapper.clone(true),child=copyWrapper;while(child.first()){child=child.first()}child.append(range.extractContents());range.insertNode(copyWrapper[0]).selectNode(copyWrapper[0]);return self}range.enlarge();var bookmark=range.createBookmark(),ancestor=range.commonAncestor(),isStart=false;K(ancestor).scan(function(node){if(!isStart&&node==bookmark.start){isStart=true;return}if(isStart){if(node==bookmark.end){return false}var knode=K(node);if(_inPreElement(knode)){return}if(knode.type==3&&_trim(node.nodeValue).length>0){var parent;while((parent=knode.parent())&&parent.isStyle()&&parent.children().length==1){knode=parent}_wrapNode(knode,wrapper)}}});range.moveToBookmark(bookmark);return self},split:function(isStart,map){var range=this.range,doc=range.doc;var tempRange=range.cloneRange().collapse(isStart);var node=tempRange.startContainer,pos=tempRange.startOffset,parent=node.nodeType==3?node.parentNode:node,needSplit=false,knode;while(parent&&parent.parentNode){knode=K(parent);if(map){if(!knode.isStyle()){break}if(!_hasAttrOrCss(knode,map)){break}}else{if(_NOSPLIT_TAG_MAP[knode.name]){break}}needSplit=true;parent=parent.parentNode}if(needSplit){var dummy=doc.createElement("span");range.cloneRange().collapse(!isStart).insertNode(dummy);if(isStart){tempRange.setStartBefore(parent.firstChild).setEnd(node,pos)}else{tempRange.setStart(node,pos).setEndAfter(parent.lastChild)}var frag=tempRange.extractContents(),first=frag.firstChild,last=frag.lastChild;if(isStart){tempRange.insertNode(frag);range.setStartAfter(last).setEndBefore(dummy)}else{parent.appendChild(frag);range.setStartBefore(dummy).setEndBefore(first)}var dummyParent=dummy.parentNode;if(dummyParent==range.endContainer){var prev=K(dummy).prev(),next=K(dummy).next();if(prev&&next&&prev.type==3&&next.type==3){range.setEnd(prev[0],prev[0].nodeValue.length)}else if(!isStart){range.setEnd(range.endContainer,range.endOffset-1)}}dummyParent.removeChild(dummy)}return this},remove:function(map){var self=this,doc=self.doc,range=self.range;range.enlarge();if(range.startOffset===0){var ksc=K(range.startContainer),parent;while((parent=ksc.parent())&&parent.isStyle()&&parent.children().length==1){ksc=parent}range.setStart(ksc[0],0);ksc=K(range.startContainer);if(ksc.isBlock()){_removeAttrOrCss(ksc,map)}var kscp=ksc.parent();if(kscp&&kscp.isBlock()){_removeAttrOrCss(kscp,map)}}var sc,so;if(range.collapsed){self.split(true,map);sc=range.startContainer;so=range.startOffset;if(so>0){var sb=K(sc.childNodes[so-1]);if(sb&&_isEmptyNode(sb)){sb.remove();range.setStart(sc,so-1)}}var sa=K(sc.childNodes[so]);if(sa&&_isEmptyNode(sa)){sa.remove()}if(_isEmptyNode(sc)){range.startBefore(sc);sc.remove()}range.collapse(true);return self}self.split(true,map);self.split(false,map);var startDummy=doc.createElement("span"),endDummy=doc.createElement("span");range.cloneRange().collapse(false).insertNode(endDummy);range.cloneRange().collapse(true).insertNode(startDummy);var nodeList=[],cmpStart=false;K(range.commonAncestor()).scan(function(node){if(!cmpStart&&node==startDummy){cmpStart=true;return}if(node==endDummy){return false}if(cmpStart){nodeList.push(node)}});K(startDummy).remove();K(endDummy).remove();sc=range.startContainer;so=range.startOffset;var ec=range.endContainer,eo=range.endOffset;if(so>0){var startBefore=K(sc.childNodes[so-1]);if(startBefore&&_isEmptyNode(startBefore)){startBefore.remove();range.setStart(sc,so-1);if(sc==ec){range.setEnd(ec,eo-1)}}var startAfter=K(sc.childNodes[so]);if(startAfter&&_isEmptyNode(startAfter)){startAfter.remove();if(sc==ec){range.setEnd(ec,eo-1)}}}var endAfter=K(ec.childNodes[range.endOffset]);if(endAfter&&_isEmptyNode(endAfter)){endAfter.remove()}var bookmark=range.createBookmark(true);_each(nodeList,function(i,node){_removeAttrOrCss(K(node),map)});range.moveToBookmark(bookmark);return self},commonNode:function(map){var range=this.range;var ec=range.endContainer,eo=range.endOffset,node=ec.nodeType==3||eo===0?ec:ec.childNodes[eo-1];function find(node){var child=node,parent=node;while(parent){if(_hasAttrOrCss(K(parent),map)){return K(parent)}parent=parent.parentNode}while(child&&(child=child.lastChild)){if(_hasAttrOrCss(K(child),map)){return K(child)}}return null}var cNode=find(node);if(cNode){return cNode}if(node.nodeType==1||ec.nodeType==3&&eo===0){var prev=K(node).prev();if(prev){return find(prev)}}return null},commonAncestor:function(tagName){var range=this.range,sc=range.startContainer,so=range.startOffset,ec=range.endContainer,eo=range.endOffset,startNode=sc.nodeType==3||so===0?sc:sc.childNodes[so-1],endNode=ec.nodeType==3||eo===0?ec:ec.childNodes[eo-1];function find(node){while(node){if(node.nodeType==1){if(node.tagName.toLowerCase()===tagName){return node}}node=node.parentNode}return null}var start=find(startNode),end=find(endNode);if(start&&end&&start===end){return K(start)}return null},state:function(key){var self=this,doc=self.doc,bool=false;try{bool=doc.queryCommandState(key)}catch(e){}return bool},val:function(key){var self=this,doc=self.doc,range=self.range;function lc(val){return val.toLowerCase()}key=lc(key);var val="",knode;if(key==="fontfamily"||key==="fontname"){val=_nativeCommandValue(doc,"fontname");val=val.replace(/['"]/g,"");return lc(val)}if(key==="formatblock"){val=_nativeCommandValue(doc,key);if(val===""){knode=self.commonNode({"h1,h2,h3,h4,h5,h6,p,div,pre,address":"*"});if(knode){val=knode.name}}if(val==="Normal"){val="p"}return lc(val)}if(key==="fontsize"){knode=self.commonNode({"*":".font-size"});if(knode){val=knode.css("font-size")}return lc(val)}if(key==="forecolor"){knode=self.commonNode({"*":".color"});if(knode){val=knode.css("color")}val=_toHex(val);if(val===""){val="default"}return lc(val)}if(key==="hilitecolor"){knode=self.commonNode({"*":".background-color"});if(knode){val=knode.css("background-color")}val=_toHex(val);if(val===""){val="default"}return lc(val)}return val},toggle:function(wrapper,map){var self=this;if(self.commonNode(map)){self.remove(map)}else{self.wrap(wrapper)}return self.select()},bold:function(){return this.toggle("<strong></strong>",{span:".font-weight=bold",strong:"*",b:"*"})},italic:function(){return this.toggle("<em></em>",{span:".font-style=italic",em:"*",i:"*"})},underline:function(){return this.toggle("<u></u>",{span:".text-decoration=underline",u:"*"})},strikethrough:function(){return this.toggle("<s></s>",{span:".text-decoration=line-through",s:"*"})},forecolor:function(val){return this.wrap('<span style="color:'+val+';"></span>').select()},hilitecolor:function(val){return this.wrap('<span style="background-color:'+val+';"></span>').select()},fontsize:function(val){return this.wrap('<span style="font-size:'+val+';"></span>').select()},fontname:function(val){return this.fontfamily(val)},fontfamily:function(val){return this.wrap('<span style="font-family:'+val+';"></span>').select()},removeformat:function(){var map={"*":".font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent"},tags=_STYLE_TAG_MAP;_each(tags,function(key,val){map[key]="*"});this.remove(map);return this.select()},inserthtml:function(val,quickMode){var self=this,range=self.range;if(val===""){return self}function pasteHtml(range,val){val='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+val;var rng=range.get();if(rng.item){rng.item(0).outerHTML=val}else{rng.pasteHTML(val)}var temp=range.doc.getElementById("__kindeditor_temp_tag__");temp.parentNode.removeChild(temp);var newRange=_toRange(rng);range.setEnd(newRange.endContainer,newRange.endOffset);range.collapse(false);self.select(false)}function insertHtml(range,val){var doc=range.doc,frag=doc.createDocumentFragment();K("@"+val,doc).each(function(){frag.appendChild(this)});range.deleteContents();range.insertNode(frag);range.collapse(false);self.select(false)}if(_IERANGE&&quickMode){try{pasteHtml(range,val)}catch(e){insertHtml(range,val)}return self}insertHtml(range,val);return self},hr:function(){return this.inserthtml("<hr />")},print:function(){this.win.print();return this},insertimage:function(url,title,width,height,border,align){title=_undef(title,"");border=_undef(border,0);var html='<img src="'+_escape(url)+'" data-ke-src="'+_escape(url)+'" ';if(width){html+='width="'+_escape(width)+'" '}if(height){html+='height="'+_escape(height)+'" '}if(title){html+='title="'+_escape(title)+'" '}if(align){html+='align="'+_escape(align)+'" '}html+='alt="'+_escape(title)+'" ';html+="/>";return this.inserthtml(html)},createlink:function(url,type){var self=this,doc=self.doc,range=self.range;self.select();var a=self.commonNode({a:"*"});if(a&&!range.isControl()){range.selectNode(a.get());self.select()}var html='<a href="'+_escape(url)+'" data-ke-src="'+_escape(url)+'" ';if(type){html+=' target="'+_escape(type)+'"'}if(range.collapsed){html+=">"+_escape(url)+"</a>";return self.inserthtml(html)}if(range.isControl()){var node=K(range.startContainer.childNodes[range.startOffset]);html+="></a>";node.after(K(html,doc));node.next().append(node);range.selectNode(node[0]);return self.select()}function setAttr(node,url,type){K(node).attr("href",url).attr("data-ke-src",url);if(type){K(node).attr("target",type)}else{K(node).removeAttr("target")}}var sc=range.startContainer,so=range.startOffset,ec=range.endContainer,eo=range.endOffset;if(sc.nodeType==1&&sc===ec&&so+1===eo){var child=sc.childNodes[so];if(child.nodeName.toLowerCase()=="a"){setAttr(child,url,type);return self}}_nativeCommand(doc,"createlink","__kindeditor_temp_url__");K('a[href="__kindeditor_temp_url__"]',doc).each(function(){setAttr(this,url,type)});return self},unlink:function(){var self=this,doc=self.doc,range=self.range;self.select();if(range.collapsed){var a=self.commonNode({a:"*"});if(a){range.selectNode(a.get());self.select()}_nativeCommand(doc,"unlink",null);if(_WEBKIT&&K(range.startContainer).name==="img"){var parent=K(range.startContainer).parent();if(parent.name==="a"){parent.remove(true)}}}else{_nativeCommand(doc,"unlink",null)}return self}});_each(("formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,"+"insertunorderedlist,indent,outdent,subscript,superscript").split(","),function(i,name){KCmd.prototype[name]=function(val){var self=this;self.select();_nativeCommand(self.doc,name,val);if(_IERANGE&&_inArray(name,"justifyleft,justifycenter,justifyright,justifyfull".split(","))>=0){self.selection()}if(!_IERANGE||_inArray(name,"formatblock,selectall,insertorderedlist,insertunorderedlist".split(","))>=0){self.selection()}return self}});_each("cut,copy,paste".split(","),function(i,name){KCmd.prototype[name]=function(){var self=this;if(!self.doc.queryCommandSupported(name)){throw"not supported"}self.select();_nativeCommand(self.doc,name,null);return self}});function _cmd(mixed){if(mixed.nodeName){var doc=_getDoc(mixed);mixed=_range(doc).selectNodeContents(doc.body).collapse(false)}return new KCmd(mixed)}K.CmdClass=KCmd;K.cmd=_cmd;function _drag(options){var moveEl=options.moveEl,moveFn=options.moveFn,clickEl=options.clickEl||moveEl,beforeDrag=options.beforeDrag,iframeFix=options.iframeFix===undefined?true:options.iframeFix;var docs=[document];if(iframeFix){K("iframe").each(function(){var src=_formatUrl(this.src||"","absolute");if(/^https?:\/\//.test(src)){return}var doc;try{doc=_iframeDoc(this)}catch(e){}if(doc){var pos=K(this).pos();K(doc).data("pos-x",pos.x);K(doc).data("pos-y",pos.y);docs.push(doc)}})}clickEl.mousedown(function(e){if(e.button!==0&&e.button!==1){return}e.stopPropagation();var self=clickEl.get(),x=_removeUnit(moveEl.css("left")),y=_removeUnit(moveEl.css("top")),width=moveEl.width(),height=moveEl.height(),pageX=e.pageX,pageY=e.pageY;if(beforeDrag){beforeDrag()}function moveListener(e){e.preventDefault();var kdoc=K(_getDoc(e.target));var diffX=_round((kdoc.data("pos-x")||0)+e.pageX-pageX);var diffY=_round((kdoc.data("pos-y")||0)+e.pageY-pageY);moveFn.call(clickEl,x,y,width,height,diffX,diffY)}function selectListener(e){e.preventDefault()}function upListener(e){e.preventDefault();K(docs).unbind("mousemove",moveListener).unbind("mouseup",upListener).unbind("selectstart",selectListener);if(self.releaseCapture){self.releaseCapture()}}K(docs).mousemove(moveListener).mouseup(upListener).bind("selectstart",selectListener);if(self.setCapture){self.setCapture()}})}function KWidget(options){this.init(options)}_extend(KWidget,{init:function(options){var self=this;self.name=options.name||"";self.doc=options.doc||document;self.win=_getWin(self.doc);self.x=_addUnit(options.x);self.y=_addUnit(options.y);self.z=options.z;self.width=_addUnit(options.width);self.height=_addUnit(options.height);self.div=K('<div style="display:block;"></div>');self.options=options;self._alignEl=options.alignEl;if(self.width){self.div.css("width",self.width)}if(self.height){self.div.css("height",self.height)}if(self.z){self.div.css({position:"absolute",left:self.x,top:self.y,"z-index":self.z})}if(self.z&&(self.x===undefined||self.y===undefined)){self.autoPos(self.width,self.height)}if(options.cls){self.div.addClass(options.cls)}if(options.shadowMode){self.div.addClass("ke-shadow")}if(options.css){self.div.css(options.css)}if(options.src){K(options.src).replaceWith(self.div)}else{K(self.doc.body).append(self.div)}if(options.html){self.div.html(options.html)}if(options.autoScroll){if(_IE&&_V<7||_QUIRKS){var scrollPos=_getScrollPos();K(self.win).bind("scroll",function(e){var pos=_getScrollPos(),diffX=pos.x-scrollPos.x,diffY=pos.y-scrollPos.y;self.pos(_removeUnit(self.x)+diffX,_removeUnit(self.y)+diffY,false)})}else{self.div.css("position","fixed")}}},pos:function(x,y,updateProp){var self=this;updateProp=_undef(updateProp,true);if(x!==null){x=x<0?0:_addUnit(x);self.div.css("left",x);if(updateProp){self.x=x}}if(y!==null){y=y<0?0:_addUnit(y);self.div.css("top",y);if(updateProp){self.y=y}}return self},autoPos:function(width,height){var x,y,self=this,w=_removeUnit(width)||0,h=_removeUnit(height)||0,scrollPos=_getScrollPos();if(self._alignEl){var knode=K(self._alignEl),pos=knode.pos(),diffX=_round(knode[0].clientWidth/2-w/2),diffY=_round(knode[0].clientHeight/2-h/2);x=diffX<0?pos.x:pos.x+diffX}else{var docEl=_docElement(self.doc);x=_round(scrollPos.x+(docEl.clientWidth-w)/2);y=_round(scrollPos.y+(docEl.clientHeight-h)/2)}if(K.options.dialogOffset>0){y=scrollPos.y+20}if(!(_IE&&_V<7||_QUIRKS)){x-=scrollPos.x;y-=scrollPos.y}return self.pos(x,y)},remove:function(){var self=this;if(_IE&&_V<7||_QUIRKS){K(self.win).unbind("scroll")}self.div.remove();_each(self,function(i){self[i]=null});return this},show:function(){this.div.show();return this},hide:function(){this.div.hide();return this},draggable:function(options){var self=this;options=options||{};options.moveEl=self.div;options.moveFn=function(x,y,width,height,diffX,diffY){if((x=x+diffX)<0){x=0}if((y=y+diffY)<0){y=0}self.pos(x,y)};_drag(options);return self}});function _widget(options){return new KWidget(options)}K.WidgetClass=KWidget;K.widget=_widget;function _iframeDoc(iframe){iframe=_get(iframe);return iframe.contentDocument||iframe.contentWindow.document}var html,_direction="";if(html=document.getElementsByTagName("html")){_direction=html[0].dir}function _getInitHtml(options){var themesPath=_undef(options.themesPath,""),bodyClass=options.bodyClass,cssPath=options.cssPath,jsPath=options.jsPath,cssData=options.cssData;var arr=[_direction===""?"<html>":'<html dir="'+_direction+'">','<head><meta charset="utf-8" /><title></title>',"<style>","html {margin:0;padding:0;}","body {margin:0;padding:5px;}",'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',"body, p, div {word-wrap: break-word;}","p {margin:5px 0;}","table {border-collapse:collapse;}","img {border:0;}","noscript {display:none;}","table.ke-zeroborder td {border:1px dotted #AAA;}","img.ke-flash {","\tborder:1px solid #AAA;","\tbackground-image:url("+themesPath+"common/flash.svg);","\t*background-image:url("+themesPath+"common/flash.png);","\tbackground-size:64px 64px;","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-rm {","\tborder:1px solid #AAA;","\tbackground-image:url("+themesPath+"common/rm.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-media {","\tborder:1px solid #AAA;","\tbackground-image:url("+themesPath+"common/play.svg);","\t*background-image:url("+themesPath+"common/play.png);","\tbackground-position:center center;","\tbackground-size:64px 64px;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-anchor {","\tborder:1px dashed #666;","\twidth:16px;","\theight:16px;","}",".ke-script, .ke-noscript, .ke-display-none {","\tdisplay:none;","\tfont-size:0;","\twidth:0;","\theight:0;","}",".ke-pagebreak {","\tborder:1px dotted #AAA;","\tfont-size:0;","\theight:2px;","}"];if(options.showHelpGrid){arr.push("p,ul,ol,li,div{border: 1px dashed #c1c1c1;}");arr.push("li{margin:5px 0px}");arr.push("div,ul,ol{margin-bottom:10px}")}arr.push("</style>");if(!_isArray(cssPath)){cssPath=[cssPath]}if(_inArray(K.basePath+"themes/app.css",cssPath)<0){cssPath.push(K.basePath+"themes/app.css")}_each(cssPath,function(i,path){if(path){arr.push('<link href="'+path+'" rel="stylesheet" />')}});if(cssData){arr.push("<style>"+cssData+"</style>")}arr.push("</head><body "+(bodyClass?'class="'+bodyClass+'"':"")+">");if(!_isArray(jsPath)){jsPath=[jsPath]}_each(jsPath,function(i,path){if(path){arr.push('<script type="text/javascript" src="'+path+'"><\/script>')}});arr.push("</body></html>");return arr.join("\n")}function _elementVal(knode,val){if(knode.hasVal()){if(val===undefined){var html=knode.val();html=html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/gi,"");return html}return knode.val(val)}return knode.html(val)}function KEdit(options){this.init(options)}_extend(KEdit,KWidget,{init:function(options){var self=this;KEdit.parent.init.call(self,options);self.srcElement=K(options.srcElement);self.div.addClass("ke-edit");self.designMode=_undef(options.designMode,true);self.beforeGetHtml=options.beforeGetHtml;self.beforeSetHtml=options.beforeSetHtml;self.afterSetHtml=options.afterSetHtml;var isDocumentDomain=location.protocol!="res:"&&location.host.replace(/:\d+/,"")!==document.domain,srcScript="document.open();"+(isDocumentDomain?'document.domain="'+document.domain+'";':"")+"document.close();",iframeSrc=_IE?' src="javascript:void(function(){'+encodeURIComponent(srcScript)+'}())"':"";self.iframe=K('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"'+iframeSrc+"></iframe>").css("width","100%");self.textarea=K('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css("width","100%");self.tabIndex=isNaN(parseInt(options.tabIndex,10))?self.srcElement.attr("tabindex"):parseInt(options.tabIndex,10);self.iframe.attr("tabindex",self.tabIndex);self.textarea.attr("tabindex",self.tabIndex);if(self.width){self.setWidth(self.width)}if(self.height){self.setHeight(self.height)}if(self.designMode){self.textarea.hide()}else{self.iframe.hide()}function ready(){var doc=_iframeDoc(self.iframe);doc.open();if(isDocumentDomain){doc.domain=document.domain}doc.write(_getInitHtml(self.options));doc.close();self.win=self.iframe[0].contentWindow;self.doc=doc;var cmd=_cmd(doc);self.afterChange(function(e){cmd.selection()});if(_WEBKIT){K(doc).click(function(e){if(K(e.target).name==="img"){cmd.selection(true);cmd.range.selectNode(e.target);cmd.select()}})}if(_IE){self._mousedownHandler=function(){var newRange=cmd.range.cloneRange();newRange.shrink();if(newRange.isControl()){self.blur()}};K(document).mousedown(self._mousedownHandler);K(doc).keydown(function(e){if(e.which==8){cmd.selection();var rng=cmd.range;if(rng.isControl()){rng.collapse(true);K(rng.startContainer.childNodes[rng.startOffset]).remove();e.preventDefault()}}})}self.cmd=cmd;self.html(_elementVal(self.srcElement));if(_IE){doc.body.disabled=true;doc.body.contentEditable=true;doc.body.removeAttribute("disabled")}else{doc.designMode="on"}if(options.afterCreate){options.afterCreate.call(self)}}if(isDocumentDomain){self.iframe.bind("load",function(e){self.iframe.unbind("load");if(_IE){ready()}else{setTimeout(ready,0)}})}self.div.append(self.iframe);self.div.append(self.textarea);self.srcElement.hide();!isDocumentDomain&&ready()},setWidth:function(val){var self=this;val=_addUnit(val);self.width=val;self.div.css("width",val);return self},setHeight:function(val){var self=this;val=_addUnit(val);self.height=val;self.div.css("height",val);self.iframe.css("height",val);if(_IE&&_V<8||_QUIRKS){val=_addUnit(_removeUnit(val)-2)}self.textarea.css("height",val);return self},remove:function(){var self=this,doc=self.doc;K(doc.body).unbind();K(doc).unbind();K(self.win).unbind();if(self._mousedownHandler){K(document).unbind("mousedown",self._mousedownHandler)}_elementVal(self.srcElement,self.html());self.srcElement.show();self.iframe.unbind();self.textarea.unbind();KEdit.parent.remove.call(self)},html:function(val,isFull){var self=this,doc=self.doc;if(self.designMode){var body=doc.body;if(val===undefined){if(isFull){val="<!doctype html><html>"+body.parentNode.innerHTML+"</html>"}else{val=body.innerHTML}if(self.beforeGetHtml){val=self.beforeGetHtml(val)}if(_GECKO&&val=="<br />"){val=""}return val}if(self.beforeSetHtml){val=self.beforeSetHtml(val)}if(_IE&&_V>=9){val=val.replace(/(<.*?checked=")checked(".*>)/gi,"$1$2")}K(body).html(val);if(self.afterSetHtml){self.afterSetHtml()}return self}if(val===undefined){return self.textarea.val()}self.textarea.val(val);return self},design:function(bool){var self=this,val;if(bool===undefined?!self.designMode:bool){if(!self.designMode){val=self.html();self.designMode=true;self.textarea.hide();self.html(val);var iframe=self.iframe;var height=_removeUnit(self.height);iframe.height(height-2);iframe.show();setTimeout(function(){iframe.height(height)},0)}}else{if(self.designMode){val=self.html();self.designMode=false;self.html(val);self.iframe.hide();self.textarea.show()}}return self.focus()},focus:function(){var self=this;self.designMode?self.win.focus():self.textarea[0].focus();return self},blur:function(){var self=this;if(_IE){var input=K('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />',self.div);self.div.append(input);input[0].focus();input.remove()}else{self.designMode?self.win.blur():self.textarea[0].blur()}return self},afterChange:function(fn){var self=this,doc=self.doc,body=doc.body;K(doc).keyup(function(e){if(!e.ctrlKey&&!e.altKey&&_CHANGE_KEY_MAP[e.which]){fn(e)}});K(doc).mouseup(fn).contextmenu(fn);K(self.win).blur(fn);function timeoutHandler(e){setTimeout(function(){fn(e)},1)}K(body).bind("paste",timeoutHandler);K(body).bind("cut",timeoutHandler);return self}});function _edit(options){return new KEdit(options)}K.EditClass=KEdit;K.edit=_edit;K.iframeDoc=_iframeDoc;function _selectToolbar(name,fn){var self=this,knode=self.get(name);if(knode){if(knode.hasClass("ke-disabled")){return}fn(knode)}}function KToolbar(options){this.init(options)}_extend(KToolbar,KWidget,{init:function(options){var self=this;KToolbar.parent.init.call(self,options);self.disableMode=_undef(options.disableMode,false);self.noDisableItemMap=_toMap(_undef(options.noDisableItems,[]));self._itemMap={};self.div.addClass("ke-toolbar").bind("contextmenu,mousedown,mousemove",function(e){e.preventDefault()}).attr("unselectable","on");function find(target){var knode=K(target);if(knode.hasClass("ke-outline")){return knode}if(knode.hasClass("ke-toolbar-icon")){return knode.parent()}}function hover(e,method){var knode=find(e.target);if(knode){if(knode.hasClass("ke-disabled")){return}if(knode.hasClass("ke-selected")){return}knode[method]("ke-on")}}self.div.mouseover(function(e){hover(e,"addClass")}).mouseout(function(e){hover(e,"removeClass")}).click(function(e){var knode=find(e.target);if(knode){if(knode.hasClass("ke-disabled")){return}self.options.click.call(this,e,knode.attr("data-name"))}})},get:function(name){if(this._itemMap[name]){return this._itemMap[name]}return this._itemMap[name]=K("span.ke-icon-"+name,this.div).parent()},select:function(name){_selectToolbar.call(this,name,function(knode){knode.addClass("ke-selected")});return self},unselect:function(name){_selectToolbar.call(this,name,function(knode){knode.removeClass("ke-selected").removeClass("ke-on")});return self},enable:function(name){var self=this,knode=name.get?name:self.get(name);if(knode){knode.removeClass("ke-disabled");knode.opacity(1)}return self},disable:function(name){var self=this,knode=name.get?name:self.get(name);if(knode){knode.removeClass("ke-selected").addClass("ke-disabled");knode.opacity(.5)}return self},disableAll:function(bool,noDisableItems){var self=this,map=self.noDisableItemMap,item;if(noDisableItems){map=_toMap(noDisableItems)}if(bool===undefined?!self.disableMode:bool){K("span.ke-outline",self.div).each(function(){var knode=K(this),name=knode[0].getAttribute("data-name",2);if(!map[name]){self.disable(knode)}});self.disableMode=true}else{K("span.ke-outline",self.div).each(function(){var knode=K(this),name=knode[0].getAttribute("data-name",2);if(!map[name]){self.enable(knode)}});self.disableMode=false}return self}});function _toolbar(options){return new KToolbar(options)}K.ToolbarClass=KToolbar;K.toolbar=_toolbar;function KMenu(options){this.init(options)}_extend(KMenu,KWidget,{init:function(options){var self=this;options.z=options.z||811213;KMenu.parent.init.call(self,options);self.centerLineMode=_undef(options.centerLineMode,true);self.div.addClass("ke-menu ke-menu-"+options.themeType).bind("click,mousedown",function(e){e.stopPropagation()}).attr("unselectable","on")},addItem:function(item){var self=this;if(item.title==="-"){self.div.append(K('<div class="ke-menu-separator"></div>'));return}var itemDiv=K('<div class="ke-menu-item" unselectable="on"></div>'),leftDiv=K('<div class="ke-inline-block ke-menu-item-left"></div>'),rightDiv=K('<div class="ke-inline-block ke-menu-item-right"></div>'),height=_addUnit(item.height),iconClass=_undef(item.iconClass,"");self.div.append(itemDiv);if(height){itemDiv.css("height",height);rightDiv.css("line-height",height)}var centerDiv;if(self.centerLineMode){centerDiv=K('<div class="ke-inline-block ke-menu-item-center"></div>');if(height){centerDiv.css("height",height)}}itemDiv.mouseover(function(e){K(this).addClass("ke-menu-item-on");if(centerDiv){centerDiv.addClass("ke-menu-item-center-on")}}).mouseout(function(e){K(this).removeClass("ke-menu-item-on");if(centerDiv){centerDiv.removeClass("ke-menu-item-center-on")}}).click(function(e){item.click.call(K(this));e.stopPropagation()}).append(leftDiv);if(centerDiv){itemDiv.append(centerDiv)}itemDiv.append(rightDiv);if(item.checked){iconClass="ke-icon-checked"}if(iconClass!==""){leftDiv.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url '+iconClass+'"></span>')}rightDiv.html(item.title);return self},remove:function(){var self=this;if(self.options.beforeRemove){self.options.beforeRemove.call(self)}K(".ke-menu-item",self.div[0]).unbind();KMenu.parent.remove.call(self);return self}});function _menu(options){return new KMenu(options)}K.MenuClass=KMenu;K.menu=_menu;function KColorPicker(options){this.init(options)}_extend(KColorPicker,KWidget,{init:function(options){var self=this;options.z=options.z||811213;KColorPicker.parent.init.call(self,options);var colors=options.colors||[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]];self.selectedColor=(options.selectedColor||"").toLowerCase();self._cells=[];self.div.addClass("ke-colorpicker").bind("click,mousedown",function(e){e.stopPropagation()}).attr("unselectable","on");var table=self.doc.createElement("table");self.div.append(table);table.className="ke-colorpicker-table";table.cellPadding=0;table.cellSpacing=0;table.border=0;var row=table.insertRow(0),cell=row.insertCell(0);cell.colSpan=colors[0].length;self._addAttr(cell,"","ke-colorpicker-cell-top");for(var i=0;i<colors.length;i++){row=table.insertRow(i+1);for(var j=0;j<colors[i].length;j++){cell=row.insertCell(j);self._addAttr(cell,colors[i][j],"ke-colorpicker-cell")}}},_addAttr:function(cell,color,cls){var self=this;cell=K(cell).addClass(cls);if(self.selectedColor===color.toLowerCase()){cell.addClass("ke-colorpicker-cell-selected")}cell.attr("title",color||self.options.noColor);cell.mouseover(function(e){K(this).addClass("ke-colorpicker-cell-on")});cell.mouseout(function(e){K(this).removeClass("ke-colorpicker-cell-on")});cell.click(function(e){e.stop();self.options.click.call(K(this),color)});if(color){cell.append(K('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css("background-color",color))}else{cell.html(self.options.noColor)}K(cell).attr("unselectable","on");self._cells.push(cell)},remove:function(){var self=this;_each(self._cells,function(){this.unbind()});KColorPicker.parent.remove.call(self);return self}});function _colorpicker(options){return new KColorPicker(options)}K.ColorPickerClass=KColorPicker;K.colorpicker=_colorpicker;function KUploadButton(options){this.init(options)}_extend(KUploadButton,{init:function(options){var self=this,button=K(options.button),fieldName=options.fieldName||"file",url=options.url||"",title=button.val(),extraParams=options.extraParams||{},cls=button[0].className||"",target=options.target||"kindeditor_upload_iframe_"+(new Date).getTime();options.afterError=options.afterError||function(str){K.options.errorMsgHandler(str,"error")};var hiddenElements=[];for(var k in extraParams){hiddenElements.push('<input type="hidden" name="'+k+'" value="'+extraParams[k]+'" />')}var html=['<div class="ke-inline-block '+cls+'">',options.target?"":'<iframe name="'+target+'" style="display:none;"></iframe>',options.form?'<div class="ke-upload-area">':'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="'+target+'" action="'+url+'">','<span class="ke-button-common">',hiddenElements.join(""),'<input type="button" class="ke-button-common ke-button" value="'+title+'" />',"</span>",'<input type="file" class="ke-upload-file" name="'+fieldName+'" tabindex="-1" />',options.form?"</div>":"</form>","</div>"].join("");var div=K(html,button.doc);button.hide();button.before(div);self.div=div;self.button=button;self.iframe=options.target?K('iframe[name="'+target+'"]'):K("iframe",div);self.form=options.form?K(options.form):K("form",div);self.fileBox=K(".ke-upload-file",div);var width=options.width||K(".ke-button-common",div).width();K(".ke-upload-area",div).width(width);self.options=options},submit:function(){var self=this,iframe=self.iframe;if(typeof self.options.beforeUpload=="function"){var result=self.options.beforeUpload.call(self);if(!result){return false}}iframe.bind("load",function(){iframe.unbind();var tempForm=document.createElement("form");self.fileBox.before(tempForm);K(tempForm).append(self.fileBox);tempForm.reset();K(tempForm).remove(true);var doc=K.iframeDoc(iframe),pre=doc.getElementsByTagName("pre")[0],str="",data;if(pre){str=pre.innerHTML}else{str=doc.body.innerHTML}str=_unescape(str);iframe[0].src="javascript:false";try{data=K.json(str)}catch(e){self.options.afterError.call(self,"<!doctype html><html>"+doc.body.parentNode.innerHTML+"</html>")}if(data){self.options.afterUpload.call(self,data)}});self.form[0].submit();return self},remove:function(){var self=this;if(self.fileBox){self.fileBox.unbind()}self.iframe.remove();self.div.remove();self.button.show();return self}});function _uploadbutton(options){return new KUploadButton(options)}K.UploadButtonClass=KUploadButton;K.uploadbutton=_uploadbutton;function _createButton(arg){arg=arg||{};var name=arg.name||"",btn=K('<a href="javascript:;" class="ke-dialog-btn" title="'+name+'">'+name+"</a>");if(arg.click){btn.click(arg.click)}return btn}function KDialog(options){this.init(options)}_extend(KDialog,KWidget,{init:function(options){var self=this;options.z=options.z||811213;options.shadowMode=false;options.autoScroll=_undef(options.autoScroll,true);KDialog.parent.init.call(self,options);var title=options.title,body=K(options.body,self.doc),previewBtn=options.previewBtn,yesBtn=options.yesBtn,noBtn=options.noBtn,closeBtn=options.closeBtn,showMask=_undef(options.showMask,true);self.div.addClass("ke-dialog ke-animated").bind("click,mousedown",function(e){e.stopPropagation()});var contentDiv=K('<div class="ke-dialog-content"></div>').appendTo(self.div);var headerDiv=K('<div class="ke-dialog-header"></div>');contentDiv.append(headerDiv);headerDiv.html(title);self.closeIcon=K('<span class="ke-dialog-icon-close" title="'+closeBtn.name+'"></span>').click(closeBtn.click);headerDiv.append(self.closeIcon);self.draggable({clickEl:headerDiv,beforeDrag:options.beforeDrag});var bodyDiv=K('<div class="ke-dialog-body"></div>');contentDiv.append(bodyDiv);bodyDiv.append(body);var footerDiv=K('<div class="ke-dialog-footer"></div>');if(previewBtn||yesBtn||noBtn){self.div.append(footerDiv);contentDiv.height(self.div.height()-footerDiv.height())}_each([{btn:previewBtn,name:"preview"},{btn:yesBtn,name:"yes"},{btn:noBtn,name:"no"}],function(){if(this.btn){var button=_createButton(this.btn);button.addClass("ke-dialog-"+this.name);footerDiv.append(button)}});if(self.height){bodyDiv.height(_removeUnit(self.height)-headerDiv.height()-footerDiv.height())}self.div.width(self.div.width());self.div.height(self.div.height());self.mask=null;if(showMask){var docEl=_docElement(self.doc),docWidth=Math.max(docEl.scrollWidth,docEl.clientWidth),docHeight=Math.max(docEl.scrollHeight,docEl.clientHeight);self.mask=_widget({x:0,y:0,z:self.z-1,cls:"ke-dialog-mask",width:docWidth,height:docHeight})}self.autoPos(self.div.width(),self.div.height());self.footerDiv=footerDiv;self.bodyDiv=bodyDiv;self.headerDiv=headerDiv;self.isLoading=false},setMaskIndex:function(z){var self=this;self.mask.div.css("z-index",z)},showLoading:function(msg){msg=_undef(msg,"");var self=this,body=self.bodyDiv;self.loading=K('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:'+Math.round(body.height()/3)+'px;">'+msg+"</div></div>").width(body.width()).height(body.height()).css("top",self.headerDiv.height()+"px");body.css("visibility","hidden").after(self.loading);self.isLoading=true;return self},hideLoading:function(){this.loading&&this.loading.remove();this.bodyDiv.css("visibility","visible");this.isLoading=false;return this},remove:function(){var self=this;if(self.options.beforeRemove){self.options.beforeRemove.call(self)}self.mask&&self.mask.remove();self.iframeMask&&self.iframeMask.remove();self.closeIcon.unbind();K("input",self.div).unbind();K("button",self.div).unbind();self.footerDiv.unbind();self.bodyDiv.unbind();self.headerDiv.unbind();K("iframe",self.div).each(function(){K(this).remove()});KDialog.parent.remove.call(self);return self}});function _dialog(options){return new KDialog(options)}K.DialogClass=KDialog;K.dialog=_dialog;function _tabs(options){var self=_widget(options),remove=self.remove,afterSelect=options.afterSelect,div=self.div,liList=[];div.addClass("ke-tabs").bind("contextmenu,mousedown,mousemove",function(e){e.preventDefault()});var ul=K('<ul class="ke-tabs-ul ke-clearfix"></ul>');div.append(ul);self.add=function(tab){var li=K('<li class="ke-tabs-li">'+tab.title+"</li>");li.data("tab",tab);liList.push(li);ul.append(li)};self.selectedIndex=0;self.select=function(index){self.selectedIndex=index;_each(liList,function(i,li){li.unbind();if(i===index){li.addClass("ke-tabs-li-selected");K(li.data("tab").panel).show("")}else{li.removeClass("ke-tabs-li-selected").removeClass("ke-tabs-li-on").mouseover(function(){K(this).addClass("ke-tabs-li-on")}).mouseout(function(){K(this).removeClass("ke-tabs-li-on")}).click(function(){self.select(i)});K(li.data("tab").panel).hide()}});if(afterSelect){afterSelect.call(self,index)}};self.remove=function(){_each(liList,function(){this.remove()});ul.remove();remove.call(self)};return self}K.tabs=_tabs;function _loadScript(url,fn){if(K.options.resLoadCache[url]){return}var head=document.getElementsByTagName("head")[0]||(_QUIRKS?document.body:document.documentElement),script=document.createElement("script");head.appendChild(script);K.options.resLoadCache[url]=1;script.src=url;script.charset="utf-8";script.onload=script.onreadystatechange=function(){if(!this.readyState||this.readyState==="loaded"){if(fn){fn()}script.onload=script.onreadystatechange=null;head.removeChild(script)}}}function _chopQuery(url){var index=url.indexOf("?");return index>0?url.substr(0,index):url}function _loadStyle(url){if(K.options.resLoadCache[url]){return}var head=document.getElementsByTagName("head")[0]||(_QUIRKS?document.body:document.documentElement),link=document.createElement("link"),absoluteUrl=_chopQuery(_formatUrl(url,"absolute"));var links=K('link[rel="stylesheet"]',head);for(var i=0,len=links.length;i<len;i++){if(_chopQuery(_formatUrl(links[i].href,"absolute"))===absoluteUrl){return}}head.appendChild(link);K.options.resLoadCache[url]=1;link.href=url;link.rel="stylesheet"}function _ajax(url,fn,method,param,dataType){method=method||"GET";dataType=dataType||"json";var xhr=window.XMLHttpRequest?new window.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");xhr.open(method,url,true);xhr.onreadystatechange=function(){if(xhr.readyState==4&&xhr.status==200){if(fn){var data=_trim(xhr.responseText);if(dataType=="json"){data=_json(data)}fn(data)}}};if(method=="POST"){var params=[];_each(param,function(key,val){params.push(encodeURIComponent(key)+"="+encodeURIComponent(val))});try{xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}catch(e){}xhr.send(params.join("&"))}else{xhr.send(null)}}K.loadScript=_loadScript;K.loadStyle=_loadStyle;K.ajax=_ajax;var _plugins={};function _plugin(name,fn){if(name===undefined){return _plugins}if(!fn){return _plugins[name]}_plugins[name]=fn}var _language={};function _parseLangKey(key){var match,ns="core";if(match=/^(\w+)\.(\w+)$/.exec(key)){ns=match[1];key=match[2]}return{ns:ns,key:key}}function _lang(mixed,langType){langType=langType===undefined?K.options.langType:langType;if(typeof mixed==="string"){if(!_language[langType]){return"no language"}var pos=mixed.length-1;if(mixed.substr(pos)==="."){return _language[langType][mixed.substr(0,pos)]}var obj=_parseLangKey(mixed);return _language[langType][obj.ns][obj.key]}_each(mixed,function(key,val){var obj=_parseLangKey(key);if(!_language[langType]){_language[langType]={}}if(!_language[langType][obj.ns]){_language[langType][obj.ns]={}}_language[langType][obj.ns][obj.key]=val})}function _getImageFromRange(range,fn){if(range.collapsed){return}range=range.cloneRange().up();var sc=range.startContainer,so=range.startOffset;if(!_WEBKIT&&!range.isControl()){return}var img=K(sc.childNodes[so]);if(!img||img.name!="img"){return}if(fn(img)){return img}}function _bindContextmenuEvent(){var self=this,doc=self.edit.doc;K(doc).contextmenu(function(e){if(self.menu){self.hideMenu()}if(!self.useContextmenu){e.preventDefault();return}if(self._contextmenus.length===0){return}var maxWidth=0,items=[];_each(self._contextmenus,function(){if(this.title=="-"){items.push(this);return}if(this.cond&&this.cond()){items.push(this);if(this.width&&this.width>maxWidth){maxWidth=this.width}}});while(items.length>0&&items[0].title=="-"){items.shift()}while(items.length>0&&items[items.length-1].title=="-"){items.pop()}var prevItem=null;_each(items,function(i){if(this.title=="-"&&prevItem.title=="-"){delete items[i]}prevItem=this});if(items.length>0){e.preventDefault();var pos=K(self.edit.iframe).pos(),menu=_menu({x:pos.x+e.clientX,themeType:self.themeType,y:pos.y+e.clientY,width:maxWidth,css:{visibility:"hidden"},shadowMode:self.shadowMode});_each(items,function(){if(this.title){menu.addItem(this)}});var docEl=_docElement(menu.doc),menuHeight=menu.div.height();if(e.clientY+menuHeight>=docEl.clientHeight-100){menu.pos(menu.x,_removeUnit(menu.y)-menuHeight)}menu.div.css("visibility","visible");self.menu=menu}})}function _bindNewlineEvent(){var self=this,doc=self.edit.doc,newlineTag=self.newlineTag;if(_IE&&newlineTag!=="br"){return}if(_GECKO&&_V<3&&newlineTag!=="p"){return}if(_OPERA&&_V<9){return}var brSkipTagMap=_toMap("h1,h2,h3,h4,h5,h6,pre,li"),pSkipTagMap=_toMap("p,h1,h2,h3,h4,h5,h6,pre,li,blockquote");function getAncestorTagName(range){var ancestor=K(range.commonAncestor());while(ancestor){if(ancestor.type==1&&!ancestor.isStyle()){break}ancestor=ancestor.parent()}return ancestor.name}K(doc).keydown(function(e){if(e.which==39){if(self.__startOffset==self.cmd.range.startOffset){var tagName=getAncestorTagName(self.cmd.range);if(tagName!="body"){self.appendHtml("<br />")}}else{self.__startOffset=self.cmd.range.startOffset}return}if(e.which!=13||e.shiftKey||e.ctrlKey||e.altKey){return}self.cmd.selection();var tagName=getAncestorTagName(self.cmd.range);if(tagName=="marquee"||tagName=="select"){return}if(newlineTag==="br"&&!brSkipTagMap[tagName]){e.preventDefault();self.insertHtml("<br />"+(_IE&&_V<9?"":"​"));return}if(!pSkipTagMap[tagName]){_nativeCommand(doc,"formatblock","<p>")}});K(doc).keyup(function(e){if(e.which!=13||e.shiftKey||e.ctrlKey||e.altKey){return}if(newlineTag=="br"){return}if(_GECKO){var root=self.cmd.commonAncestor("p");var a=self.cmd.commonAncestor("a");if(a&&a.text()==""){a.remove(true);self.cmd.range.selectNodeContents(root[0]).collapse(true);self.cmd.select()}return}self.cmd.selection();var tagName=getAncestorTagName(self.cmd.range);if(tagName=="marquee"||tagName=="select"){return}if(!pSkipTagMap[tagName]){_nativeCommand(doc,"formatblock","<p>")}var div=self.cmd.commonAncestor("div");if(div){var p=K("<p></p>"),child=div[0].firstChild;while(child){var next=child.nextSibling;p.append(child);child=next}div.before(p);div.remove();self.cmd.range.selectNodeContents(p[0]);self.cmd.select()}})}function _bindTabEvent(){var self=this,doc=self.edit.doc;K(doc).keydown(function(e){if(e.which==9){e.preventDefault();if(self.afterTab){self.afterTab.call(self,e);return}var cmd=self.cmd,range=cmd.range;range.shrink();if(range.collapsed&&range.startContainer.nodeType==1){range.insertNode(K("@&nbsp;",doc)[0]);cmd.select()}self.insertHtml("&nbsp;&nbsp;&nbsp;&nbsp;")}})}function _bindFocusEvent(){var self=this;K(self.edit.textarea[0],self.edit.win).focus(function(e){if(self.afterFocus){self.afterFocus.call(self,e)}}).blur(function(e){if(self.afterBlur){self.afterBlur.call(self,e)}})}function _removeBookmarkTag(html){return _trim(html.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/gi,""))}function _removeTempTag(html){return html.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/gi,"")}function _addBookmarkToStack(stack,bookmark){if(stack.length===0){stack.push(bookmark);return}var prev=stack[stack.length-1];if(_removeBookmarkTag(bookmark.html)!==_removeBookmarkTag(prev.html)){stack.push(bookmark)}}function _undoToRedo(fromStack,toStack){var self=this,edit=self.edit,body=edit.doc.body,range,bookmark;if(fromStack.length===0){return self}if(edit.designMode){range=self.cmd.range;bookmark=range.createBookmark(true);bookmark.html=body.innerHTML}else{bookmark={html:body.innerHTML}}_addBookmarkToStack(toStack,bookmark);var prev=fromStack.pop();if(_removeBookmarkTag(bookmark.html)===_removeBookmarkTag(prev.html)&&fromStack.length>0){prev=fromStack.pop()}if(edit.designMode){edit.html(prev.html);if(prev.start){range.moveToBookmark(prev);self.select()}}else{K(body).html(_removeBookmarkTag(prev.html))}return self}function KEditor(options){var self=this;self.options={};function setOption(key,val){if(KEditor.prototype[key]===undefined){self[key]=val}self.options[key]=val}_each(options,function(key,val){setOption(key,options[key])});_each(K.options,function(key,val){if(self[key]===undefined){setOption(key,val)}});var se=K(self.srcElement||"<textarea/>");if(!self.width){self.width=se[0].style.width||se.width()}if(!self.height){self.height=se[0].style.height||se.height()}setOption("width",_undef(self.width,self.minWidth));setOption("height",_undef(self.height,self.minHeight));setOption("width",_addUnit(self.width));setOption("height",_addUnit(self.height));if(_MOBILE&&(!_IOS||_V<534)){self.designMode=false}self.srcElement=se;self.initContent="";self.plugin={};self.isCreated=false;self._handlers={};self._contextmenus=[];self._undoStack=[];self._redoStack=[];self._firstAddBookmark=true;self.menu=self.contextmenu=null;self.dialogs=[]}KEditor.prototype={lang:function(mixed){return _lang(mixed,this.langType)},loadPlugin:function(name,fn){var self=this;var _pluginStatus=this._pluginStatus;if(!_pluginStatus){_pluginStatus=this._pluginStatus={}}if(_plugins[name]){if(!_isFunction(_plugins[name])){setTimeout(function(){self.loadPlugin(name,fn)},100);return self}if(!_pluginStatus[name]){_plugins[name].call(self,KindEditor);_pluginStatus[name]="inited"}if(fn){fn.call(self)}return self}_plugins[name]="loading";_loadScript(self.pluginsPath+name+"/"+name+".js?ver="+encodeURIComponent(K.DEBUG?_TIME:_VERSION),function(){setTimeout(function(){if(_plugins[name]){self.loadPlugin(name,fn)}},0)});return self},handler:function(key,fn){var self=this;if(!self._handlers[key]){self._handlers[key]=[]}if(_isFunction(fn)){self._handlers[key].push(fn);return self}_each(self._handlers[key],function(){fn=this.call(self,fn)});return fn},clickToolbar:function(name,fn){var self=this,key="clickToolbar"+name;if(fn===undefined){if(self._handlers[key]){return self.handler(key)}self.loadPlugin(name,function(){self.handler(key)});return self}return self.handler(key,fn)},updateState:function(){var self=this;_each(("justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,"+"subscript,superscript,bold,italic,underline,strikethrough").split(","),function(i,name){self.cmd.state(name)?self.toolbar.select(name):self.toolbar.unselect(name)});return self},addContextmenu:function(item){this._contextmenus.push(item);return this},afterCreate:function(fn){return this.handler("afterCreate",fn)},beforeRemove:function(fn){return this.handler("beforeRemove",fn)},beforeGetHtml:function(fn){return this.handler("beforeGetHtml",fn)},beforeSetHtml:function(fn){return this.handler("beforeSetHtml",fn)},afterSetHtml:function(fn){return this.handler("afterSetHtml",fn)},create:function(){var self=this,fullscreenMode=self.fullscreenMode;if(self.isCreated){return self}if(self.srcElement.data("kindeditor")){return self}self.srcElement.data("kindeditor","true");if(fullscreenMode){_docElement().style.overflow="hidden"}else{_docElement().style.overflow=""}var width=fullscreenMode?_docElement().clientWidth+"px":self.width,height=fullscreenMode?_docElement().clientHeight+"px":self.height;if(_IE&&_V<8||_QUIRKS){height=_addUnit(_removeUnit(height)+2)}var container=self.container=K(self.layout);if(fullscreenMode){K(document.body).append(container)}else{self.srcElement.before(container)}var toolbarDiv=K(".toolbar",container),editDiv=K(".edit",container),statusbar=self.statusbar=K(".statusbar",container);container.removeClass("container").addClass("ke-container ke-container-"+self.themeType).css("width",width);if(fullscreenMode){container.css({position:"absolute",left:0,top:0,"z-index":811211});if(!_GECKO){self._scrollPos=_getScrollPos()}window.scrollTo(0,0);K(document.body).css({height:"1px",overflow:"hidden"});K(document.body.parentNode).css("overflow","hidden");self._fullscreenExecuted=true}else{if(self._fullscreenExecuted){K(document.body).css({height:"",overflow:""});K(document.body.parentNode).css("overflow","")}if(self._scrollPos){window.scrollTo(self._scrollPos.x,self._scrollPos.y)}}var htmlList=[];K.each(self.items,function(i,name){if(name=="|"){htmlList.push('<span class="ke-inline-block ke-separator"></span>')}else if(name=="/"){htmlList.push('<div class="ke-hr"></div>')}else{htmlList.push('<span class="ke-outline" data-name="'+name+'" title="'+self.lang(name)+'" unselectable="on">');htmlList.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-'+name+'" unselectable="on"></span></span>')}});var toolbar=self.toolbar=_toolbar({src:toolbarDiv,html:htmlList.join(""),noDisableItems:self.noDisableItems,click:function(e,name){e.stop();if(self.menu){var menuName=self.menu.name;self.hideMenu();if(menuName===name){return}}self.clickToolbar(name)}});var editHeight=_removeUnit(height)-toolbar.div.height();var edit=self.edit=_edit({height:editHeight>0&&_removeUnit(height)>self.minHeight?editHeight:self.minHeight,src:editDiv,srcElement:self.srcElement,designMode:self.designMode,themesPath:self.themesPath,bodyClass:self.bodyClass,cssPath:self.cssPath,jsPath:self.jsPath,showHelpGrid:self.showHelpGrid,cssData:self.cssData,beforeGetHtml:function(html){html=self.beforeGetHtml(html);html=_removeBookmarkTag(_removeTempTag(html));return _formatHtml(html,self.filterMode?self.htmlTags:null,self.urlType,self.wellFormatMode,self.indentChar)},beforeSetHtml:function(html){html=_formatHtml(html,self.filterMode?self.htmlTags:null,"",false);return self.beforeSetHtml(html)},afterSetHtml:function(){self.edit=edit=this;self.afterSetHtml()},afterCreate:function(){self.edit=edit=this;self.cmd=edit.cmd;self._docMousedownFn=function(e){if(self.menu){self.hideMenu()}};K(edit.doc,document).mousedown(self._docMousedownFn);_bindContextmenuEvent.call(self);_bindNewlineEvent.call(self);_bindTabEvent.call(self);_bindFocusEvent.call(self);edit.afterChange(function(e){if(!edit.designMode){return}self.updateState();self.addBookmark();if(self.options.afterChange){self.options.afterChange.call(self)}});edit.textarea.keyup(function(e){if(!e.ctrlKey&&!e.altKey&&_INPUT_KEY_MAP[e.which]){if(self.options.afterChange){self.options.afterChange.call(self)}}});if(self.readonlyMode){self.readonly()}self.isCreated=true;if(self.initContent===""){self.initContent=self.html()}if(self._undoStack.length>0){var prev=self._undoStack.pop();if(prev.start){self.html(prev.html);edit.cmd.range.moveToBookmark(prev);self.select()}}self.afterCreate();if(self.options.afterCreate){self.options.afterCreate.call(self)}}});statusbar.removeClass("statusbar").addClass("ke-statusbar").append('<span class="ke-inline-block ke-statusbar-center-icon"></span>').append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');if(self._fullscreenResizeHandler){K(window).unbind("resize",self._fullscreenResizeHandler);self._fullscreenResizeHandler=null}function initResize(){if(statusbar.height()===0){setTimeout(initResize,100);return}self.resize(width,height,false)}initResize();if(fullscreenMode){self._fullscreenResizeHandler=function(e){if(self.isCreated){self.resize(_docElement().clientWidth,_docElement().clientHeight,false)}};K(window).bind("resize",self._fullscreenResizeHandler);toolbar.select("fullscreen");statusbar.first().css("visibility","hidden");statusbar.last().css("visibility","hidden")}else{if(_GECKO){K(window).bind("scroll",function(e){self._scrollPos=_getScrollPos()})}if(self.resizeType>0){_drag({moveEl:container,clickEl:statusbar,moveFn:function(x,y,width,height,diffX,diffY){height+=diffY;self.resize(null,height)}})}else{statusbar.first().css("visibility","hidden")}if(self.resizeType===2){_drag({moveEl:container,clickEl:statusbar.last(),moveFn:function(x,y,width,height,diffX,diffY){width+=diffX;height+=diffY;self.resize(width,height)}})}else{statusbar.last().css("visibility","hidden")}}return self},remove:function(){var self=this;if(!self.isCreated){return self}self.beforeRemove();self.srcElement.data("kindeditor","");if(self.menu){self.hideMenu()}_each(self.dialogs,function(){self.hideDialog()});K(document).unbind("mousedown",self._docMousedownFn);self.toolbar.remove();self.edit.remove();self.statusbar.last().unbind();self.statusbar.unbind();self.container.remove();self.container=self.toolbar=self.edit=self.menu=null;self.dialogs=[];self.isCreated=false;return self},resize:function(width,height,updateProp){var self=this;updateProp=_undef(updateProp,true);if(width){if(!/%/.test(width)){width=_removeUnit(width);width=width<self.minWidth?self.minWidth:width}self.container.css("width",_addUnit(width));if(updateProp){self.width=_addUnit(width)}}if(height){height=_removeUnit(height);var editHeight=_removeUnit(height)-self.toolbar.div.height()-self.statusbar.height();editHeight=editHeight<self.minHeight?self.minHeight:editHeight;self.edit.setHeight(editHeight);if(updateProp){self.height=_addUnit(height)}}return self},select:function(){this.isCreated&&this.cmd.select();return this},html:function(val){var self=this;if(val===undefined){return self.isCreated?self.edit.html():_elementVal(self.srcElement)}self.isCreated?self.edit.html(val):_elementVal(self.srcElement,val);if(self.isCreated){self.cmd.selection()}return self},fullHtml:function(){return this.isCreated?this.edit.html(undefined,true):""},text:function(val){var self=this;if(val===undefined){return _trim(self.html().replace(/<(?!img|embed).*?>/gi,"").replace(/&nbsp;/gi," "))}else{return self.html(_escape(val))}},isEmpty:function(){return _trim(this.text().replace(/\r\n|\n|\r/,""))===""},isDirty:function(){return _trim(this.initContent.replace(/\r\n|\n|\r|t/g,""))!==_trim(this.html().replace(/\r\n|\n|\r|t/g,""))},selectedHtml:function(){var val=this.isCreated?this.cmd.range.html():"";val=_removeBookmarkTag(_removeTempTag(val));return val},count:function(mode){var self=this;mode=(mode||"html").toLowerCase();if(mode==="html"){return self.html().length}if(mode==="text"){return self.text().replace(/<(?:img|embed).*?>/gi,"K").replace(/\r\n|\n|\r/g,"").length}return 0},exec:function(key){key=key.toLowerCase();var self=this,cmd=self.cmd,changeFlag=_inArray(key,"selectall,copy,paste,print".split(","))<0;if(changeFlag){self.addBookmark(false)}cmd[key].apply(cmd,_toArray(arguments,1));if(changeFlag){self.updateState();self.addBookmark(false);if(self.options.afterChange){self.options.afterChange.call(self)}}return self},insertHtml:function(val,quickMode){if(!this.isCreated){return this}val=this.beforeSetHtml(val);this.exec("inserthtml",val,quickMode);return this},appendHtml:function(val){this.html(this.html()+val);if(this.isCreated){var cmd=this.cmd;cmd.range.selectNodeContents(cmd.doc.body).collapse(false);cmd.select()}return this},sync:function(){_elementVal(this.srcElement,this.html());return this},focus:function(){this.isCreated?this.edit.focus():this.srcElement[0].focus();return this},blur:function(){this.isCreated?this.edit.blur():this.srcElement[0].blur();return this},addBookmark:function(checkSize){checkSize=_undef(checkSize,true);var self=this,edit=self.edit,body=edit.doc.body,html=_removeTempTag(body.innerHTML),bookmark;if(checkSize&&self._undoStack.length>0){var prev=self._undoStack[self._undoStack.length-1];if(Math.abs(html.length-_removeBookmarkTag(prev.html).length)<self.minChangeSize){return self}}if(edit.designMode&&!self._firstAddBookmark){var range=self.cmd.range;bookmark=range.createBookmark(true);bookmark.html=_removeTempTag(body.innerHTML);range.moveToBookmark(bookmark)}else{bookmark={html:html}}self._firstAddBookmark=false;_addBookmarkToStack(self._undoStack,bookmark);return self},undo:function(){return _undoToRedo.call(this,this._undoStack,this._redoStack)},redo:function(){return _undoToRedo.call(this,this._redoStack,this._undoStack)},fullscreen:function(bool){this.fullscreenMode=bool===undefined?!this.fullscreenMode:bool;this.addBookmark(false);return this.remove().create()},readonly:function(isReadonly){isReadonly=_undef(isReadonly,true);var self=this,edit=self.edit,doc=edit.doc;if(self.designMode){self.toolbar.disableAll(isReadonly,[])}else{_each(self.noDisableItems,function(){self.toolbar[isReadonly?"disable":"enable"](this)})}if(_IE){doc.body.contentEditable=!isReadonly}else{doc.designMode=isReadonly?"off":"on"}edit.textarea[0].disabled=isReadonly},createMenu:function(options){var self=this,name=options.name,knode=self.toolbar.get(name),pos=knode.pos();options.x=pos.x;options.y=pos.y+knode.height();options.z=self.options.zIndex;options.shadowMode=_undef(options.shadowMode,self.shadowMode);if(options.selectedColor!==undefined){options.cls="ke-colorpicker-"+self.themeType;options.noColor=self.lang("noColor");self.menu=_colorpicker(options)}else{options.cls="ke-menu-"+self.themeType;options.centerLineMode=false;self.menu=_menu(options)}return self.menu},hideMenu:function(){this.menu.remove();this.menu=null;return this},hideContextmenu:function(){this.contextmenu.remove();this.contextmenu=null;return this},createDialog:function(options){var self=this;options.z=self.options.zIndex;options.shadowMode=_undef(options.shadowMode,self.shadowMode);options.closeBtn=_undef(options.closeBtn,{name:self.lang("close"),click:function(e){self.hideDialog();if(_IE&&self.cmd){self.cmd.select()}}});options.noBtn=_undef(options.noBtn,{name:self.lang(options.yesBtn?"no":"close"),click:function(e){self.hideDialog();if(_IE&&self.cmd){self.cmd.select()}}});if(self.dialogAlignType!="page"){options.alignEl=self.container}options.cls="ke-dialog-"+self.themeType;if(self.dialogs.length>0){var firstDialog=self.dialogs[0],parentDialog=self.dialogs[self.dialogs.length-1];firstDialog.setMaskIndex(parentDialog.z+2);options.z=parentDialog.z+3;options.showMask=false}var dialog=_dialog(options);self.dialogs.push(dialog);return dialog},hideDialog:function(){var self=this;if(self.dialogs.length>0){self.dialogs.pop().remove()}if(self.dialogs.length>0){var firstDialog=self.dialogs[0],parentDialog=self.dialogs[self.dialogs.length-1];firstDialog.setMaskIndex(parentDialog.z-1)}return self},errorDialog:function(html){var self=this;var dialog=self.createDialog({width:750,title:self.lang("uploadError"),body:'<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'});var iframe=K("iframe",dialog.div),doc=K.iframeDoc(iframe);doc.open();doc.write(html);doc.close();K(doc.body).css("background-color","#FFF");iframe[0].contentWindow.focus();return self}};function _editor(options){return new KEditor(options)}var _instances=[];function _create(expr,options){options=options||{};options.basePath=_undef(options.basePath,K.basePath);options.themesPath=_undef(options.themesPath,options.basePath+"themes/");options.langPath=_undef(options.langPath,options.basePath+"lang/");options.pluginsPath=_undef(options.pluginsPath,options.basePath+"plugins/");if(typeof options.errorMsgHandler=="function"){K.options.errorMsgHandler=options.errorMsgHandler}if(_undef(options.loadStyleMode,K.options.loadStyleMode)){var themeType=_undef(options.themeType,K.options.themeType);_loadStyle(options.themesPath+themeType+"/editor.min.css")}function create(editor){_each(_plugins,function(name,fn){if(_isFunction(fn)){fn.call(editor,KindEditor);if(!editor._pluginStatus){editor._pluginStatus={}}editor._pluginStatus[name]="inited"}});return editor.create()}var knode=K(expr);if(!knode||knode.length===0){return}if(knode.length>1){knode.each(function(){_create(this,options)});return _instances[0]}options.srcElement=knode[0];var editor=new KEditor(options);_instances.push(editor);if(_language[editor.langType]){return create(editor)}_loadScript(editor.langPath+editor.langType+".js?ver="+encodeURIComponent(K.DEBUG?_TIME:_VERSION),function(){create(editor)});return editor}function _eachEditor(expr,fn){K(expr).each(function(i,el){K.each(_instances,function(j,editor){if(editor&&editor.srcElement[0]==el){fn.call(editor,j);return false}})})}K.remove=function(expr){_eachEditor(expr,function(i){this.remove();_instances.splice(i,1)})};K.sync=function(expr){_eachEditor(expr,function(){this.sync()})};K.html=function(expr,val){_eachEditor(expr,function(){this.html(val)})};K.insertHtml=function(expr,val){_eachEditor(expr,function(){this.insertHtml(val)})};K.appendHtml=function(expr,val){_eachEditor(expr,function(){this.appendHtml(val)})};if(_IE&&_V<7){_nativeCommand(document,"BackgroundImageCache",true)}K.EditorClass=KEditor;K.editor=_editor;K.create=_create;K.instances=_instances;K.plugin=_plugin;K.lang=_lang;_plugin("core",function(K){var self=this,shortcutKeys={undo:"Z",redo:"Y",bold:"B",italic:"I",underline:"U",print:"P",selectall:"A"};self.afterSetHtml(function(){if(self.options.afterChange){self.options.afterChange.call(self)}});self.afterCreate(function(){if(self.syncType!="form"){return}var el=K(self.srcElement),hasForm=false;while(el=el.parent()){if(el.name=="form"){hasForm=true;break}}if(hasForm){el.bind("submit",function(e){self.sync();K(window).bind("unload",function(){self.edit.textarea.remove()})});var resetBtn=K('[type="reset"]',el);resetBtn.click(function(){self.html(self.initContent);self.cmd.selection()});self.beforeRemove(function(){el.unbind();resetBtn.unbind()})}});self.clickToolbar("source",function(){if(self.edit.designMode){self.toolbar.disableAll(true);self.edit.design(false);self.toolbar.select("source")}else{self.toolbar.disableAll(false);self.edit.design(true);self.toolbar.unselect("source");if(_GECKO){setTimeout(function(){self.cmd.selection()},0)}else{self.cmd.selection()}}self.designMode=self.edit.designMode});self.afterCreate(function(){if(!self.designMode){self.toolbar.disableAll(true).select("source")}});self.clickToolbar("fullscreen",function(){self.fullscreen()});if(self.fullscreenShortcut){var loaded=false;self.afterCreate(function(){K(self.edit.doc,self.edit.textarea).keyup(function(e){if(e.which==27){setTimeout(function(){self.fullscreen()},0)}});if(loaded){if(_IE&&!self.designMode){return}self.focus()}if(!loaded){loaded=true}})}_each("undo,redo".split(","),function(i,name){if(shortcutKeys[name]){self.afterCreate(function(){_ctrl(this.edit.doc,shortcutKeys[name],function(){self.clickToolbar(name)})})}self.clickToolbar(name,function(){self[name]()})});self.clickToolbar("formatblock",function(){var blocks=self.lang("formatblock.formatBlock"),heights={h1:28,h2:24,h3:18,H4:14,p:12},curVal=self.cmd.val("formatblock"),menu=self.createMenu({name:"formatblock",width:self.langType=="en"?200:150});_each(blocks,function(key,val){var style="font-size:"+heights[key]+"px;";if(key.charAt(0)==="h"){style+="font-weight:bold;"}menu.addItem({title:'<span style="'+style+'" unselectable="on">'+val+"</span>",height:heights[key]+12,checked:curVal===key||curVal===val,click:function(){self.select().exec("formatblock","<"+key+">").hideMenu()}})})});self.clickToolbar("fontname",function(){var curVal=self.cmd.val("fontname"),menu=self.createMenu({name:"fontname",width:150});console;_each(self.lang("fontname.fontName"),function(key,val){menu.addItem({title:'<span style="font-family: '+key+';" unselectable="on">'+val+"</span>",checked:curVal===key.toLowerCase()||curVal===val.toLowerCase(),click:function(){self.exec("fontname",key).hideMenu()}})})});self.clickToolbar("fontsize",function(){var curVal=self.cmd.val("fontsize"),menu=self.createMenu({name:"fontsize",width:150});_each(self.fontSizeTable,function(i,val){menu.addItem({title:'<span style="font-size:'+val+';" unselectable="on">'+val+"</span>",height:_removeUnit(val)+12,checked:curVal===val,click:function(){self.exec("fontsize",val).hideMenu()}})})});_each("forecolor,hilitecolor".split(","),function(i,name){self.clickToolbar(name,function(){self.createMenu({name:name,selectedColor:self.cmd.val(name)||"default",colors:self.colorTable,click:function(color){self.exec(name,color).hideMenu()}})})});_each("cut,copy,paste".split(","),function(i,name){self.clickToolbar(name,function(){self.focus();try{self.exec(name,null)}catch(e){K.options.errorMsgHandler(self.lang(name+"Error"),"error")}})});self.clickToolbar("about",function(){var html='<div style="margin:20px;">'+"<div>NKeditor "+_VERSION+"</div>"+'<div>Forked from KindEditor By BlackFox. <a href="http://git.oschina.net/blackfox/kindeditor">Git项目地址</a>.</div>'+"</div>";self.createDialog({name:"about",width:350,title:self.lang("about"),body:html})});self.plugin.getSelectedLink=function(){return self.cmd.commonAncestor("a")};self.plugin.getSelectedImage=function(){return _getImageFromRange(self.edit.cmd.range,function(img){return!/^ke-\w+$/i.test(img[0].className)})};self.plugin.getSelectedFlash=function(){return _getImageFromRange(self.edit.cmd.range,function(img){return img[0].className=="ke-flash"})};self.plugin.getSelectedMedia=function(){return _getImageFromRange(self.edit.cmd.range,function(img){return img[0].className=="ke-media"||img[0].className=="ke-rm"})};self.plugin.getSelectedAnchor=function(){return _getImageFromRange(self.edit.cmd.range,function(img){return img[0].className=="ke-anchor"})};_each("link,image,flash,media,anchor".split(","),function(i,name){var uName=name.charAt(0).toUpperCase()+name.substr(1);_each("edit,delete".split(","),function(j,val){self.addContextmenu({title:self.lang(val+uName),click:function(){self.loadPlugin(name,function(){self.plugin[name][val]();self.hideMenu()})},cond:self.plugin["getSelected"+uName],width:150,iconClass:val=="edit"?"ke-icon-"+name:undefined})});self.addContextmenu({title:"-"})});self.plugin.getSelectedTable=function(){return self.cmd.commonAncestor("table")};self.plugin.getSelectedRow=function(){return self.cmd.commonAncestor("tr")};self.plugin.getSelectedCell=function(){return self.cmd.commonAncestor("td")};_each(("prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,"+"rowsplit,colsplit,coldelete,rowdelete,insert,delete").split(","),function(i,val){var cond=_inArray(val,["prop","delete"])<0?self.plugin.getSelectedCell:self.plugin.getSelectedTable;self.addContextmenu({title:self.lang("table"+val),click:function(){self.loadPlugin("table",function(){self.plugin.table[val]();self.hideMenu()})},cond:cond,width:170,iconClass:"ke-icon-table"+val})});self.addContextmenu({title:"-"});_each(("selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,"+"insertunorderedlist,indent,outdent,subscript,superscript,hr,print,"+"bold,italic,underline,strikethrough,removeformat,unlink").split(","),function(i,name){if(shortcutKeys[name]){self.afterCreate(function(){_ctrl(this.edit.doc,shortcutKeys[name],function(){self.cmd.selection();self.clickToolbar(name)})})}self.clickToolbar(name,function(){self.focus().exec(name,null)})});self.afterCreate(function(){var doc=self.edit.doc,cmd,bookmark,div,cls="__kindeditor_paste__",pasting=false;function movePastedData(){cmd.range.moveToBookmark(bookmark);cmd.select();if(_WEBKIT){K("div."+cls,div).each(function(){K(this).after("<br />").remove(true)});K("span.Apple-style-span",div).remove(true);K("span.Apple-tab-span",div).remove(true);K("span[style]",div).each(function(){if(K(this).css("white-space")=="nowrap"){K(this).remove(true)}});K("meta",div).remove()}var html=div[0].innerHTML;div.remove();if(html===""){return}if(_WEBKIT){html=html.replace(/(<br>)\1/gi,"$1")}if(self.pasteType===2){html=html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/gi,"");if(/schemas-microsoft-com|worddocument|mso-\w+/i.test(html)){html=_clearMsWord(html,self.filterMode?self.htmlTags:K.options.htmlTags)}else{html=_formatHtml(html,self.filterMode?self.htmlTags:null);html=self.beforeSetHtml(html)}}if(self.pasteType===1){html=html.replace(/&nbsp;/gi," ");html=html.replace(/\n\s*\n/g,"\n");html=html.replace(/<br[^>]*>/gi,"\n");html=html.replace(/<\/p><p[^>]*>/gi,"\n");html=html.replace(/<[^>]+>/g,"");html=html.replace(/ {2}/g," &nbsp;");if(self.newlineTag=="p"){if(/\n/.test(html)){html=html.replace(/^/,"<p>").replace(/$/,"<br /></p>").replace(/\n/g,"<br /></p><p>")}}else{html=html.replace(/\n/g,"<br />$&")}}self.insertHtml(html,true)}K(doc.body).bind("paste",function(e){if(self.pasteType===0){e.stop();return}if(pasting){return}pasting=true;K("div."+cls,doc).remove();cmd=self.cmd.selection();bookmark=cmd.range.createBookmark();div=K('<div class="'+cls+'"></div>',doc).css({position:"absolute",width:"1px",height:"1px",overflow:"hidden",left:"-1981px",top:K(bookmark.start).pos().y+"px","white-space":"nowrap"});K(doc.body).append(div);if(_IE){var rng=cmd.range.get(true);rng.moveToElementText(div[0]);rng.select();rng.execCommand("paste");e.preventDefault()}else{cmd.range.selectNodeContents(div[0]);cmd.select();div[0].tabIndex=-1;div[0].focus()}setTimeout(function(){movePastedData();pasting=false},0)})});self.beforeGetHtml(function(html){if(_IE&&_V<=8){html=html.replace(/<div\s+[^>]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/gi,function(full,tag){return unescape(tag)});html=html.replace(/(<input)((?:\s+[^>]*)?>)/gi,function($0,$1,$2){if(!/\s+type="[^"]+"/i.test($0)){return $1+' type="text"'+$2}return $0})}return html.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/gi,function($0,$1,$2,$3){return $1+_unescape($2).replace(/\s+/g," ")+$3}).replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/gi,function(full){var imgAttrs=_getAttrList(full);var styles=_getCssList(imgAttrs.style||"");var attrs=_mediaAttrs(imgAttrs["data-ke-tag"]);var width=_undef(styles.width,"");var height=_undef(styles.height,"");if(/px/i.test(width)){width=_removeUnit(width)}if(/px/i.test(height)){height=_removeUnit(height)}attrs.width=_undef(imgAttrs.width,width);attrs.height=_undef(imgAttrs.height,height);return _mediaEmbed(attrs)}).replace(/<img[^>]*class="?ke-anchor"?[^>]*>/gi,function(full){var imgAttrs=_getAttrList(full);return'<a name="'+unescape(imgAttrs["data-ke-name"])+'"></a>'}).replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/gi,function(full,attr,code){return"<script"+unescape(attr)+">"+unescape(code)+"<\/script>"}).replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/gi,function(full,attr,code){return"<noscript"+unescape(attr)+">"+unescape(code)+"</noscript>"}).replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/gi,function(full,start,src,end){full=full.replace(/(\s+(?:href|src)=")[^"]*(")/i,function($0,$1,$2){return $1+_unescape(src)+$2});full=full.replace(/\s+data-ke-src="[^"]*"/i,"");return full}).replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/gi,function(full,start,end){return start+end})});self.beforeSetHtml(function(html){if(_IE&&_V<=8){html=html.replace(/<input[^>]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/gi,function(full){var attrs=_getAttrList(full);var styles=_getCssList(attrs.style||"");if(styles.display=="none"){return'<div class="ke-display-none" data-ke-input-tag="'+escape(full)+'"></div>'}return full})}return html.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/gi,function(full){var attrs=_getAttrList(full);attrs.src=_undef(attrs.src,"");attrs.width=_undef(attrs.width,0);attrs.height=_undef(attrs.height,0);return _mediaImg(self.themesPath+"common/blank.gif",attrs)}).replace(/<video[^>]*type="([^"]+)"[^>]*>(?:<\/video>)?/gi,function(full){var attrs=_getAttrList(full);attrs.src=_undef(attrs.src,"");attrs.width=_undef(attrs.width,0);attrs.height=_undef(attrs.height,0);return _mediaImg(self.themesPath+"common/blank.gif",attrs)}).replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/gi,function(full){var attrs=_getAttrList(full);if(attrs.href!==undefined){return full}return'<img class="ke-anchor" src="'+self.themesPath+'common/anchor.gif" data-ke-name="'+escape(attrs.name)+'" />'}).replace(/<script([^>]*)>([\s\S]*?)<\/script>/gi,function(full,attr,code){return'<div class="ke-script" data-ke-script-attr="'+escape(attr)+'">'+escape(code)+"</div>"}).replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/gi,function(full,attr,code){return'<div class="ke-noscript" data-ke-noscript-attr="'+escape(attr)+'">'+escape(code)+"</div>"}).replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/gi,function(full,start,key,src,end){if(full.match(/\sdata-ke-src="[^"]*"/i)){return full}full=start+key+'="'+src+'"'+' data-ke-src="'+_escape(src)+'"'+end;return full}).replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/gi,function(full,start,end){return start+"data-ke-"+end}).replace(/<table[^>]*\s+border="0"[^>]*>/gi,function(full){if(full.indexOf("ke-zeroborder")>=0){return full}return _addClassToTag(full,"ke-zeroborder")})})})})(window);KindEditor.lang({source:"HTML代码",preview:"预览",undo:"后退(Ctrl+Z)",redo:"前进(Ctrl+Y)",cut:"剪切(Ctrl+X)",copy:"复制(Ctrl+C)",paste:"粘贴(Ctrl+V)",plainpaste:"粘贴为无格式文本",wordpaste:"从Word粘贴",selectall:"全选(Ctrl+A)",justifyleft:"左对齐",justifycenter:"居中",justifyright:"右对齐",justifyfull:"两端对齐",insertorderedlist:"编号",insertunorderedlist:"项目符号",indent:"增加缩进",outdent:"减少缩进",subscript:"下标",superscript:"上标",formatblock:"段落",fontname:"字体",fontsize:"文字大小",forecolor:"文字颜色",hilitecolor:"文字背景",bold:"粗体(Ctrl+B)",italic:"斜体(Ctrl+I)",underline:"下划线(Ctrl+U)",strikethrough:"删除线",removeformat:"删除格式",image:"图片",multiimage:"批量图片上传",graft:"涂鸦",flash:"Flash",media:"视音频",table:"表格",tablecell:"单元格",hr:"插入横线",emoticons:"插入表情",link:"超级链接",unlink:"取消超级链接",fullscreen:"全屏显示",about:"关于",print:"打印(Ctrl+P)",filemanager:"文件空间",code:"插入程序代码",quote:"插入引用",map:"Google地图",baidumap:"百度地图",lineheight:"行距",clearhtml:"清理HTML代码",pagebreak:"插入分页符",quickformat:"一键排版",insertfile:"插入文件",template:"插入模板",anchor:"锚点",yes:"确定",no:"取消",close:"关闭",editImage:"图片属性",deleteImage:"删除图片",editFlash:"Flash属性",deleteFlash:"删除Flash",editMedia:"视音频属性",deleteMedia:"删除视音频",editLink:"超级链接属性",deleteLink:"取消超级链接",editAnchor:"锚点属性",deleteAnchor:"删除锚点",tableprop:"表格属性",tablecellprop:"单元格属性",tableinsert:"插入表格",tabledelete:"删除表格",tablecolinsertleft:"左侧插入列",tablecolinsertright:"右侧插入列",tablerowinsertabove:"上方插入行",tablerowinsertbelow:"下方插入行",tablerowmerge:"向下合并单元格",tablecolmerge:"向右合并单元格",tablerowsplit:"拆分行",tablecolsplit:"拆分列",tablecoldelete:"删除列",tablerowdelete:"删除行",noColor:"无颜色",pleaseSelectFile:"请选择文件。",invalidImg:"请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。",invalidMedia:"请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",invalidWidth:"宽度必须为数字。",invalidHeight:"高度必须为数字。",invalidBorder:"边框必须为数字。",invalidUrl:"请输入有效的URL地址。",invalidRows:"行数为必选项,只允许输入大于0的数字。",invalidCols:"列数为必选项,只允许输入大于0的数字。",invalidPadding:"边距必须为数字。",invalidSpacing:"间距必须为数字。",invalidJson:"服务器发生故障。",uploadSuccess:"上传成功。",cutError:"您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。",copyError:"您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。",pasteError:"您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。",ajaxLoading:"加载中,请稍候 ...",uploadLoading:"上传中,请稍候 ...",uploadError:"上传错误","plainpaste.comment":"请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。","wordpaste.comment":"请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。","code.pleaseInput":"请输入程序代码。","link.url":"URL","link.linkType":"打开类型","link.newWindow":"新窗口","link.selfWindow":"当前窗口","flash.url":"URL","flash.width":"宽度","flash.height":"高度","flash.upload":"上传","flash.viewServer":"文件空间","media.url":"URL","media.width":"宽度","media.height":"高度","media.autostart":"自动播放","media.upload":"上传","media.viewServer":"文件空间","image.remoteImage":"网络图片","image.localImage":"本地上传","image.remoteUrl":"图片地址","image.localUrl":"上传文件","image.size":"图片大小","image.width":"宽","image.height":"高","image.resetSize":"重置大小","image.align":"对齐方式","image.defaultAlign":"默认方式","image.leftAlign":"左对齐","image.rightAlign":"右对齐","image.imgTitle":"图片说明","image.upload":"浏览...","image.viewServer":"图片空间","multiimage.title":"多图上传","multiimage.uploadDesc":"共选择了 <%=numSelect%> 张图片,共 <%=totalSize%>, 还可以添加 <%=numLeft%> 张图片.","multiimage.startUpload":"开始上传","multiimage.noListUrl":"无法获取图片,请先配置 fileManagerJson.","multiimage.noSearchUrl":"无法进行图片搜索,请先配置 imageSearchJson.","multiimage.noDataText":"(⊙o⊙)亲,没有多数据了。","multiimage.closeText":"关闭对话框","multiimage.confirmBtnText":"确定","multiimage.cancelBtnText":"取消","multiimage.loadMoreData":"往下拉动滚动条可以加载更多数据.","multiimage.depJQueryError":"文件管理插件依赖 jQuery, 请先引入 jQuery.","multiimage.localUpload":"本地上传","multiimage.fileServer":"文件服务器","multiimage.imgSearch":"图片搜索","multiimage.selectFile":"点击选择图片","multiimage.continueAdd":"继续添加","multiimage.searchBtn":"搜索一下","multiimage.searchPlaceholder":"请输入搜索关键词","multiimage.searchClear":"清空搜索","multiimage.noFileAdded":"请至少添加一个文件!","multiimage.uploading":"正在上传","multiimage.fileNotUpload":"您还有文件没有上传!","multiimage.uploadLimit":"您本次最多上传 <%=uploadLimit%> 个文件.","multiimage.sizeLimit":"文件大小不能超过 <%=sizeLimit%> KB.","multiimage.invalidExt":"非法的文件后缀 <%=invalidExt%>.","multiimage.remove":"删除","multiimage.rotateRight":"向右旋转","multiimage.rotateLeft":"向左旋转","multiimage.uploadFail":"发生异常,上传失败!","multiimage.noFileSelected":"请至少选择一个文件或一张图片.","filemanager.noDataText":"(⊙o⊙)亲,没有多数据了。","filemanager.title":"文件服务器","filemanager.noListUrl":"无法获取图片,请先配置 fileManagerJson.","filemanager.closeText":"关闭对话框","filemanager.confirmBtnText":"确定","filemanager.cancelBtnText":"取消","filemanager.loadMoreData":"往下拉动滚动条可以加载更多数据.","filemanager.depJQueryError":"文件管理插件依赖 jQuery, 请先引入 jQuery.","filemanager.fileType":"类型","graft.btnText":"保存并插入涂鸦","graft.uploadSuccess":"涂鸦上传成功","graft.uploadFaild":"涂鸦上传失败","graft.empty":"您没有在画布上绘制任何图像","insertfile.url":"URL","insertfile.title":"文件说明","insertfile.upload":"上传","insertfile.viewServer":"文件空间","table.cells":"单元格数","table.rows":"行数","table.cols":"列数","table.size":"大小","table.width":"宽度","table.height":"高度","table.percent":"%","table.px":"px","table.space":"边距间距","table.padding":"边距","table.spacing":"间距","table.align":"对齐方式","table.textAlign":"水平对齐","table.verticalAlign":"垂直对齐","table.alignDefault":"默认","table.alignLeft":"左对齐","table.alignCenter":"居中","table.alignRight":"右对齐","table.alignTop":"顶部","table.alignMiddle":"中部","table.alignBottom":"底部","table.alignBaseline":"基线","table.border":"边框","table.borderWidth":"宽度","table.borderColor":"颜色","table.backgroundColor":"背景颜色","map.address":"地址: ","map.search":"搜索","baidumap.address":"地址: ","baidumap.search":"搜索","baidumap.insertDynamicMap":"插入动态地图","anchor.name":"锚点名称","formatblock.formatBlock":{h1:"标题 1",h2:"标题 2",h3:"标题 3",h4:"标题 4",p:"正 文"},"fontname.fontName":{SimSun:"宋体",NSimSun:"新宋体",FangSong:"仿宋",KaiTi:"楷体",SimHei:"黑体","Microsoft YaHei":"微软雅黑",Arial:"Arial","Arial Black":"Arial Black","Times New Roman":"Times New Roman","Courier New":"Courier New",Tahoma:"Tahoma",Verdana:"Verdana"},"lineheight.lineHeight":[{1:"单倍行距"},{1.5:"1.5倍行距"},{2:"2倍行距"},{2.5:"2.5倍行距"},{3:"3倍行距"}],"template.selectTemplate":"可选模板","template.replaceContent":"替换当前内容","template.fileList":{"1.html":"图片和文字","2.html":"表格","3.html":"项目编号"}},"zh-CN");KindEditor.options.langType="zh-CN";KindEditor.plugin("anchor",function(K){var self=this,name="anchor",lang=self.lang(name+".");self.plugin.anchor={edit:function(){var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keName">'+lang.name+":</label>",'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',"</div>","</div>"].join("");var dialog=self.createDialog({name:name,width:300,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){self.insertHtml('<a name="'+nameBox.val()+'">').hideDialog().focus()}}});var div=dialog.div,nameBox=K('input[name="name"]',div);var img=self.plugin.getSelectedAnchor();if(img){nameBox.val(unescape(img.attr("data-ke-name")))}nameBox[0].focus();nameBox[0].select()},delete:function(){self.plugin.getSelectedAnchor().remove()}};self.clickToolbar(name,self.plugin.anchor.edit)});KindEditor.plugin("autoheight",function(K){var self=this;if(!self.autoHeightMode){return}var minHeight;function hideScroll(){var edit=self.edit;var body=edit.doc.body;edit.iframe[0].scroll="no";body.style.overflowY="hidden"}function resetHeight(){if(self.fullscreenMode){return}var edit=self.edit;var body=edit.doc.body;edit.iframe.height(minHeight);self.resize(null,Math.max((K.IE?body.scrollHeight:body.offsetHeight)+76,minHeight))}function init(){minHeight=K.removeUnit(self.height);self.edit.afterChange(resetHeight);if(!self.fullscreenMode){hideScroll()}resetHeight()}if(self.isCreated){init()}else{self.afterCreate(init)}});KindEditor.plugin("baidumap",function(K){var self=this,name="baidumap",lang=self.lang(name+".");var mapWidth=K.undef(self.mapWidth,558);var mapHeight=K.undef(self.mapHeight,360);self.clickToolbar(name,function(){var html=['<div class="ke-dialog-content-inner" style="padding-top: 0">','<div class="ke-dialog-row ke-clearfix">','<div class="ke-header">'+lang.address,'<input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',"<span>",'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="'+lang.search+'" style="line-height:22px;padding:0 10px;" />',"</span>",'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" style="display:inline-block;" /> <label for="keInsertDynamicMap">'+lang.insertDynamicMap+"</label>","</div>","</div>",'<div class="ke-map" style="width:'+mapWidth+"px;height:"+mapHeight+'px;"></div>',"</div>"].join("");var dialog=self.createDialog({name:name,width:mapWidth+42,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var map=win.map;var centerObj=map.getCenter();var center=centerObj.lng+","+centerObj.lat;var zoom=map.getZoom();var url=[checkbox[0].checked?self.pluginsPath+"baidumap/index.html":"https://api.map.baidu.com/staticimage","?center="+encodeURIComponent(center),"&zoom="+encodeURIComponent(zoom),"&width="+mapWidth,"&height="+mapHeight,"&markers="+encodeURIComponent(center),"&markerStyles="+encodeURIComponent("l,A")].join("");if(checkbox[0].checked){self.insertHtml('<iframe src="'+url+'" frameborder="0" style="width:'+(mapWidth+2)+"px;height:"+(mapHeight+2)+'px;"></iframe>')}else{self.exec("insertimage",url)}self.hideDialog().focus()}},beforeRemove:function(){searchBtn.remove();if(doc){doc.write("")}iframe.remove()}});var div=dialog.div,addressBox=K('[name="address"]',div),searchBtn=K('[name="searchBtn"]',div),checkbox=K('[name="insertDynamicMap"]',dialog.div),win,doc;var iframe=K('<iframe class="ke-textarea" frameborder="0" src="'+self.pluginsPath+'baidumap/map.html" style="width:'+mapWidth+"px;height:"+mapHeight+'px;"></iframe>');function ready(){win=iframe[0].contentWindow;doc=K.iframeDoc(iframe)}iframe.bind("load",function(){iframe.unbind("load");if(K.IE){ready()}else{setTimeout(ready,0)}});K(".ke-map",div).replaceWith(iframe);searchBtn.click(function(){win.search(addressBox.val())})})});KindEditor.plugin("map",function(K){var self=this,name="map",lang=self.lang(name+".");self.clickToolbar(name,function(){var html=['<div style="padding:10px 20px;">','<div class="ke-dialog-row">',lang.address+' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ','<span class="ke-button-common ke-button-outer">','<input type="button" name="searchBtn" class="ke-button-common ke-button" value="'+lang.search+'" />',"</span>","</div>",'<div class="ke-map" style="width:558px;height:360px;"></div>',"</div>"].join("");var dialog=self.createDialog({name:name,width:600,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var geocoder=win.geocoder,map=win.map,center=map.getCenter().lat()+","+map.getCenter().lng(),zoom=map.getZoom(),maptype=map.getMapTypeId(),url="https://maps.googleapis.com/maps/api/staticmap";url+="?center="+encodeURIComponent(center);url+="&zoom="+encodeURIComponent(zoom);url+="&size=558x360";url+="&maptype="+encodeURIComponent(maptype);url+="&markers="+encodeURIComponent(center);url+="&language="+self.langType;url+="&sensor=false";self.exec("insertimage",url).hideDialog().focus()}},beforeRemove:function(){searchBtn.remove();if(doc){doc.write("")}iframe.remove()}});var div=dialog.div,addressBox=K('[name="address"]',div),searchBtn=K('[name="searchBtn"]',div),win,doc;var iframeHtml=["<!doctype html><html><head>",'<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',"<style>","\thtml { height: 100% }","\tbody { height: 100%; margin: 0; padding: 0; background-color: #FFF }","\t#map_canvas { height: 100% }","</style>",'<script src="https://maps.googleapis.com/maps/api/js?sensor=false&language='+self.langType+'"><\/script>',"<script>","var map, geocoder;","function initialize() {","\tvar latlng = new google.maps.LatLng(31.230393, 121.473704);","\tvar options = {","\t\tzoom: 11,","\t\tcenter: latlng,","\t\tdisableDefaultUI: true,","\t\tpanControl: true,","\t\tzoomControl: true,","\t\tmapTypeControl: true,","\t\tscaleControl: true,","\t\tstreetViewControl: false,","\t\toverviewMapControl: true,","\t\tmapTypeId: google.maps.MapTypeId.ROADMAP","\t};",'\tmap = new google.maps.Map(document.getElementById("map_canvas"), options);',"\tgeocoder = new google.maps.Geocoder();","\tgeocoder.geocode({latLng: latlng}, function(results, status) {","\t\tif (status == google.maps.GeocoderStatus.OK) {","\t\t\tif (results[3]) {",'\t\t\t\tparent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',"\t\t\t}","\t\t}","\t});","}","function search(address) {","\tif (!map) return;","\tgeocoder.geocode({address : address}, function(results, status) {","\t\tif (status == google.maps.GeocoderStatus.OK) {","\t\t\tmap.setZoom(11);","\t\t\tmap.setCenter(results[0].geometry.location);","\t\t\tvar marker = new google.maps.Marker({","\t\t\t\tmap: map,","\t\t\t\tposition: results[0].geometry.location","\t\t\t});","\t\t} else {",'\t\t\talert("Invalid address: " + address);',"\t\t}","\t});","}","<\/script>","</head>",'<body onload="initialize();">','<div id="map_canvas" style="width:100%; height:100%"></div>',"</body></html>"].join("\n");var iframe=K('<iframe class="ke-textarea" frameborder="0" src="'+self.pluginsPath+'map/map.html" style="width:558px;height:360px;"></iframe>');function ready(){win=iframe[0].contentWindow;doc=K.iframeDoc(iframe)}iframe.bind("load",function(){iframe.unbind("load");if(K.IE){ready()}else{setTimeout(ready,0)}});K(".ke-map",div).replaceWith(iframe);searchBtn.click(function(){win.search(addressBox.val())})})});KindEditor.plugin("clearhtml",function(K){var self=this,name="clearhtml";self.clickToolbar(name,function(){self.focus();var html=self.html();html=html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/gi,"");html=html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/gi,"");html=K.formatHtml(html,{a:["href","target"],embed:["src","width","height","type","loop","autostart","quality",".width",".height","align","allowscriptaccess","controls"],img:["src","width","height","border","alt","title",".width",".height"],table:["border"],"td,th":["rowspan","colspan"],"div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6":[]});self.html(html);self.cmd.selection(true);self.addBookmark()})});KindEditor.plugin("code",function(K){var self=this,name="code";self.clickToolbar(name,function(){var lang=self.lang(name+"."),html=['<div style="margin: 0px 20px;">','<div class="ke-dialog-row">','<select class="ke-select" style="margin-bottom: 5px;">','<option value="javascript">JavaScript</option>','<option value="html">HTML</option>','<option value="css">CSS</option>','<option value="php">PHP</option>','<option value="perl">Perl</option>','<option value="python">Python</option>','<option value="ruby">Ruby</option>','<option value="java">Java</option>','<option value="go">Go</option>','<option value="asp">ASP/VB</option>','<option value="csharp">C#</option>','<option value="cpp">C/C++</option>','<option value="cs">C#</option>','<option value="bash">Shell</option>','<option value="sql">SQL</option>','<option value="markup">Other</option>',"</select>","</div>",'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',"</div>"].join(""),dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var type=K(".ke-select",dialog.div).val(),code=textarea.val(),cls=type===""?"":"language-"+type,html='<pre class="'+cls+'"><code>'+K.escape(code)+"</code></pre> <br/>";if(K.trim(code)===""){K.options.errorMsgHandler(lang.pleaseInput,"error");textarea[0].focus();return}self.insertHtml(html).hideDialog().focus()}}}),textarea=K("textarea",dialog.div);textarea[0].focus()})});KindEditor.plugin("emoticons",function(K){var self=this,name="emoticons",path=self.emoticonsPath||self.pluginsPath+"emoticons/images/",allowPreview=self.allowPreviewEmoticons===undefined?true:self.allowPreviewEmoticons,currentPageNum=1;self.clickToolbar(name,function(){var rows=5,cols=9,total=135,startNum=0,cells=rows*cols,pages=Math.ceil(total/cells),colsHalf=Math.floor(cols/2),wrapperDiv=K('<div class="ke-plugin-emoticons"></div>'),elements=[],menu=self.createMenu({name:name,beforeRemove:function(){removeEvent()}});menu.div.append(wrapperDiv);var previewDiv,previewImg;if(allowPreview){previewDiv=K('<div class="ke-preview"></div>').css("right",0);previewImg=K('<img class="ke-preview-img" src="'+path+startNum+'.gif" />');wrapperDiv.append(previewDiv);previewDiv.append(previewImg)}function bindCellEvent(cell,j,num){if(previewDiv){cell.mouseover(function(){if(j>colsHalf){previewDiv.css("left",0);previewDiv.css("right","")}else{previewDiv.css("left","");previewDiv.css("right",0)}previewImg.attr("src",path+num+".gif");K(this).addClass("ke-on")})}else{cell.mouseover(function(){K(this).addClass("ke-on")})}cell.mouseout(function(){K(this).removeClass("ke-on")});cell.click(function(e){self.insertHtml('<img src="'+path+num+'.gif" border="0" alt="" />').hideMenu().focus();e.stop()})}function createEmoticonsTable(pageNum,parentDiv){var table=document.createElement("table");parentDiv.append(table);if(previewDiv){K(table).mouseover(function(){previewDiv.show("block")});K(table).mouseout(function(){previewDiv.hide()});elements.push(K(table))}table.className="ke-table";table.cellPadding=0;table.cellSpacing=0;table.border=0;var num=(pageNum-1)*cells+startNum;for(var i=0;i<rows;i++){var row=table.insertRow(i);for(var j=0;j<cols;j++){var cell=K(row.insertCell(j));cell.addClass("ke-cell");bindCellEvent(cell,j,num);var span=K('<span class="ke-img"></span>').css("background-position","-"+24*num+"px 0px").css("background-image","url("+path+"static.gif)");cell.append(span);elements.push(cell);num++}}return table}var table=createEmoticonsTable(currentPageNum,wrapperDiv);function removeEvent(){K.each(elements,function(){this.unbind()})}var pageDiv;function bindPageEvent(el,pageNum){el.click(function(e){removeEvent();table.parentNode.removeChild(table);pageDiv.remove();table=createEmoticonsTable(pageNum,wrapperDiv);createPageTable(pageNum);currentPageNum=pageNum;e.stop()})}function createPageTable(currentPageNum){pageDiv=K('<div class="ke-page"></div>');wrapperDiv.append(pageDiv);for(var pageNum=1;pageNum<=pages;pageNum++){if(currentPageNum!==pageNum){var a=K('<a href="javascript:;">['+pageNum+"]</a>");bindPageEvent(a,pageNum);pageDiv.append(a);elements.push(a)}else{pageDiv.append(K("@["+pageNum+"]"))}pageDiv.append(K("@&nbsp;"))}}createPageTable(currentPageNum)})});KindEditor.plugin("flash",function(K){var self=this,name="flash",lang=self.lang(name+"."),allowFlashUpload=K.undef(self.allowFlashUpload,true),allowFileManager=K.undef(self.allowFileManager,false),formatUploadUrl=K.undef(self.formatUploadUrl,true),extraParams=K.undef(self.extraFileUploadParams,{}),filePostName=K.undef(self.filePostName,"imgFile"),uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php");self.plugin.flash={edit:function(){var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keUrl" class="row-left">'+lang.url+":</label>",'<div class="row-right">','<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+lang.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+lang.viewServer+'" />',"</span>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keWidth" class="row-left">'+lang.width+":</label>",'<div class="row-right">','<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keHeight" class="row-left">'+lang.height+":</label>",'<div class="row-right">','<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',"</div>","</div>","</div>"].join("");var dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var url=K.trim(urlBox.val()),width=widthBox.val(),height=heightBox.val();if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}var html=K.mediaImg(self.themesPath+"common/blank.gif",{src:url,type:K.mediaType(".swf"),width:width,height:height,quality:"high"});self.insertHtml(html).hideDialog().focus()}}}),div=dialog.div,urlBox=K('[name="url"]',div),viewServerBtn=K('[name="viewServer"]',div),widthBox=K('[name="width"]',div),heightBox=K('[name="height"]',div);urlBox.val("http://");if(allowFlashUpload){var callback=function(data){dialog.hideLoading();if(data.code==="000"){var url=data.data.url;if(formatUploadUrl){url=K.formatUrl(url,"absolute")}urlBox.val(url);if(self.afterUpload){self.afterUpload.call(self,url,data,name)}}else{K.options.errorMsgHandler(data.message,"error")}};var uploadbutton=K.uploadbutton({button:K(".ke-upload-button",div)[0],fieldName:filePostName,extraParams:extraParams,url:K.addParam(uploadJson,"fileType=flash"),beforeUpload:function(){if(typeof self.beforeUpload=="function"){self.beforeUpload.call(this,callback);return false}else{return true}},afterUpload:function(data){callback(data)},afterError:function(html){dialog.hideLoading();self.errorDialog(html)}});uploadbutton.fileBox.change(function(e){dialog.showLoading(self.lang("uploadLoading"));uploadbutton.submit()})}else{K(".ke-upload-button",div).hide()}if(allowFileManager){viewServerBtn.click(function(e){self.loadPlugin("filemanager",function(){self.plugin.filemanagerDialog({dirName:"flash",clickFn:function(url){K('[name="url"]',div).val(url);if(self.afterSelectFile){self.afterSelectFile.call(self,url)}}})})})}else{K('[name="url"]').css("width","250px");viewServerBtn.hide()}var img=self.plugin.getSelectedFlash();if(img){var attrs=K.mediaAttrs(img.attr("data-ke-tag"));urlBox.val(attrs.src);widthBox.val(K.removeUnit(img.css("width"))||attrs.width||0);heightBox.val(K.removeUnit(img.css("height"))||attrs.height||0)}urlBox[0].focus();urlBox[0].select()},delete:function(){self.plugin.getSelectedFlash().remove();self.addBookmark()}};self.clickToolbar(name,self.plugin.flash.edit)});KindEditor.plugin("image",function(K){var self=this,name="image",allowImageUpload=K.undef(self.allowImageUpload,true),allowImageRemote=K.undef(self.allowImageRemote,true),formatUploadUrl=K.undef(self.formatUploadUrl,true),allowFileManager=K.undef(self.allowFileManager,false),uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php"),imageTabIndex=K.undef(self.imageTabIndex,0),imgPath=self.pluginsPath+"image/images/",extraParams=K.undef(self.extraFileUploadParams,{}),filePostName=K.undef(self.filePostName,"imgFile"),fillDescAfterUploadImage=K.undef(self.fillDescAfterUploadImage,false),lang=self.lang(name+".");self.plugin.imageDialog=function(options){var imageUrl=options.imageUrl,imageWidth=K.undef(options.imageWidth,""),imageHeight=K.undef(options.imageHeight,""),imageTitle=K.undef(options.imageTitle,""),imageAlign=K.undef(options.imageAlign,""),showRemote=K.undef(options.showRemote,true),showLocal=K.undef(options.showLocal,true),tabIndex=K.undef(options.tabIndex,0),clickFn=options.clickFn;var target="kindeditor_upload_iframe_"+(new Date).getTime();var hiddenElements=[];for(var k in extraParams){hiddenElements.push('<input type="hidden" name="'+k+'" value="'+extraParams[k]+'" />')}var html=['<div class="ke-dialog-content-inner">','<div class="tabs"></div>','<div class="tab1" style="display:none;">','<div class="ke-dialog-row ke-clearfix">','<label for="remoteUrl" class="row-left">'+lang.remoteUrl+":</label>",'<div class="row-right">','<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:250px;" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+lang.viewServer+'" />',"</span>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix ">','<label for="remoteWidth" class="row-left">'+lang.size+":</label>",'<div class="row-right">'+lang.width+' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',lang.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ','<img class="ke-refresh-btn" src="'+imgPath+'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="'+lang.resetSize+'" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label class="row-left">'+lang.align+":</label>",'<div class="row-right">','<span><input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> '+'<img name="defaultImg" src="'+imgPath+'align_top.gif" width="23" height="25" alt="" /></span>',' <span><input type="radio" name="align" class="ke-inline-block" value="left" /> '+'<img name="leftImg" src="'+imgPath+'align_left.gif" width="23" height="25" alt="" /></span>',' <span><input type="radio" name="align" class="ke-inline-block" value="right" /> '+'<img name="rightImg" src="'+imgPath+'align_right.gif" width="23" height="25" alt="" /></span>',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="remoteTitle" class="row-left">'+lang.imgTitle+":</label>",'<div class="row-right">','<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:250px;" />',"</div>","</div>","</div>",'<div class="tab2" style="display:none;">','<iframe name="'+target+'" style="display:none;"></iframe>','<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="'+target+'" action="'+K.addParam(uploadJson,"fileType=image")+'">','<div class="ke-dialog-row ke-clearfix">',hiddenElements.join(""),'<label class="row-left">'+lang.localUrl+":</label>",'<div class="row-right">','<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:250px;" readonly="true" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+lang.upload+'" />',"</div>","</div>","</form>","</div>","</div>"].join("");var dialogWidth=showLocal||allowFileManager?450:400,dialogHeight=showLocal&&showRemote?310:260;var dialog=self.createDialog({name:name,width:dialogWidth,height:dialogHeight,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){if(dialog.isLoading){return}if(showLocal&&showRemote&&tabs&&tabs.selectedIndex===1||!showRemote){if(uploadbutton.fileBox.val()==""){K.options.errorMsgHandler(self.lang("pleaseSelectFile"),"error");return}dialog.showLoading(self.lang("uploadLoading"));uploadbutton.submit();localUrlBox.val("");return}var url=K.trim(urlBox.val()),width=widthBox.val(),height=heightBox.val(),title=titleBox.val(),align="";alignBox.each(function(){if(this.checked){align=this.value;return false}});if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}clickFn.call(self,url,title,width,height,0,align)}},beforeRemove:function(){viewServerBtn.unbind();widthBox.unbind();heightBox.unbind();refreshBtn.unbind()}}),div=dialog.div;var urlBox=K('[name="url"]',div),localUrlBox=K('[name="localUrl"]',div),viewServerBtn=K('[name="viewServer"]',div),widthBox=K('.tab1 [name="width"]',div),heightBox=K('.tab1 [name="height"]',div),refreshBtn=K(".ke-refresh-btn",div),titleBox=K('.tab1 [name="title"]',div),alignBox=K('.tab1 [name="align"]',div);var tabs;if(showRemote&&showLocal){tabs=K.tabs({src:K(".tabs",div),afterSelect:function(i){}});tabs.add({title:lang.remoteImage,panel:K(".tab1",div)});tabs.add({title:lang.localImage,panel:K(".tab2",div)});tabs.select(tabIndex)}else if(showRemote){K(".tab1",div).show()}else if(showLocal){K(".tab2",div).show()}var callback=function(data){if(data.code=="000"){dialog.hideLoading();var url=data.data.url;if(formatUploadUrl){url=K.formatUrl(url,"absolute")}if(!fillDescAfterUploadImage){clickFn.call(self,url,data.title,data.width,data.height,data.border,data.align)}else{K(".ke-dialog-row #remoteUrl",div).val(url);K(".ke-tabs-li",div)[0].click();K(".ke-refresh-btn",div).click()}}else{K.options.errorMsgHandler(data.message,"error")}};var uploadbutton=K.uploadbutton({button:K(".ke-upload-button",div)[0],fieldName:filePostName,form:K(".ke-form",div),target:target,width:60,beforeUpload:function(){if(typeof self.beforeUpload=="function"){self.beforeUpload.call(this,callback);return false}else{return true}},afterUpload:function(data){callback(data)},afterError:function(html){dialog.hideLoading();self.errorDialog(html)}});uploadbutton.fileBox.change(function(e){localUrlBox.val(uploadbutton.fileBox.val())});if(allowFileManager){viewServerBtn.click(function(e){self.loadPlugin("filemanager",function(){self.plugin.filemanagerDialog({dirName:"image",clickFn:function(url){K('[name="url"]',div).val(url);if(self.afterSelectFile){self.afterSelectFile.call(self,url)}}})})})}else{viewServerBtn.hide()}var originalWidth=0,originalHeight=0;function setSize(width,height){widthBox.val(width);heightBox.val(height);originalWidth=width;originalHeight=height}refreshBtn.click(function(e){var tempImg=K('<img src="'+urlBox.val()+'" />',document).css({position:"absolute",visibility:"hidden",top:0,left:"-1000px"});tempImg.bind("load",function(){setSize(tempImg.width(),tempImg.height());tempImg.remove()});K(document.body).append(tempImg)});widthBox.change(function(e){if(originalWidth>0){heightBox.val(Math.round(originalHeight/originalWidth*parseInt(this.value,10)))}});heightBox.change(function(e){if(originalHeight>0){widthBox.val(Math.round(originalWidth/originalHeight*parseInt(this.value,10)))}});urlBox.val(options.imageUrl);setSize(options.imageWidth,options.imageHeight);titleBox.val(options.imageTitle);alignBox.each(function(){if(this.value===options.imageAlign){this.checked=true;return false}});if(showRemote&&tabIndex===0){urlBox[0].focus();urlBox[0].select()}return dialog};self.plugin.image={edit:function(){var img=self.plugin.getSelectedImage();self.plugin.imageDialog({imageUrl:img?img.attr("data-ke-src"):"http://",imageWidth:img?img.width():"",imageHeight:img?img.height():"",imageTitle:img?img.attr("title"):"",imageAlign:img?img.attr("align"):"",showRemote:allowImageRemote,showLocal:allowImageUpload,tabIndex:img?0:imageTabIndex,clickFn:function(url,title,width,height,border,align){if(img){img.attr("src",url);img.attr("data-ke-src",url);img.attr("width",width);img.attr("height",height);img.attr("title",title);img.attr("align",align);img.attr("alt",title)}else{self.exec("insertimage",url,title,width,height,border,align)}setTimeout(function(){self.hideDialog().focus()},0)}})},delete:function(){var target=self.plugin.getSelectedImage();if(target.parent().name=="a"){target=target.parent()}target.remove();self.addBookmark()}};self.clickToolbar(name,self.plugin.image.edit)});KindEditor.plugin("insertfile",function(K){var self=this,name="insertfile",allowFileUpload=K.undef(self.allowFileUpload,true),allowFileManager=K.undef(self.allowFileManager,false),formatUploadUrl=K.undef(self.formatUploadUrl,true),uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php"),extraParams=K.undef(self.extraFileUploadParams,{}),filePostName=K.undef(self.filePostName,"imgFile"),lang=self.lang(name+".");self.plugin.fileDialog=function(options){var fileUrl=K.undef(options.fileUrl,"http://"),fileTitle=K.undef(options.fileTitle,""),clickFn=options.clickFn;var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keUrl" class="row-left">'+lang.url+":</label>",'<div class="row-right">','<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+lang.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+lang.viewServer+'" />',"</span>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keTitle" class="row-left">'+lang.title+":</label>",'<div class="row-right">','<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',"</div>","</div>","</form>","</div>"].join("");var dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var url=K.trim(urlBox.val()),title=titleBox.val();if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}if(K.trim(title)===""){title=url}clickFn.call(self,url,title)}}}),div=dialog.div;var urlBox=K('[name="url"]',div),viewServerBtn=K('[name="viewServer"]',div),titleBox=K('[name="title"]',div);if(allowFileUpload){var callback=function(data){dialog.hideLoading();if(data.code==="000"){var url=data.data.url;if(formatUploadUrl){url=K.formatUrl(url,"absolute")}urlBox.val(url);if(self.afterUpload){self.afterUpload.call(self,url,data,name)}}else{K.options.errorMsgHandler(data.message,"error")}};var uploadbutton=K.uploadbutton({button:K(".ke-upload-button",div)[0],fieldName:filePostName,url:K.addParam(uploadJson,"fileType=file"),extraParams:extraParams,beforeUpload:function(){if(typeof self.beforeUpload=="function"){self.beforeUpload.call(this,callback);return false}else{return true}},afterUpload:function(data){callback(data)},afterError:function(html){dialog.hideLoading();self.errorDialog(html)}});uploadbutton.fileBox.change(function(e){dialog.showLoading(self.lang("uploadLoading"));uploadbutton.submit()})}else{K(".ke-upload-button",div).hide()}if(allowFileManager){viewServerBtn.click(function(e){self.loadPlugin("filemanager",function(){self.plugin.filemanagerDialog({viewType:"LIST",dirName:"file",clickFn:function(url){K('[name="url"]',div).val(url);if(self.afterSelectFile){self.afterSelectFile.call(self,url)}}})})})}else{K("#keUrl").css("width","250px");viewServerBtn.hide()}urlBox.val(fileUrl);titleBox.val(fileTitle);urlBox[0].focus();urlBox[0].select()};self.clickToolbar(name,function(){self.plugin.fileDialog({clickFn:function(url,title){var html='<a class="ke-insertfile" href="'+url+'" data-ke-src="'+url+'" target="_blank">'+title+"</a>";self.insertHtml(html).hideDialog().focus()}})})});KindEditor.plugin("lineheight",function(K){var self=this,name="lineheight",lang=self.lang(name+".");self.clickToolbar(name,function(){var curVal="",commonNode=self.cmd.commonNode({"*":".line-height"});if(commonNode){curVal=commonNode.css("line-height")}var menu=self.createMenu({name:name,width:150});K.each(lang.lineHeight,function(i,row){K.each(row,function(key,val){menu.addItem({title:val,checked:curVal===key,click:function(){self.cmd.toggle('<span style="line-height:'+key+';"></span>',{span:".line-height="+key});self.updateState();self.addBookmark();self.hideMenu()}})})})})});KindEditor.plugin("link",function(K){var self=this,name="link";self.plugin.link={edit:function(){var lang=self.lang(name+"."),html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keUrl" class="row-left">'+lang.url+":</label>",'<div class="row-right">','<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix"">','<label for="keType" class="row-left">'+lang.linkType+":</label>",'<div class="row-right">','<select id="keType" class="ke-select" name="type"></select>',"</div>","</div>","</div>"].join(""),dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var url=K.trim(urlBox.val());if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}self.exec("createlink",url,typeBox.val()).hideDialog().focus()}}}),div=dialog.div,urlBox=K('input[name="url"]',div),typeBox=K('select[name="type"]',div);urlBox.val("http://");typeBox[0].options[0]=new Option(lang.newWindow,"_blank");typeBox[0].options[1]=new Option(lang.selfWindow,"");self.cmd.selection();var a=self.plugin.getSelectedLink();if(a){self.cmd.range.selectNode(a[0]);self.cmd.select();urlBox.val(a.attr("data-ke-src"));typeBox.val(a.attr("target"))}urlBox[0].focus();urlBox[0].select()},delete:function(){self.exec("unlink",null)}};self.clickToolbar(name,self.plugin.link.edit)});KindEditor.plugin("media",function(K){var self=this,name="media",lang=self.lang(name+"."),allowMediaUpload=K.undef(self.allowMediaUpload,false),allowFileManager=K.undef(self.allowFileManager,false),formatUploadUrl=K.undef(self.formatUploadUrl,true),extraParams=K.undef(self.extraFileUploadParams,{}),filePostName=K.undef(self.filePostName,"imgFile"),uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php");self.plugin.media={edit:function(){var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keUrl" class="row-left">'+lang.url+":</label>",'<div class="row-right">','<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:180px;" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+lang.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+lang.viewServer+'" />',"</span>",'<div style="margin-top:5px;color:#aaa;">支持优酷、爱奇艺、腾讯视频等视频网站【<span style="color:green">通用代码</span>】',"</div>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keWidth" class="row-left">'+lang.width+":</label>",'<div class="row-right">','<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keHeight" class="row-left">'+lang.height+":</label>",'<div class="row-right">','<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keAutostart" class="row-left">'+lang.autostart+":</label>",'<div class="row-right">','<input type="checkbox" id="keAutostart" name="autostart" class="ke-input-checkbox" value="" /> ',"</div>","</div>","</div>"].join("");var dialog=self.createDialog({name:name,width:450,height:260,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var url=K.trim(urlBox.val()),width=widthBox.val(),height=heightBox.val();var match=url.match(/^<iframe\s(.*?)src=('|")(.*?)('|")/);if(!match){if(url=="http://"||K.invalidUrl(url)){K.options.errorMsgHandler(self.lang("invalidUrl"),"error");urlBox[0].focus();return}}if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}if(!match){var html=K.mediaImg(self.themesPath+"common/blank.gif",{src:url,type:K.mediaType(url),width:width,height:height,autostart:autostartBox[0].checked?"true":"false",loop:"true"})}else{var html='<iframe src="'+match[3]+'" frameborder="0" style="width:'+width+"px;height:"+height+'px;"></iframe>'}self.insertHtml(html).hideDialog().focus()}}}),div=dialog.div,urlBox=K('[name="url"]',div),viewServerBtn=K('[name="viewServer"]',div),widthBox=K('[name="width"]',div),heightBox=K('[name="height"]',div),autostartBox=K('[name="autostart"]',div);urlBox.val("http://");if(allowMediaUpload){var callback=function(data){dialog.hideLoading();if(data.code=="000"){var url=data.data.url;if(formatUploadUrl){url=K.formatUrl(url,"absolute")}urlBox.val(url);if(self.afterUpload){self.afterUpload.call(self,url,data,name)}}else{K.options.errorMsgHandler(data.message,"error","error")}};var uploadbutton=K.uploadbutton({button:K(".ke-upload-button",div)[0],fieldName:filePostName,extraParams:extraParams,url:K.addParam(uploadJson,"fileType=media"),beforeUpload:function(){if(typeof self.beforeUpload=="function"){self.beforeUpload.call(this,callback);return false}else{return true}},afterUpload:function(data){callback(data)},afterError:function(html){dialog.hideLoading();self.errorDialog(html)}});uploadbutton.fileBox.change(function(e){dialog.showLoading(self.lang("uploadLoading"));uploadbutton.submit()})}else{K(".ke-upload-button",div).hide()}if(allowMediaUpload&&allowFileManager){viewServerBtn.click(function(e){self.loadPlugin("filemanager",function(){self.plugin.filemanagerDialog({dirName:"media",clickFn:function(url){K('[name="url"]',div).val(url);if(self.afterSelectFile){self.afterSelectFile.call(self,url)}}})})})}else{K("#keUrl").css("width","250px");viewServerBtn.hide()}var img=self.plugin.getSelectedMedia();if(img){var attrs=K.mediaAttrs(img.attr("data-ke-tag"));urlBox.val(attrs.src);widthBox.val(K.removeUnit(img.css("width"))||attrs.width||0);heightBox.val(K.removeUnit(img.css("height"))||attrs.height||0);autostartBox[0].checked=attrs.autostart==="true"}urlBox[0].focus();urlBox[0].select()},delete:function(){self.plugin.getSelectedMedia().remove();self.addBookmark()}};self.clickToolbar(name,self.plugin.media.edit)});KindEditor.plugin("multiimage",function(K){var self=this,name="multiimage",uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php"),fileManagerJson=K.undef(self.fileManagerJson,self.basePath+"php/file_manager_json.php"),imageSizeLimit=K.undef(self.imageSizeLimit,2048),imageFileTypes=K.undef(self.imageFileTypes,"jpg|png|gif|jpeg"),imageUploadLimit=K.undef(self.imageUploadLimit,20),filePostName=K.undef(self.filePostName,"imgFile"),lang=self.lang(name+".");if(typeof jQuery=="undefined"){K.options.errorMsgHandler(lang.depJQueryError,"error");return}else{K.loadScript(K.options.pluginsPath+name+"/BUpload.js");K.loadStyle(K.options.pluginsPath+name+"/css/upload.css")}K.locker=function(){var docWidth=Math.max(document.documentElement.clientWidth,document.body.clientWidth);var docHeight=Math.max(document.documentElement.clientHeight,document.body.clientHeight,$(document).height())+document.documentElement.scrollTop;return K.widget({x:0,y:0,cls:"ke-dialog-lock",width:docWidth,height:docHeight})};self.plugin.multiImageDialog=function(options){var clickFn=options.clickFn;var locker=K.locker();locker.show();var dialog=new BUpload({src:filePostName,upload_url:uploadJson,list_url:fileManagerJson,max_filesize:imageSizeLimit,max_filenum:imageUploadLimit,ext_allow:imageFileTypes,lang:lang,top:self.dialogOffset,fileType:"image",errorHandler:K.options.errorMsgHandler,callback:function(data){clickFn.call(this,data)},close:function(){locker.remove()}});return dialog};self.clickToolbar(name,function(){self.plugin.multiImageDialog({clickFn:function(urlList){if(urlList.length===0){return}K.each(urlList,function(i,data){if(self.afterUpload){self.afterUpload.call(self,data,data,"multiimage")}self.exec("insertimage",data)});setTimeout(function(){self.hideDialog().focus()},0)}})})});KindEditor.plugin("graft",function(K){var self=this,name="graft",uploadJson=K.undef(self.uploadJson,self.basePath+"php/upload_json.php"),allowUploadGraft=K.undef(self.allowUploadGraft,true),lang=self.lang(name+".");if(typeof jQuery=="undefined"){K.options.errorMsgHandler(lang.depJQueryError,"error");return}else{K.loadStyle(K.options.pluginsPath+"graft/css/scrawl.css");K.loadScript(K.options.pluginsPath+"graft/scrawl.js")}self.plugin.graftDialog=function(options){var clickFn=options.clickFn;var html=['<div class="scrawl-main" id="scrawl-main">','<div class="hot">','<div class="drawBoard border_style">','<canvas id="canvas-borad" class="brushBorad">你的浏览器不支持 canvas 绘图</canvas>','<div class="picBoard" id="picBoard" style=""></div>',"</div>",'<div class="operateBar">','<button id="J_prevStep" class="prevStep" title="上一步">','<em class="icon"></em>',"</button>",'<button id="J_nextStep" class="nextStep" title="下一步">','<em class="icon"></em>',"</button>",'<button id="J_clearBoard" class="clearBoard" title="清空">','<em class="icon"></em>',"</button>","</div>","</div>",'<div class="drawToolbar border_style">','<div class="colorBar">','<span data-color="#0099CC" style="background:#0099CC;" class="active"></span>','<span data-color="#003366" style="background:#003366;"></span>','<span data-color="#993333" style="background:#993333;"></span>','<span data-color="#FF9900" style="background:#FF9900;"></span>','<span data-color="#0000CC" style="background:#0000CC;"></span>','<span data-color="#CC3333" style="background:#CC3333;"></span>','<span data-color="#F4D03F" style="background:#641E16;"></span>','<span data-color="#4A235A" style="background:#4A235A;"></span>','<span data-color="#009966" style="background:#009966;"></span>','<span data-color="#ffff00" style="background:#ffff00;"></span>','<span data-color="#7D6608" style="background:#7D6608;"></span>','<span data-color="#FF33CC" style="background:#FF33CC;"></span>','<span data-color="#990066" style="background:#990066;"></span>','<span data-color="#ffffff" style="background:#ffffff;"></span>','<span data-color="#9bbb59" style="background:#9bbb59;"></span>','<span data-color="#CCFFFF" style="background:#CCFFFF;"></span>','<span data-color="#FFCCCC" style="background:#FFCCCC;"></span>','<span data-color="#CC99CC" style="background:#CC99CC;"></span>',"</div>",'<div class="sectionBar">','<em class="brushIcon"></em>','<a href="javascript:void(0)" class="brush-size size1">1</a>','<a href="javascript:void(0)" class="brush-size size2">3</a>','<a href="javascript:void(0)" class="brush-size size3">5</a>','<a href="javascript:void(0)" class="brush-size size4">7</a>',"</div>",'<div class="sectionBar">','<em class="eraserIcon"></em>','<a href="javascript:void(0)" class="eraser-size size1">5</a>','<a href="javascript:void(0)" class="eraser-size size2">10</a>','<a href="javascript:void(0)" class="eraser-size size3">15</a>','<a href="javascript:void(0)" class="eraser-size size4">20</a>',"</div>",'<div class="sectionBar">','<em class="blurIcon"></em>','<a href="javascript:void(0)" class="blur-size size1">2</a>','<a href="javascript:void(0)" class="blur-size size2">4</a>','<a href="javascript:void(0)" class="blur-size size3">6</a>','<a href="javascript:void(0)" class="blur-size size4">8</a>',"</div>",'<div class="sectionBar">','<span id="clearSetting" class="clearSetting">','<em class="icon"></em>','<em class="text">初始化设置</em>',"</span>","</div>",'<div class="sectionBar">','<div id="J_addImg" class="addImgH">','<em class="icon"></em>','<em class="text">添加背景</em>','<input type="file" class="upload" id="J_canvas_bg" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>',"</div>","</div>",'<div class="sectionBar">','<span id="J_removeImg" class="removeImg">','<em class="icon"></em>','<em class="text">删除背景</em>',"</span>","</div>","</div>"].join("");var dataURLtoFile=function(dataurl,filename){var arr=dataurl.split(","),mime=arr[0].match(/:(.*?);/)[1],bstr=atob(arr[1]),n=bstr.length,u8arr=new Uint8Array(n);while(n--){u8arr[n]=bstr.charCodeAt(n)}return new File([u8arr],filename,{type:mime})};var dialog=self.createDialog({name:name,width:750,height:440,title:self.lang(name),body:html,yesBtn:{name:lang.btnText,click:function(e){if(dialog.isLoading){return}if(canvas.isEmpty()){K.options.errorMsgHandler(lang.empty,"error");return}canvas.save(function(data){if(allowUploadGraft){var callback=function(res){dialog.hideLoading();if(res.code=="000"){clickFn.call(self,res.data.url);self.hideDialog().focus()}else{K.options.errorMsgHandler(lang.uploadFaild,"error")}};dialog.showLoading(self.lang("uploadLoading"));if(typeof self.beforeUpload=="function"){var file=dataURLtoFile(data,"graft.png");self.beforeUpload.call(this,callback,file)}else{$.post(uploadJson,{img_base64_data:data,fileType:"image",base64:1},function(res){callback(res)},"json")}}else{clickFn.call(self,data);self.hideDialog().focus()}})}}});var canvas=new Canvas({canvasId:"canvas-borad",width:600,height:320})};self.clickToolbar(name,function(){self.plugin.graftDialog({clickFn:function(url){self.exec("insertimage",url)}})})});KindEditor.plugin("filemanager",function(K){var self=this;var fileManagerJson=K.undef(self.fileManagerJson,self.basePath+"php/file_manager_json.php");var lang=self.lang("filemanager.");if(typeof jQuery=="undefined"){K.options.errorMsgHandler(lang.depJQueryError,"error");return}else{K.loadScript(K.options.pluginsPath+"filemanager/FManager.js");K.loadStyle(K.options.pluginsPath+"multiimage/css/upload.css")}self.plugin.filemanagerDialog=function(options){var clickFn=options.clickFn;new FManager({list_url:fileManagerJson,lang:lang,fileType:options.dirName,top:self.dialogOffset,multiple:options.multiple?true:false,callback:function(data){clickFn.call(this,options.multiple?data:data[0])}})}});KindEditor.plugin("pagebreak",function(K){var self=this;var name="pagebreak";var pagebreakHtml=K.undef(self.pagebreakHtml,'<hr style="page-break-after: always;" class="ke-pagebreak" />');self.clickToolbar(name,function(){var cmd=self.cmd,range=cmd.range;self.focus();var tail=self.newlineTag=="br"||K.WEBKIT?"":'<span id="__kindeditor_tail_tag__"></span>';self.insertHtml(pagebreakHtml+tail);if(tail!==""){var p=K("#__kindeditor_tail_tag__",self.edit.doc);range.selectNodeContents(p[0]);p.removeAttr("id");cmd.select()}})});KindEditor.plugin("plainpaste",function(K){var self=this,name="plainpaste";self.clickToolbar(name,function(){var lang=self.lang(name+"."),html='<div style="padding:10px 20px;">'+'<div style="margin-bottom:10px;">'+lang.comment+"</div>"+'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>'+"</div>",dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var html=textarea.val();html=K.escape(html);html=html.replace(/ {2}/g," &nbsp;");if(self.newlineTag=="p"){html=html.replace(/^/,"<p>").replace(/$/,"</p>").replace(/\n/g,"</p><p>")}else{html=html.replace(/\n/g,"<br />$&")}self.insertHtml(html).hideDialog().focus()}}}),textarea=K("textarea",dialog.div);textarea[0].focus()})});KindEditor.plugin("preview",function(K){var self=this,name="preview",undefined;self.clickToolbar(name,function(){var lang=self.lang(name+"."),width=document.documentElement.clientWidth*.9,height=document.documentElement.clientHeight-160,html='<div style="padding:10px 20px;">'+'<iframe class="ke-textarea" frameborder="0" style="width:'+(width-42)+"px;height:"+height+'px;"></iframe>'+"</div>",dialog=self.createDialog({name:name,width:width,title:self.lang(name),body:html}),iframe=K("iframe",dialog.div),doc=K.iframeDoc(iframe);doc.open();var cssPath=self.options.cssPath;var jsPath=self.options.jsPath;var arr=['<html lang="en">','<head><meta charset="utf-8" /><title></title>',"<style>","html {margin:0;padding:0;}","body {margin:0;padding:5px;}",'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',"body, p, div {word-wrap: break-word;}","p {margin:5px 0;}","table {border-collapse:collapse;}","img {border:0;}","noscript {display:none;}","table.ke-zeroborder td {border:1px dotted #AAA;}","img.ke-flash {","\tborder:1px solid #AAA;","\tbackground-image:url("+self.options.themesPath+"common/flash.svg);","\t*background-image:url("+self.options.themesPath+"common/flash.png);","\tbackground-size:64px 64px;","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-rm {","\tborder:1px solid #AAA;","\tbackground-image:url("+self.options.themesPath+"common/rm.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-media {","\tborder:1px solid #AAA;","\tbackground-image:url("+self.options.themesPath+"common/play.svg);","\t*background-image:url("+self.options.themesPath+"common/play.png);","\tbackground-position:center center;","\tbackground-size:64px 64px;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-anchor {","\tborder:1px dashed #666;","\twidth:16px;","\theight:16px;","}",".ke-script, .ke-noscript, .ke-display-none {","\tdisplay:none;","\tfont-size:0;","\twidth:0;","\theight:0;","}",".ke-pagebreak {","\tborder:1px dotted #AAA;","\tfont-size:0;","\theight:2px;","}"];if(self.options.showHelpGrid){arr.push("p,ul,ol,li,div{border: 1px dashed #c1c1c1;}");arr.push("li{margin:5px 0px}");arr.push("div,ul,ol{margin-bottom:10px}")}arr.push("</style>");if(!K.isArray(cssPath)){cssPath=[cssPath]}if(K.inArray(self.options.pluginsPath+"code/prism.css",cssPath)<0){cssPath.push(self.options.pluginsPath+"code/prism.css")}K.each(cssPath,function(i,path){if(path){arr.push('<link href="'+path+'" rel="stylesheet" />')}});if(self.options.cssData){arr.push("<style>"+self.options.cssData+"</style>")}arr.push("</head><body "+(self.options.bodyClass?'class="'+self.options.bodyClass+'"':"")+">");arr.push(self.fullHtml());if(!K.isArray(jsPath)){jsPath=[jsPath]}if(K.inArray(self.options.pluginsPath+"code/prism.js",jsPath)<0){jsPath.push(self.options.pluginsPath+"code/prism.js")}K.each(jsPath,function(i,path){if(path){arr.push('<script type="text/javascript" src="'+path+'"><\/script>')}});arr.push("</body></html>");doc.write(arr.join("\n"));doc.close();K(doc.body).css("background-color","#FFF");iframe[0].contentWindow.focus()})});KindEditor.plugin("quickformat",function(K){var self=this,name="quickformat",blockMap=K.toMap("blockquote,center,div,h1,h2,h3,h4,h5,h6,p");function getFirstChild(knode){var child=knode.first();while(child&&child.first()){child=child.first()}return child}self.clickToolbar(name,function(){self.focus();var doc=self.edit.doc,range=self.cmd.range,child=K(doc.body).first(),next,nodeList=[],subList=[],bookmark=range.createBookmark(true);while(child){next=child.next();var firstChild=getFirstChild(child);if(!firstChild||firstChild.name!="img"){if(blockMap[child.name]){child.html(child.html().replace(/^(\s|&nbsp;| )+/gi,""));child.css("text-indent","2em")}else{subList.push(child)}if(!next||(blockMap[next.name]||blockMap[child.name]&&!blockMap[next.name])){if(subList.length>0){nodeList.push(subList)}subList=[]}}child=next}K.each(nodeList,function(i,subList){var wrapper=K('<p style="text-indent:2em;"></p>',doc);subList[0].before(wrapper);K.each(subList,function(i,knode){wrapper.append(knode)})});range.moveToBookmark(bookmark);self.addBookmark()})});KindEditor.plugin("table",function(K){var self=this,name="table",lang=self.lang(name+"."),zeroborder="ke-zeroborder";var borderColor=K.undef(self.options.tableBorderColor,"#cccccc");function _setColor(box,color){color=color.toUpperCase();box.css("background-color",color);box.css("color",color==="#000000"?"#FFFFFF":"#000000");box.html(color)}var pickerList=[];function _initColorPicker(dialogDiv,colorBox){colorBox.bind("click,mousedown",function(e){e.stopPropagation()});function removePicker(){K.each(pickerList,function(){this.remove()});pickerList=[];K(document).unbind("click,mousedown",removePicker);dialogDiv.unbind("click,mousedown",removePicker)}colorBox.click(function(e){removePicker();var box=K(this),pos=box.pos();var picker=K.colorpicker({x:pos.x,y:pos.y+box.height(),z:811214,selectedColor:K(this).html(),colors:self.colorTable,noColor:self.lang("noColor"),shadowMode:self.shadowMode,click:function(color){_setColor(box,color);removePicker()}});pickerList.push(picker);K(document).bind("click,mousedown",removePicker);dialogDiv.bind("click,mousedown",removePicker)})}function _getCellIndex(table,row,cell){var rowSpanCount=0;for(var i=0,len=row.cells.length;i<len;i++){if(row.cells[i]==cell){break}rowSpanCount+=row.cells[i].rowSpan-1}return cell.cellIndex-rowSpanCount}self.plugin.table={prop:function(isInsert){var html=['<div class="ke-dialog-content-inner">','<div class="ke-dialog-row ke-clearfix">','<label for="keRows" class="row-left">'+lang.cells+":</label>",'<div class="row-right">',lang.rows+' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',lang.cols+' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keWidth" class="row-left">'+lang.size+":</label>",'<div class="row-right">',lang.width+' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ','<select name="widthType" class="ke-select">','<option value="%">'+lang.percent+"</option>",'<option value="px">'+lang.px+"</option>","</select> &nbsp; ",lang.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ','<select name="heightType" class="ke-select">','<option value="%">'+lang.percent+"</option>",'<option value="px">'+lang.px+"</option>","</select>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="kePadding" class="row-left">'+lang.space+":</label>",'<div class="row-right">',lang.padding+' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',lang.spacing+' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keAlign" class="row-left">'+lang.align+":</label>",'<div class="row-right">','<select id="keAlign" class="ke-select" name="align">','<option value="">'+lang.alignDefault+"</option>",'<option value="left">'+lang.alignLeft+"</option>",'<option value="center">'+lang.alignCenter+"</option>",'<option value="right">'+lang.alignRight+"</option>","</select>","</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keBorder" class="row-left">'+lang.border+":</label>",'<div class="row-right">',lang.borderWidth+' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',lang.borderColor+' <span class="ke-inline-block ke-input-color"></span>',"</div>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keBgColor" class="row-left">'+lang.backgroundColor+":</label>",'<div class="row-right">','<span class="ke-inline-block ke-input-color"></span>',"</div>","</div>","</div>"].join("");var bookmark=self.cmd.range.createBookmark();var dialog=self.createDialog({name:name,width:500,title:self.lang(name),body:html,beforeRemove:function(){colorBox.unbind()},yesBtn:{name:self.lang("yes"),click:function(e){var rows=rowsBox.val(),cols=colsBox.val(),width=widthBox.val(),height=heightBox.val(),widthType=widthTypeBox.val(),heightType=heightTypeBox.val(),padding=paddingBox.val(),spacing=spacingBox.val(),align=alignBox.val(),border=borderBox.val(),borderColor=K(colorBox[0]).html()||"",bgColor=K(colorBox[1]).html()||"";if(rows==0||!/^\d+$/.test(rows)){K.options.errorMsgHandler(self.lang("invalidRows"),"error");rowsBox[0].focus();return}if(cols==0||!/^\d+$/.test(cols)){K.options.errorMsgHandler(self.lang("invalidRows"),"error");colsBox[0].focus();return}if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}if(!/^\d*$/.test(padding)){K.options.errorMsgHandler(self.lang("invalidPadding"),"error");paddingBox[0].focus();return}if(!/^\d*$/.test(spacing)){K.options.errorMsgHandler(self.lang("invalidSpacing"),"error");spacingBox[0].focus();return}if(!/^\d*$/.test(border)){K.options.errorMsgHandler(self.lang("invalidBorder"),"error");borderBox[0].focus();return}if(table){if(width!==""){table.width(width+widthType)}else{table.css("width","")}if(table[0].width!==undefined){table.removeAttr("width")}if(height!==""){table.height(height+heightType)}else{table.css("height","")}if(table[0].height!==undefined){table.removeAttr("height")}table.css("background-color",bgColor);if(table[0].bgColor!==undefined){table.removeAttr("bgColor")}if(padding!==""){table[0].cellPadding=padding}else{table.removeAttr("cellPadding")}if(spacing!==""){table[0].cellSpacing=spacing}else{table.removeAttr("cellSpacing")}if(align!==""){table[0].align=align}else{table.removeAttr("align")}if(border!==""){table.attr("border",border)}else{table.removeAttr("border")}if(border===""||border==="0"){table.addClass(zeroborder)}else{table.removeClass(zeroborder)}if(borderColor!==""){table.attr("borderColor",borderColor)}else{table.removeAttr("borderColor")}self.hideDialog().focus();self.cmd.range.moveToBookmark(bookmark);self.cmd.select();self.addBookmark();return}var style="";if(width!==""){style+="width:"+width+widthType+";"}if(height!==""){style+="height:"+height+heightType+";"}if(bgColor!==""){style+="background-color:"+bgColor+";"}var html='<table class="table"';if(style!==""){html+=' style="'+style+'"'}if(padding!==""){html+=' cellpadding="'+padding+'"'}if(spacing!==""){html+=' cellspacing="'+spacing+'"'}if(align!==""){html+=' align="'+align+'"'}if(border!==""){html+=' border="'+border+'"'}if(border===""||border==="0"){html+=' class="table '+zeroborder+'"'}if(borderColor!==""){html+=' bordercolor="'+borderColor+'"'}html+=">";for(var i=0;i<rows;i++){html+="<tr>";for(var j=0;j<cols;j++){html+="<td>"+(K.IE?"&nbsp;":"<br />")+"</td>"}html+="</tr>"}html+="</table>";if(!K.IE){html+="<br />"}function getAncestorTag(range){var ancestor=K(range.commonAncestor());while(ancestor){if(ancestor.type==1&&!ancestor.isStyle()){break}ancestor=ancestor.parent()}return ancestor}var tag=getAncestorTag(self.cmd.range);if(tag.name=="p"){tag.before(K(html));tag.remove();self.cmd.selection();self.insertHtml("<br />");self.select().hideDialog().focus()}else{self.insertHtml(html);self.select().hideDialog().focus();self.addBookmark()}}}}),div=dialog.div,rowsBox=K('[name="rows"]',div).val(3),colsBox=K('[name="cols"]',div).val(2),widthBox=K('[name="width"]',div).val(100),heightBox=K('[name="height"]',div),widthTypeBox=K('[name="widthType"]',div),heightTypeBox=K('[name="heightType"]',div),paddingBox=K('[name="padding"]',div).val(0),spacingBox=K('[name="spacing"]',div).val(0),alignBox=K('[name="align"]',div),borderBox=K('[name="border"]',div).val(1),colorBox=K(".ke-input-color",div);_initColorPicker(div,colorBox.eq(0));_initColorPicker(div,colorBox.eq(1));_setColor(colorBox.eq(1),"");rowsBox[0].focus();rowsBox[0].select();var table;if(isInsert){return}table=self.plugin.getSelectedTable();if(table){rowsBox.val(table[0].rows.length);colsBox.val(table[0].rows.length>0?table[0].rows[0].cells.length:0);rowsBox.attr("disabled",true);colsBox.attr("disabled",true);var match,tableWidth=table[0].style.width||table[0].width,tableHeight=table[0].style.height||table[0].height;if(tableWidth!==undefined&&(match=/^(\d+)((?:px|%)*)$/.exec(tableWidth))){widthBox.val(match[1]);widthTypeBox.val(match[2])}else{widthBox.val("")}if(tableHeight!==undefined&&(match=/^(\d+)((?:px|%)*)$/.exec(tableHeight))){heightBox.val(match[1]);heightTypeBox.val(match[2])}paddingBox.val(table[0].cellPadding||"");spacingBox.val(table[0].cellSpacing||"");alignBox.val(table[0].align||"");borderBox.val(table[0].border===undefined?"":table[0].border);_setColor(colorBox.eq(0),K.toHex(table.attr("borderColor")||""));_setColor(colorBox.eq(1),K.toHex(table[0].style.backgroundColor||table[0].bgColor||""));widthBox[0].focus();widthBox[0].select()}},cellprop:function(){var html=['<div style="padding:20px;">','<div class="ke-dialog-row ke-clearfix">','<label for="keWidth" style="width:90px;">'+lang.size+"</label>",lang.width+' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ','<select name="widthType">','<option value="%">'+lang.percent+"</option>",'<option value="px">'+lang.px+"</option>","</select> &nbsp; ",lang.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ','<select name="heightType">','<option value="%">'+lang.percent+"</option>",'<option value="px">'+lang.px+"</option>","</select>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keAlign" style="width:90px;">'+lang.align+"</label>",lang.textAlign+' <select id="keAlign" name="textAlign">','<option value="">'+lang.alignDefault+"</option>",'<option value="left">'+lang.alignLeft+"</option>",'<option value="center">'+lang.alignCenter+"</option>",'<option value="right">'+lang.alignRight+"</option>","</select> ",lang.verticalAlign+' <select name="verticalAlign">','<option value="">'+lang.alignDefault+"</option>",'<option value="top">'+lang.alignTop+"</option>",'<option value="middle">'+lang.alignMiddle+"</option>",'<option value="bottom">'+lang.alignBottom+"</option>",'<option value="baseline">'+lang.alignBaseline+"</option>","</select>","</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keBorder" style="width:90px;">'+lang.border+"</label>",lang.borderWidth+' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',lang.borderColor+' <span class="ke-inline-block ke-input-color"></span>',"</div>",'<div class="ke-dialog-row ke-clearfix">','<label for="keBgColor" style="width:90px;">'+lang.backgroundColor+"</label>",'<span class="ke-inline-block ke-input-color"></span>',"</div>","</div>"].join("");var bookmark=self.cmd.range.createBookmark();var dialog=self.createDialog({name:name,width:500,title:self.lang("tablecell"),body:html,beforeRemove:function(){colorBox.unbind()},yesBtn:{name:self.lang("yes"),click:function(e){var width=widthBox.val(),height=heightBox.val(),widthType=widthTypeBox.val(),heightType=heightTypeBox.val(),padding=paddingBox.val(),spacing=spacingBox.val(),textAlign=textAlignBox.val(),verticalAlign=verticalAlignBox.val(),border=borderBox.val(),borderColor=K(colorBox[0]).html()||"",bgColor=K(colorBox[1]).html()||"";if(!/^\d*$/.test(width)){K.options.errorMsgHandler(self.lang("invalidWidth"),"error");widthBox[0].focus();return}if(!/^\d*$/.test(height)){K.options.errorMsgHandler(self.lang("invalidHeight"),"error");heightBox[0].focus();return}if(!/^\d*$/.test(border)){K.options.errorMsgHandler(self.lang("invalidBorder"),"error");borderBox[0].focus();return}cell.css({width:width!==""?width+widthType:"",height:height!==""?height+heightType:"","background-color":bgColor,"text-align":textAlign,"vertical-align":verticalAlign,"border-width":border,"border-style":border!==""?"solid":"","border-color":borderColor});self.hideDialog().focus();self.cmd.range.moveToBookmark(bookmark);self.cmd.select();self.addBookmark()}}}),div=dialog.div,widthBox=K('[name="width"]',div).val(100),heightBox=K('[name="height"]',div),widthTypeBox=K('[name="widthType"]',div),heightTypeBox=K('[name="heightType"]',div),paddingBox=K('[name="padding"]',div).val(0),spacingBox=K('[name="spacing"]',div).val(0),textAlignBox=K('[name="textAlign"]',div),verticalAlignBox=K('[name="verticalAlign"]',div),borderBox=K('[name="border"]',div).val(1),colorBox=K(".ke-input-color",div);_initColorPicker(div,colorBox.eq(0));_initColorPicker(div,colorBox.eq(1));_setColor(colorBox.eq(1),"");widthBox[0].focus();widthBox[0].select();var cell=self.plugin.getSelectedCell();var match,cellWidth=cell[0].style.width||cell[0].width||"",cellHeight=cell[0].style.height||cell[0].height||"";if(match=/^(\d+)((?:px|%)*)$/.exec(cellWidth)){widthBox.val(match[1]);widthTypeBox.val(match[2])}else{widthBox.val("")}if(match=/^(\d+)((?:px|%)*)$/.exec(cellHeight)){heightBox.val(match[1]);heightTypeBox.val(match[2])}textAlignBox.val(cell[0].style.textAlign||"");verticalAlignBox.val(cell[0].style.verticalAlign||"");var border=cell[0].style.borderWidth||"";if(border){border=parseInt(border)}borderBox.val(border);_setColor(colorBox.eq(0),K.toHex(cell[0].style.borderColor||""));_setColor(colorBox.eq(1),K.toHex(cell[0].style.backgroundColor||""));widthBox[0].focus();widthBox[0].select()},insert:function(){this.prop(true)},delete:function(){var table=self.plugin.getSelectedTable();self.cmd.range.setStartBefore(table[0]).collapse(true);self.cmd.select();table.remove();self.addBookmark()},colinsert:function(offset){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],index=cell.cellIndex+offset;index+=table.rows[0].cells.length-row.cells.length;for(var i=0,len=table.rows.length;i<len;i++){var newRow=table.rows[i],newCell=newRow.insertCell(index);newCell.innerHTML=K.IE?"":"<br />";index=_getCellIndex(table,newRow,newCell)}self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},colinsertleft:function(){this.colinsert(0)},colinsertright:function(){this.colinsert(1)},rowinsert:function(offset){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0];var rowIndex=row.rowIndex;if(offset===1){rowIndex=row.rowIndex+(cell.rowSpan-1)+offset}var newRow=table.insertRow(rowIndex);for(var i=0,len=row.cells.length;i<len;i++){if(row.cells[i].rowSpan>1){len-=row.cells[i].rowSpan-1}var newCell=newRow.insertCell(i);if(offset===1&&row.cells[i].colSpan>1){newCell.colSpan=row.cells[i].colSpan}newCell.innerHTML=K.IE?"":"<br />"}for(var j=rowIndex;j>=0;j--){var cells=table.rows[j].cells;if(cells.length>i){for(var k=cell.cellIndex;k>=0;k--){if(cells[k].rowSpan>1){cells[k].rowSpan+=1}}break}}self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},rowinsertabove:function(){this.rowinsert(0)},rowinsertbelow:function(){this.rowinsert(1)},rowmerge:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],rowIndex=row.rowIndex,nextRowIndex=rowIndex+cell.rowSpan,nextRow=table.rows[nextRowIndex];if(table.rows.length<=nextRowIndex){return}var cellIndex=cell.cellIndex;if(nextRow.cells.length<=cellIndex){return}var nextCell=nextRow.cells[cellIndex];if(cell.colSpan!==nextCell.colSpan){return}cell.rowSpan+=nextCell.rowSpan;nextRow.deleteCell(cellIndex);self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},colmerge:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],rowIndex=row.rowIndex,cellIndex=cell.cellIndex,nextCellIndex=cellIndex+1;if(row.cells.length<=nextCellIndex){return}var nextCell=row.cells[nextCellIndex];if(cell.rowSpan!==nextCell.rowSpan){return}cell.colSpan+=nextCell.colSpan;row.deleteCell(nextCellIndex);self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},rowsplit:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],rowIndex=row.rowIndex;if(cell.rowSpan===1){return}var cellIndex=_getCellIndex(table,row,cell);for(var i=1,len=cell.rowSpan;i<len;i++){var newRow=table.rows[rowIndex+i],newCell=newRow.insertCell(cellIndex);if(cell.colSpan>1){newCell.colSpan=cell.colSpan}newCell.innerHTML=K.IE?"":"<br />";cellIndex=_getCellIndex(table,newRow,newCell)}K(cell).removeAttr("rowSpan");self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},colsplit:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],cellIndex=cell.cellIndex;if(cell.colSpan===1){return}for(var i=1,len=cell.colSpan;i<len;i++){var newCell=row.insertCell(cellIndex+i);if(cell.rowSpan>1){newCell.rowSpan=cell.rowSpan}newCell.innerHTML=K.IE?"":"<br />"}K(cell).removeAttr("colSpan");self.cmd.range.selectNodeContents(cell).collapse(true);self.cmd.select();self.addBookmark()},coldelete:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],index=cell.cellIndex;for(var i=0,len=table.rows.length;i<len;i++){var newRow=table.rows[i],newCell=newRow.cells[index];if(newCell.colSpan>1){newCell.colSpan-=1;if(newCell.colSpan===1){K(newCell).removeAttr("colSpan")}}else{newRow.deleteCell(index)}if(newCell.rowSpan>1){i+=newCell.rowSpan-1}}if(row.cells.length===0){self.cmd.range.setStartBefore(table).collapse(true);self.cmd.select();K(table).remove()}else{self.cmd.selection(true)}self.addBookmark()},rowdelete:function(){var table=self.plugin.getSelectedTable()[0],row=self.plugin.getSelectedRow()[0],cell=self.plugin.getSelectedCell()[0],rowIndex=row.rowIndex;for(var i=cell.rowSpan-1;i>=0;i--){table.deleteRow(rowIndex+i)}if(table.rows.length===0){self.cmd.range.setStartBefore(table).collapse(true);self.cmd.select();K(table).remove()}else{self.cmd.selection(true)}self.addBookmark()}};self.clickToolbar(name,self.plugin.table.prop)});KindEditor.plugin("template",function(K){var self=this,name="template",lang=self.lang(name+"."),htmlPath=self.pluginsPath+name+"/html/";function getFilePath(fileName){return htmlPath+fileName+"?ver="+encodeURIComponent(K.DEBUG?K.TIME:K.VERSION)}self.clickToolbar(name,function(){var lang=self.lang(name+"."),arr=['<div class="ke-dialog-content-inner" style="padding-top:0">','<div class="ke-dialog-row ke-clearfix">','<div class="ke-header" style="height: 32px;">',lang.selectTemplate+' <select class="ke-select">'];K.each(lang.fileList,function(key,val){arr.push('<option value="'+key+'">'+val+"</option>")});html=[arr.join(""),"</select>",'<input type="checkbox" id="keReplaceFlag" class="checkbox" name="replaceFlag" value="1" /> <label for="keReplaceFlag">'+lang.replaceContent+"</label>","</div>","</div>",'<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',"</div>"].join("");var dialog=self.createDialog({name:name,width:500,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var doc=K.iframeDoc(iframe);self[checkbox[0].checked?"html":"insertHtml"](doc.body.innerHTML).hideDialog().focus()}}});var selectBox=K("select",dialog.div),checkbox=K('[name="replaceFlag"]',dialog.div),iframe=K("iframe",dialog.div);checkbox[0].checked=true;iframe.attr("src",getFilePath(selectBox.val()));selectBox.change(function(){iframe.attr("src",getFilePath(this.value))})})});KindEditor.plugin("wordpaste",function(K){var self=this,name="wordpaste";self.clickToolbar(name,function(){var jsonp=function(url,callback){var callbackName="jsonp_callback_"+Math.round(1e5*Math.random());window[callbackName]=function(data){delete window[callbackName];document.body.removeChild(script);callback(data)};var script=document.createElement("script");script.src=url+(url.indexOf("?")>=0?"&":"?")+"callback="+callbackName;document.body.appendChild(script)};var lang=self.lang(name+"."),html='<div style="padding:10px 20px;">'+'<div style="margin-bottom:10px;">'+lang.comment+"</div>"+'<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>'+"</div>",dialog=self.createDialog({name:name,width:450,title:self.lang(name),body:html,yesBtn:{name:self.lang("yes"),click:function(e){var str=doc.body.innerHTML;str=K.clearMsWord(str,self.filterMode?self.htmlTags:K.options.htmlTags);if(typeof self.wordImageServer!=="undefined"&&self.wordImageServer){var i=0;var arr=[];var replacedStr=str.replace(/file:\/\/+(localhost)?(\S+\.(png|jpg|jpeg|gif|bmp))/gi,function(value){arr[i]=value;var replaced="##"+i+"##";i++;return replaced});for(var j=0;j<arr.length;j++){jsonp("http://"+self.wordImageServer+"/word?index="+j+"&file="+encodeURIComponent(arr[j]),function(data){K.uploadwordimage.call(self,data.index,data.info)})}str=replacedStr}self.insertHtml(str).hideDialog().focus()}}}),div=dialog.div,iframe=K("iframe",div),doc=K.iframeDoc(iframe);if(!K.IE){doc.designMode="on"}doc.open();doc.write("<!doctype html><html><head><title>WordPaste</title></head>");doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');if(!K.IE){doc.write("<br />")}doc.write("</body></html>");doc.close();if(K.IE){doc.body.contentEditable="true"}iframe[0].contentWindow.focus()})});KindEditor.plugin("fixtoolbar",function(K){var self=this;if(!self.fixToolBar){return}function init(){var toolbar=K(".ke-toolbar");var originY=toolbar.pos().y;K(window).bind("scroll",function(){if(toolbar.css("position")=="fixed"){if(document.body.scrollTop-originY<0){toolbar.css("position","static");toolbar.css("top","auto")}}else{if(toolbar.pos().y-document.body.scrollTop<0){toolbar.css("position","fixed");toolbar.css("top",0)}}})}if(self.isCreated){init()}else{self.afterCreate(init)}});
diff --git a/public/assets/addons/nkeditor/plugins/anchor/anchor.js b/public/assets/addons/nkeditor/plugins/anchor/anchor.js
new file mode 100644
index 0000000..ddf6b7a
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/anchor/anchor.js
@@ -0,0 +1,46 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('anchor', function(K) {
+	var self = this, name = 'anchor', lang = self.lang(name + '.');
+	self.plugin.anchor = {
+		edit : function() {
+			var html = ['<div class="ke-dialog-content-inner">',
+					'<div class="ke-dialog-row ke-clearfix">',
+					'<label for="keName">' + lang.name + ':</label>',
+					'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',
+					'</div>',
+					'</div>'].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 300,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus();
+					}
+				}
+			});
+			var div = dialog.div,
+				nameBox = K('input[name="name"]', div);
+			var img = self.plugin.getSelectedAnchor();
+			if (img) {
+				nameBox.val(unescape(img.attr('data-ke-name')));
+			}
+			nameBox[0].focus();
+			nameBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedAnchor().remove();
+		}
+	};
+	self.clickToolbar(name, self.plugin.anchor.edit);
+});
diff --git a/public/assets/addons/nkeditor/plugins/autoheight/autoheight.js b/public/assets/addons/nkeditor/plugins/autoheight/autoheight.js
new file mode 100644
index 0000000..6123cfa
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/autoheight/autoheight.js
@@ -0,0 +1,59 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('autoheight', function(K) {
+	var self = this;
+
+	if (!self.autoHeightMode) {
+		return;
+	}
+
+	var minHeight;
+
+	function hideScroll() {
+		var edit = self.edit;
+		var body = edit.doc.body;
+		edit.iframe[0].scroll = 'no';
+		body.style.overflowY = 'hidden';
+	}
+
+	function resetHeight() {
+		if(self.fullscreenMode){
+			return;
+		}
+		var edit = self.edit;
+		var body = edit.doc.body;
+		edit.iframe.height(minHeight);
+		self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 76, minHeight));
+	}
+
+	function init() {
+		minHeight = K.removeUnit(self.height);
+
+		self.edit.afterChange(resetHeight);
+		if(!self.fullscreenMode){
+			hideScroll();
+		}
+		resetHeight();
+	}
+
+	if (self.isCreated) {
+		init();
+	} else {
+		self.afterCreate(init);
+	}
+});
+
+/*
+* 如何实现真正的自动高度?
+* 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。
+* 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。
+* 由此就实现了真正的自动高度
+* 测试:chrome、firefox、IE9、IE8
+* */
diff --git a/public/assets/addons/nkeditor/plugins/baidumap/baidumap.js b/public/assets/addons/nkeditor/plugins/baidumap/baidumap.js
new file mode 100644
index 0000000..31ce564
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/baidumap/baidumap.js
@@ -0,0 +1,91 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5
+
+KindEditor.plugin('baidumap', function(K) {
+	var self = this, name = 'baidumap', lang = self.lang(name + '.');
+	var mapWidth = K.undef(self.mapWidth, 558);
+	var mapHeight = K.undef(self.mapHeight, 360);
+	self.clickToolbar(name, function() {
+		var html = ['<div class="ke-dialog-content-inner" style="padding-top: 0">',
+			'<div class="ke-dialog-row ke-clearfix">',
+			// right start
+			'<div class="ke-header">' + lang.address,
+			'<input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span>',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" style="line-height:22px;padding:0 10px;" />',
+			'</span>',
+			'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" style="display:inline-block;" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>',
+			'</div>',
+			'</div>',
+
+			//map iframe
+			'<div class="ke-map" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : mapWidth + 42,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var map = win.map;
+					var centerObj = map.getCenter();
+					var center = centerObj.lng + ',' + centerObj.lat;
+					var zoom = map.getZoom();
+					var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'https://api.map.baidu.com/staticimage',
+						'?center=' + encodeURIComponent(center),
+						'&zoom=' + encodeURIComponent(zoom),
+						'&width=' + mapWidth,
+						'&height=' + mapHeight,
+						'&markers=' + encodeURIComponent(center),
+						'&markerStyles=' + encodeURIComponent('l,A')].join('');
+					if (checkbox[0].checked) {
+						self.insertHtml('<iframe src="' + url + '" frameborder="0" style="width:' + (mapWidth + 2) + 'px;height:' + (mapHeight + 2) + 'px;"></iframe>');
+					} else {
+						self.exec('insertimage', url);
+					}
+					self.hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			checkbox = K('[name="insertDynamicMap"]', dialog.div),
+			win, doc;
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/baidumap/index.html b/public/assets/addons/nkeditor/plugins/baidumap/index.html
new file mode 100644
index 0000000..727d52d
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/baidumap/index.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8"/>
+    <meta name="keywords" content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/>
+    <meta name="description" content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/>
+    <title>百度地图API自定义地图</title>
+    <!--引用百度地图API-->
+    <style type="text/css">
+        html, body {
+            margin: 0;
+            padding: 0;
+        }
+
+        .iw_poi_title {
+            color: #CC5522;
+            font-size: 14px;
+            font-weight: bold;
+            overflow: hidden;
+            padding-right: 13px;
+            white-space: nowrap
+        }
+
+        .iw_poi_content {
+            font: 12px arial, sans-serif;
+            overflow: visible;
+            padding-top: 4px;
+            white-space: -moz-pre-wrap;
+            word-wrap: break-word
+        }
+    </style>
+    <script type="text/javascript" src="//api.map.baidu.com/api?key=&v=1.1&services=true"></script>
+</head>
+
+<body onload="initMap();">
+<!--百度地图容器-->
+<div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div>
+</body>
+<script type="text/javascript">
+    function getParam(name) {
+        return location.href.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? decodeURIComponent(RegExp.$1) : '';
+    }
+
+    var centerParam = getParam('center');
+    var zoomParam = getParam('zoom');
+    var widthParam = getParam('width');
+    var heightParam = getParam('height');
+    var markersParam = getParam('markers');
+    var markerStylesParam = getParam('markerStyles');
+
+    //创建和初始化地图函数:
+    function initMap() {
+        // [FF]切换模式后报错
+        if (!window.BMap) {
+            return;
+        }
+        var dituContent = document.getElementById('dituContent');
+        dituContent.style.width = widthParam + 'px';
+        dituContent.style.height = heightParam + 'px';
+
+        createMap();//创建地图
+        setMapEvent();//设置地图事件
+        addMapControl();//向地图添加控件
+
+        // 创建标注
+        var markersArr = markersParam.split(',');
+        var point = new BMap.Point(markersArr[0], markersArr[1]);
+        var marker = new BMap.Marker(point);
+        map.addOverlay(marker); // 将标注添加到地图中
+    }
+
+    //创建地图函数:
+    function createMap() {
+        var map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图
+        var centerArr = centerParam.split(',');
+        var point = new BMap.Point(centerArr[0], centerArr[1]);//定义一个中心点坐标
+        map.centerAndZoom(point, zoomParam);//设定地图的中心点和坐标并将地图显示在地图容器中
+        window.map = map;//将map变量存储在全局
+    }
+
+    //地图事件设置函数:
+    function setMapEvent() {
+        map.enableDragging();//启用地图拖拽事件,默认启用(可不写)
+        map.enableScrollWheelZoom();//启用地图滚轮放大缩小
+        map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
+        map.enableKeyboard();//启用键盘上下左右键移动地图
+    }
+
+    //地图控件添加函数:
+    function addMapControl() {
+        //向地图中添加缩放控件
+        var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE});
+        map.addControl(ctrl_nav);
+        //向地图中添加缩略图控件
+        var ctrl_ove = new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1});
+        map.addControl(ctrl_ove);
+        //向地图中添加比例尺控件
+        var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});
+        map.addControl(ctrl_sca);
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/baidumap/map.html b/public/assets/addons/nkeditor/plugins/baidumap/map.html
new file mode 100644
index 0000000..6810c15
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/baidumap/map.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="utf-8"/>
+    <title>Baidu Maps</title>
+    <style>
+        html {
+            height: 100%
+        }
+
+        body {
+            height: 100%;
+            margin: 0;
+            padding: 0;
+            background-color: #FFF
+        }
+    </style>
+    <script charset="utf-8" src="//api.map.baidu.com/api?v=1.3"></script>
+    <script>
+        var map, geocoder;
+
+        function initialize() {
+            map = new BMap.Map('map_canvas');
+            var point = new BMap.Point(114.025974, 22.546054);
+            map.centerAndZoom(point, 11);
+            map.addControl(new BMap.NavigationControl());
+            map.enableScrollWheelZoom();
+
+            var gc = new BMap.Geocoder();
+            gc.getLocation(point, function (rs) {
+                var addComp = rs.addressComponents;
+                var address = [addComp.city].join('');
+                parent.document.getElementById("kindeditor_plugin_map_address").value = address;
+            });
+        }
+
+        function search(address) {
+            if (!map) return;
+            var local = new BMap.LocalSearch(map, {
+                renderOptions: {
+                    map: map,
+                    autoViewport: true,
+                    selectFirstResult: false
+                }
+            });
+            local.search(address);
+        }
+    </script>
+</head>
+<body onload="initialize();">
+<div id="map_canvas" style="width:100%; height:100%"></div>
+</body>
+</html>
diff --git a/public/assets/addons/nkeditor/plugins/clearhtml/clearhtml.js b/public/assets/addons/nkeditor/plugins/clearhtml/clearhtml.js
new file mode 100644
index 0000000..1bf0e5d
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/clearhtml/clearhtml.js
@@ -0,0 +1,29 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('clearhtml', function(K) {
+	var self = this, name = 'clearhtml';
+	self.clickToolbar(name, function() {
+		self.focus();
+		var html = self.html();
+		html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, '');
+		html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, '');
+		html = K.formatHtml(html, {
+			a : ['href', 'target'],
+			embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
+			img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'],
+			table : ['border'],
+			'td,th' : ['rowspan', 'colspan'],
+			'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : []
+		});
+		self.html(html);
+		self.cmd.selection(true);
+		self.addBookmark();
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/code/code.js b/public/assets/addons/nkeditor/plugins/code/code.js
new file mode 100644
index 0000000..67bd09d
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/code/code.js
@@ -0,0 +1,64 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// google code prettify: http://google-code-prettify.googlecode.com/
+// http://google-code-prettify.googlecode.com/
+
+KindEditor.plugin('code', function(K) {
+	var self = this, name = 'code';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = ['<div style="margin: 0px 20px;">',
+				'<div class="ke-dialog-row">',
+				'<select class="ke-select" style="margin-bottom: 5px;">',
+				'<option value="javascript">JavaScript</option>',
+				'<option value="html">HTML</option>',
+				'<option value="css">CSS</option>',
+				'<option value="php">PHP</option>',
+				'<option value="perl">Perl</option>',
+				'<option value="python">Python</option>',
+				'<option value="ruby">Ruby</option>',
+				'<option value="java">Java</option>',
+				'<option value="go">Go</option>',
+				'<option value="asp">ASP/VB</option>',
+				'<option value="csharp">C#</option>',
+				'<option value="cpp">C/C++</option>',
+				'<option value="cs">C#</option>',
+				'<option value="bash">Shell</option>',
+				'<option value="sql">SQL</option>',
+				'<option value="markup">Other</option>',
+				'</select>',
+				'</div>',
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
+				'</div>'].join(''),
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var type = K('.ke-select', dialog.div).val(),
+							code = textarea.val(),
+							cls = type === '' ? '' :  'language-' + type,
+							html = '<pre class="' + cls + '"><code>' + K.escape(code) + '</code></pre> <br/>';
+						if (K.trim(code) === '') {
+							K.options.errorMsgHandler(lang.pleaseInput, "error");
+							textarea[0].focus();
+							return;
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/code/pretty.js b/public/assets/addons/nkeditor/plugins/code/pretty.js
new file mode 100644
index 0000000..ec84da9
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/code/pretty.js
@@ -0,0 +1,18 @@
+/**
+ * @author yangjian
+ * @since 18-9-11 下午9:02.
+ */
+
+// function _bindEvent(el, type, fn) {
+// 	if (el.addEventListener){
+// 		el.addEventListener(type, fn);
+// 	} else if (el.attachEvent){
+// 		el.attachEvent('on' + type, fn);
+// 	}
+// }
+// _bindEvent(document.body, "DOMNodeInserted", function(e) {
+// 	var className = e.target.className;
+// 	if (className && className.indexOf("language-") != -1) {
+// 		Prism.highlightElement(e.target);
+// 	}
+// })
diff --git a/public/assets/addons/nkeditor/plugins/code/prism.css b/public/assets/addons/nkeditor/plugins/code/prism.css
new file mode 100644
index 0000000..f88adbc
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/code/prism.css
@@ -0,0 +1,292 @@
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+csharp+bash+cpp+aspnet+ruby+markup-templating+go+markdown+php+python+sass+yaml&plugins=line-highlight+line-numbers+toolbar+highlight-keywords+show-language+copy-to-clipboard */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+
+code[class*="language-"],
+pre[class*="language-"] {
+	color: black;
+	background: none;
+	text-shadow: 0 1px white;
+	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+	text-align: left;
+	white-space: pre;
+	word-spacing: normal;
+	word-break: normal;
+	word-wrap: normal;
+	line-height: 1.5;
+
+	-moz-tab-size: 4;
+	-o-tab-size: 4;
+	tab-size: 4;
+
+	-webkit-hyphens: none;
+	-moz-hyphens: none;
+	-ms-hyphens: none;
+	hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
+code[class*="language-"]::selection, code[class*="language-"] ::selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+@media print {
+	code[class*="language-"],
+	pre[class*="language-"] {
+		text-shadow: none;
+	}
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+	padding: 1em;
+	margin: .5em 0;
+	overflow: auto;
+}
+
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+	background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+	padding: .1em;
+	border-radius: .3em;
+	white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+	color: slategray;
+}
+
+.token.punctuation {
+	color: #999;
+}
+
+.namespace {
+	opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+	color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+	color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+	color: #9a6e3a;
+	background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+	color: #07a;
+}
+
+.token.function,
+.token.class-name {
+	color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+	color: #e90;
+}
+
+.token.important,
+.token.bold {
+	font-weight: bold;
+}
+.token.italic {
+	font-style: italic;
+}
+
+.token.entity {
+	cursor: help;
+}
+
+pre[data-line] {
+	position: relative;
+	padding: 1em 0 1em 3em;
+}
+
+.line-highlight {
+	position: absolute;
+	left: 0;
+	right: 0;
+	padding: inherit 0;
+	margin-top: 1em; /* Same as .prism’s padding-top */
+
+	background: hsla(24, 20%, 50%,.08);
+	background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
+
+	pointer-events: none;
+
+	line-height: inherit;
+	white-space: pre;
+}
+
+	.line-highlight:before,
+	.line-highlight[data-end]:after {
+		content: attr(data-start);
+		position: absolute;
+		top: .4em;
+		left: .6em;
+		min-width: 1em;
+		padding: 0 .5em;
+		background-color: hsla(24, 20%, 50%,.4);
+		color: hsl(24, 20%, 95%);
+		font: bold 65%/1.5 sans-serif;
+		text-align: center;
+		vertical-align: .3em;
+		border-radius: 999px;
+		text-shadow: none;
+		box-shadow: 0 1px white;
+	}
+
+	.line-highlight[data-end]:after {
+		content: attr(data-end);
+		top: auto;
+		bottom: .4em;
+	}
+
+.line-numbers .line-highlight:before,
+.line-numbers .line-highlight:after {
+	content: none;
+}
+
+pre[class*="language-"].line-numbers {
+	position: relative;
+	padding-left: 3.8em;
+	counter-reset: linenumber;
+}
+
+pre[class*="language-"].line-numbers > code {
+	position: relative;
+	white-space: inherit;
+}
+
+.line-numbers .line-numbers-rows {
+	position: absolute;
+	pointer-events: none;
+	top: 0;
+	font-size: 100%;
+	left: -3.8em;
+	width: 3em; /* works for line-numbers below 1000 lines */
+	letter-spacing: -1px;
+	border-right: 1px solid #999;
+
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+
+}
+
+	.line-numbers-rows > span {
+		pointer-events: none;
+		display: block;
+		counter-increment: linenumber;
+	}
+
+		.line-numbers-rows > span:before {
+			content: counter(linenumber);
+			color: #999;
+			display: block;
+			padding-right: 0.8em;
+			text-align: right;
+		}
+
+div.code-toolbar {
+	position: relative;
+}
+
+div.code-toolbar > .toolbar {
+	position: absolute;
+	top: .3em;
+	right: .2em;
+	transition: opacity 0.3s ease-in-out;
+	opacity: 0;
+}
+
+div.code-toolbar:hover > .toolbar {
+	opacity: 1;
+}
+
+div.code-toolbar > .toolbar .toolbar-item {
+	display: inline-block;
+}
+
+div.code-toolbar > .toolbar a {
+	cursor: pointer;
+}
+
+div.code-toolbar > .toolbar button {
+	background: none;
+	border: 0;
+	color: inherit;
+	font: inherit;
+	line-height: normal;
+	overflow: visible;
+	padding: 0;
+	-webkit-user-select: none; /* for button */
+	-moz-user-select: none;
+	-ms-user-select: none;
+}
+
+div.code-toolbar > .toolbar a,
+div.code-toolbar > .toolbar button,
+div.code-toolbar > .toolbar span {
+	color: #bbb;
+	font-size: .8em;
+	padding: 0 .5em;
+	background: #f5f2f0;
+	background: rgba(224, 224, 224, 0.2);
+	box-shadow: 0 2px 0 0 rgba(0,0,0,0.2);
+	border-radius: .5em;
+}
+
+div.code-toolbar > .toolbar a:hover,
+div.code-toolbar > .toolbar a:focus,
+div.code-toolbar > .toolbar button:hover,
+div.code-toolbar > .toolbar button:focus,
+div.code-toolbar > .toolbar span:hover,
+div.code-toolbar > .toolbar span:focus {
+	color: inherit;
+	text-decoration: none;
+}
+
diff --git a/public/assets/addons/nkeditor/plugins/code/prism.js b/public/assets/addons/nkeditor/plugins/code/prism.js
new file mode 100644
index 0000000..0f748e7
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/code/prism.js
@@ -0,0 +1,26 @@
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+csharp+bash+cpp+aspnet+ruby+markup-templating+go+markdown+php+python+sass+yaml&plugins=line-highlight+line-numbers+toolbar+highlight-keywords+show-language+copy-to-clipboard */
+var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof r?new r(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function(e,t){var r=n.util.type(e);switch(t=t||{},r){case"Object":if(t[n.util.objId(e)])return t[n.util.objId(e)];var a={};t[n.util.objId(e)]=a;for(var l in e)e.hasOwnProperty(l)&&(a[l]=n.util.clone(e[l],t));return a;case"Array":if(t[n.util.objId(e)])return t[n.util.objId(e)];var a=[];return t[n.util.objId(e)]=a,e.forEach(function(e,r){a[r]=n.util.clone(e,t)}),a}return e}},languages:{extend:function(e,t){var r=n.util.clone(n.languages[e]);for(var a in t)r[a]=t[a];return r},insertBefore:function(e,t,r,a){a=a||n.languages;var l=a[e];if(2==arguments.length){r=arguments[1];for(var i in r)r.hasOwnProperty(i)&&(l[i]=r[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in r)r.hasOwnProperty(i)&&(o[i]=r[i]);o[s]=l[s]}var u=a[e];return a[e]=o,n.languages.DFS(n.languages,function(t,n){n===u&&t!=e&&(this[t]=o)}),o},DFS:function(e,t,r,a){a=a||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],r||l),"Object"!==n.util.type(e[l])||a[n.util.objId(e[l])]?"Array"!==n.util.type(e[l])||a[n.util.objId(e[l])]||(a[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,a)):(a[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,a)))}},plugins:{},highlightAll:function(e,t){n.highlightAllUnder(document,e,t)},highlightAllUnder:function(e,t,r){var a={callback:r,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",a);for(var l,i=a.elements||e.querySelectorAll(a.selector),o=0;l=i[o++];)n.highlightElement(l,t===!0,a.callback)},highlightElement:function(t,r,a){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,""])[1].toLowerCase(),i=n.languages[l]),t.className=t.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,t.parentNode&&(o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+l));var s=t.textContent,u={element:t,language:l,grammar:i,code:s};if(n.hooks.run("before-sanity-check",u),!u.code||!u.grammar)return u.code&&(n.hooks.run("before-highlight",u),u.element.textContent=u.code,n.hooks.run("after-highlight",u)),n.hooks.run("complete",u),void 0;if(n.hooks.run("before-highlight",u),r&&_self.Worker){var g=new Worker(n.filename);g.onmessage=function(e){u.highlightedCode=e.data,n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,a&&a.call(u.element),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},g.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=n.highlight(u.code,u.grammar,u.language),n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,a&&a.call(t),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},highlight:function(e,t,a){var l={code:e,grammar:t,language:a};return n.hooks.run("before-tokenize",l),l.tokens=n.tokenize(l.code,l.grammar),n.hooks.run("after-tokenize",l),r.stringify(n.util.encode(l.tokens),l.language)},matchGrammar:function(e,t,r,a,l,i,o){var s=n.Token;for(var u in r)if(r.hasOwnProperty(u)&&r[u]){if(u==o)return;var g=r[u];g="Array"===n.util.type(g)?g:[g];for(var c=0;c<g.length;++c){var h=g[c],f=h.inside,d=!!h.lookbehind,m=!!h.greedy,p=0,y=h.alias;if(m&&!h.pattern.global){var v=h.pattern.toString().match(/[imuy]*$/)[0];h.pattern=RegExp(h.pattern.source,v+"g")}h=h.pattern||h;for(var b=a,k=l;b<t.length;k+=t[b].length,++b){var w=t[b];if(t.length>e.length)return;if(!(w instanceof s)){if(m&&b!=t.length-1){h.lastIndex=k;var _=h.exec(e);if(!_)break;for(var j=_.index+(d?_[1].length:0),P=_.index+_[0].length,A=b,x=k,O=t.length;O>A&&(P>x||!t[A].type&&!t[A-1].greedy);++A)x+=t[A].length,j>=x&&(++b,k=x);if(t[b]instanceof s)continue;I=A-b,w=e.slice(k,x),_.index-=k}else{h.lastIndex=0;var _=h.exec(w),I=1}if(_){d&&(p=_[1]?_[1].length:0);var j=_.index+p,_=_[0].slice(p),P=j+_.length,N=w.slice(0,j),S=w.slice(P),C=[b,I];N&&(++b,k+=N.length,C.push(N));var E=new s(u,f?n.tokenize(_,f):_,y,_,m);if(C.push(E),S&&C.push(S),Array.prototype.splice.apply(t,C),1!=I&&n.matchGrammar(e,t,r,b,k,!0,u),i)break}else if(i)break}}}}},tokenize:function(e,t){var r=[e],a=t.rest;if(a){for(var l in a)t[l]=a[l];delete t.rest}return n.matchGrammar(e,r,t,0,0,!1),r},hooks:{all:{},add:function(e,t){var r=n.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=n.hooks.all[e];if(r&&r.length)for(var a,l=0;a=r[l++];)a(t)}}},r=n.Token=function(e,t,n,r,a){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length,this.greedy=!!a};if(r.stringify=function(e,t,a){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return r.stringify(n,t,e)}).join("");var l={type:e.type,content:r.stringify(e.content,t,a),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:a};if(e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,"&quot;")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+"</"+l.tag+">"},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),r=t.language,a=t.code,l=t.immediateClose;_self.postMessage(n.highlight(a,n.languages[r],r)),l&&_self.close()},!1),_self.Prism):_self.Prism;var a=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return a&&(n.filename=a.src,n.manual||a.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
+Prism.languages.markup={comment:/<!--[\s\S]*?-->/,prolog:/<\?[\s\S]+?\?>/,doctype:/<!DOCTYPE[\s\S]+?>/i,cdata:/<!\[CDATA\[[\s\S]*?]]>/i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;
+Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.languages.css,Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));
+Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/};
+Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},/\b(?:as|async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/],number:/\b(?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,"function":/[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\(|\.(?:apply|bind|call)\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^\/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<script[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript;
+Prism.languages.c=Prism.languages.extend("clike",{keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*\/%&|^!=<>]=?/,number:/(?:\b0x[\da-f]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["class-name"],delete Prism.languages.c["boolean"];
+Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.csharp;
+!function(e){var t={variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\([^)]+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},/\$(?:[\w#?*!@]+|\{[^}]+\})/i]};e.languages.bash={shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"},comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\s*)["']?(\w+?)["']?\s*\r?\n(?:[\s\S])*?\r?\n\2/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:t}],variable:t.variable,"function":{pattern:/(^|[\s;|&])(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|npm|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|[\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&])(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|[\s;|&])/,lookbehind:!0},"boolean":{pattern:/(^|[\s;|&])(?:true|false)(?=$|[\s;|&])/,lookbehind:!0},operator:/&&?|\|\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];]/};var a=t.variable[1].inside;a.string=e.languages.bash.string,a["function"]=e.languages.bash["function"],a.keyword=e.languages.bash.keyword,a["boolean"]=e.languages.bash["boolean"],a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation,e.languages.shell=e.languages.bash}(Prism);
+Prism.languages.cpp=Prism.languages.extend("c",{keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(?:true|false)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*\/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),Prism.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)\w+/i,lookbehind:!0}}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}});
+Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive tag":{pattern:/<%\s*@.*%>/i,inside:{"page-directive tag":/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,rest:Prism.languages.markup.tag.inside}},"directive tag":{pattern:/<%.*%>/i,inside:{"directive tag":/<%\s*?[$=%#:]{0,2}|%>/i,rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("inside","punctuation",{"directive tag":Prism.languages.aspnet["directive tag"]},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp comment":/<%--[\s\S]*?--%>/}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp script":{pattern:/(<script(?=.*runat=['"]?server['"]?)[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.csharp||{}}});
+!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin(?:\r?\n|\r)(?:.*(?:\r?\n|\r))*?=end/m,greedy:!0}],keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}]}(Prism);
+Prism.languages["markup-templating"]={},Object.defineProperties(Prism.languages["markup-templating"],{buildPlaceholders:{value:function(e,t,n,a){e.language===t&&(e.tokenStack=[],e.code=e.code.replace(n,function(n){if("function"==typeof a&&!a(n))return n;for(var r=e.tokenStack.length;-1!==e.code.indexOf("___"+t.toUpperCase()+r+"___");)++r;return e.tokenStack[r]=n,"___"+t.toUpperCase()+r+"___"}),e.grammar=Prism.languages.markup)}},tokenizePlaceholders:{value:function(e,t){if(e.language===t&&e.tokenStack){e.grammar=Prism.languages[t];var n=0,a=Object.keys(e.tokenStack),r=function(o){if(!(n>=a.length))for(var i=0;i<o.length;i++){var g=o[i];if("string"==typeof g||g.content&&"string"==typeof g.content){var c=a[n],s=e.tokenStack[c],l="string"==typeof g?g:g.content,p=l.indexOf("___"+t.toUpperCase()+c+"___");if(p>-1){++n;var f,u=l.substring(0,p),_=new Prism.Token(t,Prism.tokenize(s,e.grammar,t),"language-"+t,s),k=l.substring(p+("___"+t.toUpperCase()+c+"___").length);if(u||k?(f=[u,_,k].filter(function(e){return!!e}),r(f)):f=_,"string"==typeof g?Array.prototype.splice.apply(o,[i,1].concat(f)):g.content=f,n>=a.length)break}}else g.content&&"string"!=typeof g.content&&r(g.content)}};r(e.tokens)}}}});
+Prism.languages.go=Prism.languages.extend("clike",{keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,"boolean":/\b(?:_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete Prism.languages.go["class-name"];
+Prism.languages.markdown=Prism.languages.extend("markup",{}),Prism.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},code:[{pattern:/^(?: {4}|\t).+/m,alias:"keyword"},{pattern:/``.+?``|`[^`\n]+`/,alias:"keyword"}],title:[{pattern:/\w+.*(?:\r?\n|\r)(?:==+|--+)/,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:/(^|[^\\])(\*\*|__)(?:(?:\r?\n|\r)(?!\r?\n|\r)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^\*\*|^__|\*\*$|__$/}},italic:{pattern:/(^|[^\\])([*_])(?:(?:\r?\n|\r)(?!\r?\n|\r)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^[*_]|[*_]$/}},url:{pattern:/!?\[[^\]]+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)| ?\[[^\]\n]*\])/,inside:{variable:{pattern:/(!?\[)[^\]]+(?=\]$)/,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),Prism.languages.markdown.bold.inside.url=Prism.languages.markdown.url,Prism.languages.markdown.italic.inside.url=Prism.languages.markdown.url,Prism.languages.markdown.bold.inside.italic=Prism.languages.markdown.italic,Prism.languages.markdown.italic.inside.bold=Prism.languages.markdown.bold;
+!function(e){e.languages.php=e.languages.extend("clike",{keyword:/\b(?:and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),e.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),e.languages.insertBefore("php","keyword",{delimiter:{pattern:/\?>|<\?(?:php|=)?/i,alias:"important"},variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),e.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var n={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:{rest:e.languages.php}};e.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:n}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:n}}}),delete e.languages.php.string,e.hooks.add("before-tokenize",function(n){if(/(?:<\?php|<\?)/gi.test(n.code)){var t=/(?:<\?php|<\?)[\s\S]*?(?:\?>|$)/gi;e.languages["markup-templating"].buildPlaceholders(n,"php",t)}}),e.hooks.add("after-tokenize",function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"php")})}(Prism);
+Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"triple-quoted-string":{pattern:/("""|''')[\s\S]+?\1/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/};
+!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t]+.+)*/m,lookbehind:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var a=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s+)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,inside:{punctuation:/:/,variable:a,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s]+.*)/m,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:a,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,delete e.languages.sass.selector,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/([ \t]*)\S(?:,?[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,?[^,\r\n]+)*)*/,lookbehind:!0}})}(Prism);
+Prism.languages.yaml={scalar:{pattern:/([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:/(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,alias:"number"},"boolean":{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},"null":{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,greedy:!0},number:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./};
+!function(){function e(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function t(e,t){return t=" "+t+" ",(" "+e.className+" ").replace(/[\n\t]/g," ").indexOf(t)>-1}function n(e,n,i){n="string"==typeof n?n:e.getAttribute("data-line");for(var o,l=n.replace(/\s+/g,"").split(","),a=+e.getAttribute("data-line-offset")||0,s=r()?parseInt:parseFloat,d=s(getComputedStyle(e).lineHeight),u=t(e,"line-numbers"),c=0;o=l[c++];){var p=o.split("-"),m=+p[0],f=+p[1]||m,h=e.querySelector('.line-highlight[data-range="'+o+'"]')||document.createElement("div");if(h.setAttribute("aria-hidden","true"),h.setAttribute("data-range",o),h.className=(i||"")+" line-highlight",u&&Prism.plugins.lineNumbers){var g=Prism.plugins.lineNumbers.getLine(e,m),y=Prism.plugins.lineNumbers.getLine(e,f);g&&(h.style.top=g.offsetTop+"px"),y&&(h.style.height=y.offsetTop-g.offsetTop+y.offsetHeight+"px")}else h.setAttribute("data-start",m),f>m&&h.setAttribute("data-end",f),h.style.top=(m-a-1)*d+"px",h.textContent=new Array(f-m+2).join(" \n");u?e.appendChild(h):(e.querySelector("code")||e).appendChild(h)}}function i(){var t=location.hash.slice(1);e(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var i=(t.match(/\.([\d,-]+)$/)||[,""])[1];if(i&&!document.getElementById(t)){var r=t.slice(0,t.lastIndexOf(".")),o=document.getElementById(r);o&&(o.hasAttribute("data-line")||o.setAttribute("data-line",""),n(o,i,"temporary "),document.querySelector(".temporary.line-highlight").scrollIntoView())}}if("undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector){var r=function(){var e;return function(){if("undefined"==typeof e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding=0,t.style.border=0,t.innerHTML="&nbsp;<br />&nbsp;",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}}(),o=0;Prism.hooks.add("before-sanity-check",function(t){var n=t.element.parentNode,i=n&&n.getAttribute("data-line");if(n&&i&&/pre/i.test(n.nodeName)){var r=0;e(".line-highlight",n).forEach(function(e){r+=e.textContent.length,e.parentNode.removeChild(e)}),r&&/^( \n)+$/.test(t.code.slice(-r))&&(t.code=t.code.slice(0,-r))}}),Prism.hooks.add("complete",function l(e){var r=e.element.parentNode,a=r&&r.getAttribute("data-line");if(r&&a&&/pre/i.test(r.nodeName)){clearTimeout(o);var s=Prism.plugins.lineNumbers,d=e.plugins&&e.plugins.lineNumbers;t(r,"line-numbers")&&s&&!d?Prism.hooks.add("line-numbers",l):(n(r,a),o=setTimeout(i,1))}}),window.addEventListener("hashchange",i),window.addEventListener("resize",function(){var e=document.querySelectorAll("pre[data-line]");Array.prototype.forEach.call(e,function(e){n(e)})})}}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e="line-numbers",t=/\n(?!$)/g,n=function(e){var n=r(e),s=n["white-space"];if("pre-wrap"===s||"pre-line"===s){var l=e.querySelector("code"),i=e.querySelector(".line-numbers-rows"),a=e.querySelector(".line-numbers-sizer"),o=l.textContent.split(t);a||(a=document.createElement("span"),a.className="line-numbers-sizer",l.appendChild(a)),a.style.display="block",o.forEach(function(e,t){a.textContent=e||"\n";var n=a.getBoundingClientRect().height;i.children[t].style.height=n+"px"}),a.textContent="",a.style.display="none"}},r=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null};window.addEventListener("resize",function(){Array.prototype.forEach.call(document.querySelectorAll("pre."+e),n)}),Prism.hooks.add("complete",function(e){if(e.code){var r=e.element.parentNode,s=/\s*\bline-numbers\b\s*/;if(r&&/pre/i.test(r.nodeName)&&(s.test(r.className)||s.test(e.element.className))&&!e.element.querySelector(".line-numbers-rows")){s.test(e.element.className)&&(e.element.className=e.element.className.replace(s," ")),s.test(r.className)||(r.className+=" line-numbers");var l,i=e.code.match(t),a=i?i.length+1:1,o=new Array(a+1);o=o.join("<span></span>"),l=document.createElement("span"),l.setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=o,r.hasAttribute("data-start")&&(r.style.counterReset="linenumber "+(parseInt(r.getAttribute("data-start"),10)-1)),e.element.appendChild(l),n(r),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}),Prism.plugins.lineNumbers={getLine:function(t,n){if("PRE"===t.tagName&&t.classList.contains(e)){var r=t.querySelector(".line-numbers-rows"),s=parseInt(t.getAttribute("data-start"),10)||1,l=s+(r.children.length-1);s>n&&(n=s),n>l&&(n=l);var i=n-s;return r.children[i]}}}}}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var t=[],e={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var o;o="function"==typeof a?a:function(t){var e;return"function"==typeof a.onClick?(e=document.createElement("button"),e.type="button",e.addEventListener("click",function(){a.onClick.call(this,t)})):"string"==typeof a.url?(e=document.createElement("a"),e.href=a.url):e=document.createElement("span"),e.textContent=a.text,e},t.push(e[n]=o)},o=Prism.plugins.toolbar.hook=function(a){var o=a.element.parentNode;if(o&&/pre/i.test(o.nodeName)&&!o.parentNode.classList.contains("code-toolbar")){var r=document.createElement("div");r.classList.add("code-toolbar"),o.parentNode.insertBefore(r,o),r.appendChild(o);var i=document.createElement("div");i.classList.add("toolbar"),document.body.hasAttribute("data-toolbar-order")&&(t=document.body.getAttribute("data-toolbar-order").split(",").map(function(t){return e[t]||n})),t.forEach(function(t){var e=t(a);if(e){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(e),i.appendChild(n)}}),r.appendChild(i)}};a("label",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-label")){var n,a,o=e.getAttribute("data-label");try{a=document.querySelector("template#"+o)}catch(r){}return a?n=a.content:(e.hasAttribute("data-url")?(n=document.createElement("a"),n.href=e.getAttribute("data-url")):n=document.createElement("span"),n.textContent=o),n}}),Prism.hooks.add("complete",o)}}();
+!function(){"undefined"!=typeof self&&!self.Prism||"undefined"!=typeof global&&!global.Prism||Prism.hooks.add("wrap",function(e){"keyword"===e.type&&e.classes.push("keyword-"+e.content)})}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Show Languages plugin loaded before Toolbar plugin."),void 0;var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",arff:"ARFF",asciidoc:"AsciiDoc",asm6502:"6502 Assembly",aspnet:"ASP.NET (C#)",autohotkey:"AutoHotkey",autoit:"AutoIt",shell:"Shell",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript",csp:"Content-Security-Policy","css-extras":"CSS Extras",django:"Django/Jinja2",erb:"ERB",fsharp:"F#",gedcom:"GEDCOM",glsl:"GLSL",graphql:"GraphQL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam",inform7:"Inform 7",json:"JSON",jsonp:"JSONP",latex:"LaTeX",livescript:"LiveScript",lolcode:"LOLCODE","markup-templating":"Markup templating",matlab:"MATLAB",mel:"MEL",n4js:"N4JS",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",parigp:"PARI/GP",objectpascal:"Object Pascal",php:"PHP","php-extras":"PHP Extras",plsql:"PL/SQL",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",q:"Q (kdb+ database)",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",soy:"Soy (Closure Template)",tap:"TAP",tt2:"Template Toolkit 2",typescript:"TypeScript",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",wasm:"WebAssembly",wiki:"Wiki markup",xeoracube:"XeoraCube",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var s=t.getAttribute("data-language")||e[a.language]||a.language&&a.language.substring(0,1).toUpperCase()+a.language.substring(1);if(s){var i=document.createElement("span");return i.textContent=s,i}}})}}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."),void 0;var o=window.ClipboardJS||void 0;o||"function"!=typeof require||(o=require("clipboard"));var e=[];if(!o){var t=document.createElement("script"),n=document.querySelector("head");t.onload=function(){if(o=window.ClipboardJS)for(;e.length;)e.pop()()},t.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",n.appendChild(t)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(t){function n(){var e=new o(i,{text:function(){return t.code}});e.on("success",function(){i.textContent="Copied!",r()}),e.on("error",function(){i.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){i.textContent="Copy"},5e3)}var i=document.createElement("a");return i.textContent="Copy",o?n():e.push(n),i})}}();
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/emoticons.js b/public/assets/addons/nkeditor/plugins/emoticons/emoticons.js
new file mode 100644
index 0000000..a990066
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/emoticons/emoticons.js
@@ -0,0 +1,129 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('emoticons', function(K) {
+	var self = this, name = 'emoticons',
+		path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'),
+		allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons,
+		currentPageNum = 1;
+	self.clickToolbar(name, function() {
+		var rows = 5, cols = 9, total = 135, startNum = 0,
+			cells = rows * cols, pages = Math.ceil(total / cells),
+			colsHalf = Math.floor(cols / 2),
+			wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'),
+			elements = [],
+			menu = self.createMenu({
+				name : name,
+				beforeRemove : function() {
+					removeEvent();
+				}
+			});
+		menu.div.append(wrapperDiv);
+		var previewDiv, previewImg;
+		if (allowPreview) {
+			previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
+			previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />');
+			wrapperDiv.append(previewDiv);
+			previewDiv.append(previewImg);
+		}
+		function bindCellEvent(cell, j, num) {
+			if (previewDiv) {
+				cell.mouseover(function() {
+					if (j > colsHalf) {
+						previewDiv.css('left', 0);
+						previewDiv.css('right', '');
+					} else {
+						previewDiv.css('left', '');
+						previewDiv.css('right', 0);
+					}
+					previewImg.attr('src', path + num + '.gif');
+					K(this).addClass('ke-on');
+				});
+			} else {
+				cell.mouseover(function() {
+					K(this).addClass('ke-on');
+				});
+			}
+			cell.mouseout(function() {
+				K(this).removeClass('ke-on');
+			});
+			cell.click(function(e) {
+				self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus();
+				e.stop();
+			});
+		}
+		function createEmoticonsTable(pageNum, parentDiv) {
+			var table = document.createElement('table');
+			parentDiv.append(table);
+			if (previewDiv) {
+				K(table).mouseover(function() {
+					previewDiv.show('block');
+				});
+				K(table).mouseout(function() {
+					previewDiv.hide();
+				});
+				elements.push(K(table));
+			}
+			table.className = 'ke-table';
+			table.cellPadding = 0;
+			table.cellSpacing = 0;
+			table.border = 0;
+			var num = (pageNum - 1) * cells + startNum;
+			for (var i = 0; i < rows; i++) {
+				var row = table.insertRow(i);
+				for (var j = 0; j < cols; j++) {
+					var cell = K(row.insertCell(j));
+					cell.addClass('ke-cell');
+					bindCellEvent(cell, j, num);
+					var span = K('<span class="ke-img"></span>')
+						.css('background-position', '-' + (24 * num) + 'px 0px')
+						.css('background-image', 'url(' + path + 'static.gif)');
+					cell.append(span);
+					elements.push(cell);
+					num++;
+				}
+			}
+			return table;
+		}
+		var table = createEmoticonsTable(currentPageNum, wrapperDiv);
+		function removeEvent() {
+			K.each(elements, function() {
+				this.unbind();
+			});
+		}
+		var pageDiv;
+		function bindPageEvent(el, pageNum) {
+			el.click(function(e) {
+				removeEvent();
+				table.parentNode.removeChild(table);
+				pageDiv.remove();
+				table = createEmoticonsTable(pageNum, wrapperDiv);
+				createPageTable(pageNum);
+				currentPageNum = pageNum;
+				e.stop();
+			});
+		}
+		function createPageTable(currentPageNum) {
+			pageDiv = K('<div class="ke-page"></div>');
+			wrapperDiv.append(pageDiv);
+			for (var pageNum = 1; pageNum <= pages; pageNum++) {
+				if (currentPageNum !== pageNum) {
+					var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
+					bindPageEvent(a, pageNum);
+					pageDiv.append(a);
+					elements.push(a);
+				} else {
+					pageDiv.append(K('@[' + pageNum + ']'));
+				}
+				pageDiv.append(K('@&nbsp;'));
+			}
+		}
+		createPageTable(currentPageNum);
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/0.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/0.gif
new file mode 100644
index 0000000..5be27cb
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/0.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/1.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/1.gif
new file mode 100644
index 0000000..a2644a9
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/1.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/10.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/10.gif
new file mode 100644
index 0000000..905c15b
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/10.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/100.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/100.gif
new file mode 100644
index 0000000..92ad35d
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/100.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/101.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/101.gif
new file mode 100644
index 0000000..1f27663
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/101.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/102.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/102.gif
new file mode 100644
index 0000000..748ded1
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/102.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/103.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/103.gif
new file mode 100644
index 0000000..be9eaa0
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/103.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/104.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/104.gif
new file mode 100644
index 0000000..d7c2066
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/104.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/105.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/105.gif
new file mode 100644
index 0000000..2f353ca
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/105.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/106.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/106.gif
new file mode 100644
index 0000000..5193534
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/106.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/107.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/107.gif
new file mode 100644
index 0000000..70d38d3
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/107.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/108.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/108.gif
new file mode 100644
index 0000000..749d500
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/108.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/109.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/109.gif
new file mode 100644
index 0000000..6f57d56
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/109.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/11.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/11.gif
new file mode 100644
index 0000000..b512dd5
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/11.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/110.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/110.gif
new file mode 100644
index 0000000..e253abc
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/110.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/111.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/111.gif
new file mode 100644
index 0000000..0c56723
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/111.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/112.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/112.gif
new file mode 100644
index 0000000..c8ddce8
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/112.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/113.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/113.gif
new file mode 100644
index 0000000..2727104
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/113.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/114.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/114.gif
new file mode 100644
index 0000000..53918e2
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/114.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/115.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/115.gif
new file mode 100644
index 0000000..4db3369
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/115.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/116.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/116.gif
new file mode 100644
index 0000000..57326bd
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/116.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/117.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/117.gif
new file mode 100644
index 0000000..14611b6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/117.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/118.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/118.gif
new file mode 100644
index 0000000..8c25500
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/118.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/119.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/119.gif
new file mode 100644
index 0000000..65bb468
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/119.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/12.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/12.gif
new file mode 100644
index 0000000..547529c
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/12.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/120.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/120.gif
new file mode 100644
index 0000000..5ce77c0
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/120.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/121.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/121.gif
new file mode 100644
index 0000000..a021aba
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/121.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/122.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/122.gif
new file mode 100644
index 0000000..9a79e11
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/122.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/123.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/123.gif
new file mode 100644
index 0000000..b9480be
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/123.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/124.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/124.gif
new file mode 100644
index 0000000..7fed477
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/124.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/125.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/125.gif
new file mode 100644
index 0000000..e2c3c11
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/125.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/126.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/126.gif
new file mode 100644
index 0000000..24105c9
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/126.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/127.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/127.gif
new file mode 100644
index 0000000..0cead36
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/127.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/128.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/128.gif
new file mode 100644
index 0000000..3185861
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/128.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/129.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/129.gif
new file mode 100644
index 0000000..ffd7c6b
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/129.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/13.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/13.gif
new file mode 100644
index 0000000..3475300
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/13.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/130.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/130.gif
new file mode 100644
index 0000000..d828e3d
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/130.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/131.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/131.gif
new file mode 100644
index 0000000..dcb096f
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/131.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/132.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/132.gif
new file mode 100644
index 0000000..1b272a6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/132.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/133.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/133.gif
new file mode 100644
index 0000000..0d0e864
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/133.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/134.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/134.gif
new file mode 100644
index 0000000..cf48356
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/134.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/14.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/14.gif
new file mode 100644
index 0000000..6a788f8
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/14.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/15.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/15.gif
new file mode 100644
index 0000000..debab8e
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/15.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/16.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/16.gif
new file mode 100644
index 0000000..ed5d29f
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/16.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/17.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/17.gif
new file mode 100644
index 0000000..85886fe
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/17.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/18.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/18.gif
new file mode 100644
index 0000000..b6af218
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/18.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/19.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/19.gif
new file mode 100644
index 0000000..e045ff2
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/19.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/2.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/2.gif
new file mode 100644
index 0000000..40cfda4
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/2.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/20.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/20.gif
new file mode 100644
index 0000000..efd650f
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/20.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/21.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/21.gif
new file mode 100644
index 0000000..cb8cf6d
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/21.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/22.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/22.gif
new file mode 100644
index 0000000..96b04df
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/22.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/23.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/23.gif
new file mode 100644
index 0000000..96516b8
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/23.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/24.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/24.gif
new file mode 100644
index 0000000..5f925c7
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/24.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/25.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/25.gif
new file mode 100644
index 0000000..97f8b1a
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/25.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/26.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/26.gif
new file mode 100644
index 0000000..a7cded7
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/26.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/27.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/27.gif
new file mode 100644
index 0000000..bb46890
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/27.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/28.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/28.gif
new file mode 100644
index 0000000..f59dd58
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/28.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/29.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/29.gif
new file mode 100644
index 0000000..3c5227e
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/29.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/3.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/3.gif
new file mode 100644
index 0000000..6d6f762
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/3.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/30.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/30.gif
new file mode 100644
index 0000000..e24a180
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/30.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/31.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/31.gif
new file mode 100644
index 0000000..073e743
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/31.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/32.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/32.gif
new file mode 100644
index 0000000..772eff2
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/32.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/33.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/33.gif
new file mode 100644
index 0000000..217c1c5
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/33.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/34.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/34.gif
new file mode 100644
index 0000000..e9d4213
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/34.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/35.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/35.gif
new file mode 100644
index 0000000..d6da2c3
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/35.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/36.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/36.gif
new file mode 100644
index 0000000..c1e6ac9
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/36.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/37.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/37.gif
new file mode 100644
index 0000000..92efec6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/37.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/38.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/38.gif
new file mode 100644
index 0000000..489f0f9
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/38.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/39.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/39.gif
new file mode 100644
index 0000000..734f6d8
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/39.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/4.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/4.gif
new file mode 100644
index 0000000..6ccdaa2
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/4.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/40.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/40.gif
new file mode 100644
index 0000000..24a8eb6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/40.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/41.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/41.gif
new file mode 100644
index 0000000..99139e1
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/41.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/42.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/42.gif
new file mode 100644
index 0000000..f60897e
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/42.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/43.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/43.gif
new file mode 100644
index 0000000..4350491
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/43.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/44.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/44.gif
new file mode 100644
index 0000000..650d3dd
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/44.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/45.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/45.gif
new file mode 100644
index 0000000..5c8e071
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/45.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/46.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/46.gif
new file mode 100644
index 0000000..f3cb074
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/46.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/47.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/47.gif
new file mode 100644
index 0000000..5b3057a
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/47.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/48.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/48.gif
new file mode 100644
index 0000000..27a30c1
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/48.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/49.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/49.gif
new file mode 100644
index 0000000..dcfa48a
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/49.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/5.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/5.gif
new file mode 100644
index 0000000..ab0b81b
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/5.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/50.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/50.gif
new file mode 100644
index 0000000..029cf0f
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/50.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/51.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/51.gif
new file mode 100644
index 0000000..69f183f
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/51.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/52.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/52.gif
new file mode 100644
index 0000000..d41e8aa
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/52.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/53.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/53.gif
new file mode 100644
index 0000000..56352dd
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/53.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/54.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/54.gif
new file mode 100644
index 0000000..b28d848
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/54.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/55.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/55.gif
new file mode 100644
index 0000000..e18da84
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/55.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/56.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/56.gif
new file mode 100644
index 0000000..edf96f0
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/56.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/57.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/57.gif
new file mode 100644
index 0000000..3f0e2b9
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/57.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/58.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/58.gif
new file mode 100644
index 0000000..47b1aaa
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/58.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/59.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/59.gif
new file mode 100644
index 0000000..918288b
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/59.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/6.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/6.gif
new file mode 100644
index 0000000..ceab122
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/6.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/60.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/60.gif
new file mode 100644
index 0000000..66d2113
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/60.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/61.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/61.gif
new file mode 100644
index 0000000..034933e
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/61.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/62.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/62.gif
new file mode 100644
index 0000000..8d5c4fd
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/62.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/63.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/63.gif
new file mode 100644
index 0000000..d58fcf6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/63.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/64.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/64.gif
new file mode 100644
index 0000000..c4e00bd
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/64.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/65.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/65.gif
new file mode 100644
index 0000000..da23bfa
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/65.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/66.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/66.gif
new file mode 100644
index 0000000..310ec65
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/66.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/67.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/67.gif
new file mode 100644
index 0000000..51761ba
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/67.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/68.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/68.gif
new file mode 100644
index 0000000..345cb43
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/68.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/69.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/69.gif
new file mode 100644
index 0000000..e0f28a0
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/69.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/7.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/7.gif
new file mode 100644
index 0000000..2f45399
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/7.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/70.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/70.gif
new file mode 100644
index 0000000..24284cf
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/70.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/71.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/71.gif
new file mode 100644
index 0000000..a0ccf2e
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/71.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/72.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/72.gif
new file mode 100644
index 0000000..7e113ee
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/72.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/73.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/73.gif
new file mode 100644
index 0000000..c0293c3
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/73.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/74.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/74.gif
new file mode 100644
index 0000000..1c52bde
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/74.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/75.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/75.gif
new file mode 100644
index 0000000..9cb9aa7
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/75.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/76.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/76.gif
new file mode 100644
index 0000000..27019f8
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/76.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/77.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/77.gif
new file mode 100644
index 0000000..8f882f5
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/77.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/78.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/78.gif
new file mode 100644
index 0000000..d0d0856
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/78.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/79.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/79.gif
new file mode 100644
index 0000000..61652a7
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/79.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/8.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/8.gif
new file mode 100644
index 0000000..f6c8834
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/8.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/80.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/80.gif
new file mode 100644
index 0000000..9a77936
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/80.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/81.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/81.gif
new file mode 100644
index 0000000..2329101
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/81.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/82.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/82.gif
new file mode 100644
index 0000000..644748a
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/82.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/83.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/83.gif
new file mode 100644
index 0000000..fbf275b
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/83.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/84.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/84.gif
new file mode 100644
index 0000000..076f0c6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/84.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/85.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/85.gif
new file mode 100644
index 0000000..d254af4
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/85.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/86.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/86.gif
new file mode 100644
index 0000000..8f09d33
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/86.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/87.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/87.gif
new file mode 100644
index 0000000..df70756
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/87.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/88.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/88.gif
new file mode 100644
index 0000000..4d8b15e
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/88.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/89.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/89.gif
new file mode 100644
index 0000000..05726dc
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/89.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/9.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/9.gif
new file mode 100644
index 0000000..c2d8450
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/9.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/90.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/90.gif
new file mode 100644
index 0000000..adaf20e
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/90.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/91.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/91.gif
new file mode 100644
index 0000000..608d0ad
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/91.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/92.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/92.gif
new file mode 100644
index 0000000..b909e16
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/92.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/93.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/93.gif
new file mode 100644
index 0000000..7f71a8c
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/93.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/94.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/94.gif
new file mode 100644
index 0000000..4f26d7d
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/94.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/95.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/95.gif
new file mode 100644
index 0000000..5ef6d38
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/95.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/96.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/96.gif
new file mode 100644
index 0000000..2b709e1
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/96.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/97.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/97.gif
new file mode 100644
index 0000000..cf29be8
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/97.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/98.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/98.gif
new file mode 100644
index 0000000..c70e7d3
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/98.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/99.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/99.gif
new file mode 100644
index 0000000..05c1863
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/99.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/emoticons/images/static.gif b/public/assets/addons/nkeditor/plugins/emoticons/images/static.gif
new file mode 100644
index 0000000..b8c444b
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/emoticons/images/static.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/filemanager/FManager.js b/public/assets/addons/nkeditor/plugins/filemanager/FManager.js
new file mode 100644
index 0000000..ad8a8f8
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/filemanager/FManager.js
@@ -0,0 +1,307 @@
+/**
+ * HTML5上传插件
+ * @author yangjian<yangjian102621@gmail.com>
+ * @version 1.0.1
+ * @site https://git.oschina.net/blackfox/ajaxUpload
+ */
+(function ($) {
+
+    //判断浏览器是否支持html5
+    // if ( !window.applicationCache )
+    // 	throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");
+
+    //image crop
+    $.fn.imageCrop = function (__width, __height) {
+        $(this).on("load", function () {
+
+            var width, height, left, top;
+            var orgRate = this.width / this.height;
+            var cropRate = __width / __height;
+            if (orgRate >= cropRate) {
+                height = __height;
+                width = __width * orgRate;
+                top = 0;
+                left = (width - __width) / 2;
+            } else {
+                width = __width;
+                height = __height / orgRate;
+                left = 0;
+                //top = (height - __height)/2;
+                top = 0;
+            }
+            $(this).css({
+                "position": "absolute",
+                top: -top + "px",
+                left: -left + "px",
+                width: width + "px",
+                height: height + "px"
+            });
+        });
+    }
+
+    //make element draggable
+    $.fn.draggable = function (options) {
+        var defaults = {
+            handler: null
+        }
+        options = $.extend(defaults, options);
+        var __self = this;
+        $(options.handler).mousedown(function (e) {
+            var offsetLeft = e.pageX - $(__self).position().left;
+            var offsetTop = e.pageY - $(__self).position().top;
+            $(document).mousemove(function (e) {
+                //清除拖动鼠标的时候选择文本
+                window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
+                $(__self).css({
+                    'top': e.pageY - offsetTop + 'px',
+                    'left': e.pageX - offsetLeft + 'px'
+                });
+            });
+
+        }).mouseup(function () {
+            $(document).unbind('mousemove');
+        });
+
+    }
+
+    if (Array.prototype.remove == undefined) {
+        Array.prototype.remove = function (item) {
+            for (var i = 0; i < this.length; i++) {
+                if (this[i] == item) {
+                    this.splice(i, 1);
+                    break;
+                }
+            }
+        }
+    }
+    if (Array.prototype.uinque == undefined) {
+        Array.prototype.uinque = function () {
+            var result = [], hash = {};
+            for (var i = 0, item; (item = this[i]) != null; i++) {
+                if (!hash[item]) {
+                    result.push(item);
+                    hash[item] = true;
+                }
+            }
+            return result;
+        }
+    }
+
+    window.FManager = function (options) {
+        options = $.extend({
+            lang: {},
+            list_url: null,
+            data_type: "json",
+            fileType: "image", //文件类型,默认是图片,可选flash,media,file
+            top: 20,
+            multiple: false,
+            callback: function (data) {
+                console.log(data);
+            }
+        }, options);
+
+        var o = {};
+        o.dialog = null;
+        o.selectedList = new Array(); //the file queue upload successfully
+        o.page = 1; //服务器图片列表页码
+        o.marker = null, //七牛云上传的分页标识
+            o.noRecord = false;
+
+        //close the dialog
+        o.close = function () {
+            o.dialog.remove();
+            try {
+                JDialog.lock.hide();
+            } catch (e) {
+            }
+            if (typeof options.close == 'function') {
+                options.close();
+            }
+        }
+
+        //create dialog
+        function createDialog() {
+
+            var builder = new StringBuilder();
+            builder.append('<div class="uedbody ke-animated"><div class="ued_title">');
+            builder.append('<div class="uedbar"><span>' + options.lang.title + '</span></div><div class="close_btn icon" title="' + options.lang.closeText + '"></div>');
+            builder.append('</div><div class="wrapper"><div class="wra_body wra_body_server">');
+            builder.append('<div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>');
+            builder.append('<div class="loading-icon"></div></div></div><div class="wra-btn-group">');
+            builder.append('<div class="tip-text">' + options.lang.loadMoreData + '</div>')
+            builder.append('<span class="btn btn-primary btn-confirm">' + options.lang.confirmBtnText + '</span>')
+            builder.append('<span class="btn btn-default btn-cancel">' + options.lang.cancelBtnText + '</span></div></div>');
+
+            o.dialog = $(builder.toString());
+            $("body").append(o.dialog);
+            if (options.top == 0) {
+                options.top = ($(window).height() - o.dialog.height()) / 2;
+            }
+            o.dialog.css({
+                left: ($(window).width() - o.dialog.width()) / 2 + "px",
+                top: options.top + "px"
+            });
+            //给对话框添加拖拽事件
+            o.dialog.draggable({handler: o.dialog.find(".ued_title")});
+            loadFilesFromServer();
+
+        }
+
+        //绑定元素事件
+        function bindEvent() {
+
+            //关闭对话框
+            G(".close_btn").on("click", function () {
+                o.close();
+            });
+
+            //点击确认|取消按钮事件
+            G(".btn-confirm").on("click", function () {
+                options.callback(o.selectedList);
+                o.close();
+            });
+            G(".btn-cancel").on("click", function () {
+                o.close();
+            });
+
+            //当滚动条滚到底部时自动去加载图片
+            G(".imagelist").on("scroll", function () {
+
+                if (this.scrollTop + this.clientHeight >= this.scrollHeight) {
+                    loadFilesFromServer();
+                }
+            });
+
+        }
+
+        //query
+        function G(query) {
+            return o.dialog.find(query);
+        }
+
+        //从服务器上获取图片地址
+        function loadFilesFromServer() {
+            if (!options.list_url) {
+                G(".online .no-data").html('<span class="error">' + options.lang.noListUrl + '</span>').show();
+                return false;
+            }
+            if (o.noRecord) return false;
+
+            G(".loading-icon").show(); //显示加载图标
+            $.get(options.list_url, {
+                page: o.page,
+                marker: o.marker,
+                fileType: options.fileType
+            }, function (res) {
+
+                G(".loading-icon").hide(); //隐藏加载图标
+                if (res.code == "000") {
+                    if (!res.data[0]) {
+                        G(".online .no-data").html(options.lang.noDataText).show();
+                        return;
+                    }
+                    o.page++;
+                    o.marker = res.extra; //存储marker
+                    appendFiles(res.data);
+                } else {
+                    G(".online .no-data").text(options.lang.noDataText).show();
+                    o.noRecord = true;
+                }
+
+            }, "json");
+        }
+
+        //追加元素到图片列表
+        function appendFiles(data) {
+
+            $.each(data, function (idx, item) {
+
+                var builder = new StringBuilder();
+                builder.append('<li>');
+                var extension = getFileExt(item.thumbURL);
+                if (extension == '') extension = "default";
+                extension = extension.toLowerCase();
+                //如果不是图片,则根据文件的后缀名去加载对应的缩略图
+                var imgSize = item.width + 'x' + item.height; //图片尺寸
+                if ("jpg|jpeg|gif|png|bmp".indexOf(extension) == -1) {
+                    imgSize = formatFileSize(item.filesize); //如果是文件则显示文件大小
+                    builder.append('<span class="icon-placeholder icon-default icon-' + extension + '" data-src="' + item.oriURL + '"></span>');
+                } else {
+                    builder.append('<img src="' + item.thumbURL + '" data-src="' + item.oriURL + '" border="0">');
+                }
+
+                builder.append('<span class="ic"><em class="img-size">' + imgSize + '</em></span></li>');
+                var $image = $(builder.toString());
+
+                //绑定选择图片事件
+                $image.find(".ic").on("click", function () {
+                    var src = $(this).prev().attr("data-src");
+                    var oldSrc = $('.selected:eq(0)').prev().attr("data-src");
+                    if (options.multiple) {
+                        //多选
+                        if ($(this).hasClass("selected")) {
+                            $(this).removeClass("selected");
+                            o.selectedList.remove(src);
+                        } else {
+                            $(this).addClass("selected");
+                            o.selectedList.push(src);
+                        }
+                    } else {
+                        //这里暂时改成单选
+                        $('.selected:eq(0)').removeClass("selected"); //移除之前的选中的图片
+                        o.selectedList.remove(oldSrc);
+                        $(this).addClass("selected");
+                        o.selectedList.push(src);
+                    }
+                    //console.log(o.selectedList);
+                });
+                //裁剪显示图片
+                $image.find("img").imageCrop(113, 113);
+                G(".imagelist .list").append($image);
+            });
+
+        }
+
+        //获取文件后缀名
+        function getFileExt(filename) {
+            if (!filename) return false;
+            var position = filename.lastIndexOf('.')
+            if (position != -1) {
+                return filename.substr(position + 1).toLowerCase();
+            }
+            return false;
+        }
+
+        //format file size(格式化文件大小)
+        function formatFileSize(size) {
+
+            if (size / 1048576 > 1) {
+                return (size / 1048576).toFixed(2) + "MB";
+            } else {
+                return (size / 1024).toFixed(2) + "KB";
+            }
+
+        }
+
+        //initialize dialog
+        createDialog();
+        bindEvent();
+        return o;
+    }; //end of JUpload
+
+    //string builder
+    var StringBuilder = function () {
+
+        var buffer = new Array();
+        StringBuilder.prototype.append = function (str) {
+            buffer.push(str);
+        }
+
+        StringBuilder.prototype.toString = function () {
+            return buffer.join("");
+        }
+
+    }
+
+
+})(jQuery);
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/filemanager/FManager.min.js b/public/assets/addons/nkeditor/plugins/filemanager/FManager.min.js
new file mode 100644
index 0000000..508bf23
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/filemanager/FManager.min.js
@@ -0,0 +1,2 @@
+/* NKeditor 5.0.3 (2018-10-25), Copyright (C) r9it.com,*/
+!function(a){if(!window.applicationCache)throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");a.fn.imageCrop=function(b,c){a(this).on("load",function(){var d,e,f,g,h=this.width/this.height,i=b/c;h>=i?(e=c,d=b*h,g=0,f=(d-b)/2):(d=b,e=c/h,f=0,g=0),a(this).css({position:"absolute",top:-g+"px",left:-f+"px",width:d+"px",height:e+"px"})})},a.fn.draggable=function(b){var c={handler:null};b=a.extend(c,b);var d=this;a(b.handler).mousedown(function(b){var c=b.pageX-a(d).position().left,e=b.pageY-a(d).position().top;a(document).mousemove(function(b){window.getSelection?window.getSelection().removeAllRanges():document.selection.empty(),a(d).css({top:b.pageY-e+"px",left:b.pageX-c+"px"})})}).mouseup(function(){a(document).unbind("mousemove")})},void 0==Array.prototype.remove&&(Array.prototype.remove=function(a){for(var b=0;b<this.length;b++)if(this[b]==a){this.splice(b,1);break}}),void 0==Array.prototype.uinque&&(Array.prototype.uinque=function(){for(var a,b=[],c={},d=0;null!=(a=this[d]);d++)c[a]||(b.push(a),c[a]=!0);return b}),window.FManager=function(c){function d(){var d=new b;d.append('<div class="uedbody ke-animated"><div class="ued_title">'),d.append('<div class="uedbar"><span>'+c.lang.title+'</span></div><div class="close_btn icon" title="'+c.lang.closeText+'"></div>'),d.append('</div><div class="wrapper"><div class="wra_body wra_body_server">'),d.append('<div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>'),d.append('<div class="loading-icon"></div></div></div><div class="wra-btn-group">'),d.append('<div class="tip-text">'+c.lang.loadMoreData+"</div>"),d.append('<span class="btn btn-primary btn-confirm">'+c.lang.confirmBtnText+"</span>"),d.append('<span class="btn btn-default btn-cancel">'+c.lang.cancelBtnText+"</span></div></div>"),k.dialog=a(d.toString()),a("body").append(k.dialog),0==c.top&&(c.top=(a(window).height()-k.dialog.height())/2),k.dialog.css({left:(a(window).width()-k.dialog.width())/2+"px",top:c.top+"px"}),k.dialog.draggable({handler:k.dialog.find(".ued_title")}),g()}function e(){f(".close_btn").on("click",function(){k.close()}),f(".btn-confirm").on("click",function(){c.callback(k.selectedList),k.close()}),f(".btn-cancel").on("click",function(){k.close()}),f(".imagelist").on("scroll",function(){this.scrollTop+this.clientHeight>=this.scrollHeight&&g()})}function f(a){return k.dialog.find(a)}function g(){return c.list_url?k.noRecord?!1:(f(".loading-icon").show(),void a.get(c.list_url,{page:k.page,marker:k.marker,fileType:c.fileType},function(a){if(f(".loading-icon").hide(),"000"==a.code){if(!a.data[0])return void f(".online .no-data").html(c.lang.noDataText).show();k.page++,k.marker=a.extra,h(a.data)}else f(".online .no-data").text(c.lang.noDataText).show(),k.noRecord=!0},"json")):(f(".online .no-data").html('<span class="error">'+c.lang.noListUrl+"</span>").show(),!1)}function h(c){a.each(c,function(c,d){var e=new b;e.append("<li>");var g=i(d.thumbURL);""==g&&(g="default"),g=g.toLowerCase();var h=d.width+"x"+d.height;-1=="jpg|jpeg|gif|png|bmp".indexOf(g)?(h=j(d.filesize),e.append('<span class="icon-placeholder icon-default icon-'+g+'" data-src="'+d.oriURL+'"></span>')):e.append('<img src="'+d.thumbURL+'" data-src="'+d.oriURL+'" border="0">'),e.append('<span class="ic"><em class="img-size">'+h+"</em></span></li>");var l=a(e.toString());l.find(".ic").on("click",function(){var b=a(this).prev().attr("data-src"),c=a(".selected:eq(0)").prev().attr("data-src");a(".selected:eq(0)").removeClass("selected"),k.selectedList.remove(c),a(this).addClass("selected"),k.selectedList.push(b)}),l.find("img").imageCrop(113,113),f(".imagelist .list").append(l)})}function i(a){if(!a)return!1;var b=a.lastIndexOf(".");return-1!=b?a.substr(b+1).toLowerCase():!1}function j(a){return a/1048576>1?(a/1048576).toFixed(2)+"MB":(a/1024).toFixed(2)+"KB"}c=a.extend({lang:{},list_url:null,data_type:"json",fileType:"image",top:20,callback:function(a){console.log(a)}},c);var k={};return k.dialog=null,k.selectedList=new Array,k.page=1,k.marker=null,k.noRecord=!1,k.close=function(){k.dialog.remove();try{JDialog.lock.hide()}catch(a){}"function"==typeof c.close&&c.close()},d(),e(),k};var b=function(){var a=new Array;b.prototype.append=function(b){a.push(b)},b.prototype.toString=function(){return a.join("")}}}(jQuery);
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/filemanager/css/filemanager.min.css b/public/assets/addons/nkeditor/plugins/filemanager/css/filemanager.min.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/filemanager/css/filemanager.min.css
diff --git a/public/assets/addons/nkeditor/plugins/filemanager/filemanager.js b/public/assets/addons/nkeditor/plugins/filemanager/filemanager.js
new file mode 100644
index 0000000..9f740f8
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/filemanager/filemanager.js
@@ -0,0 +1,35 @@
+/**
+ * 文件服务器管理
+ * @author yangjian <yangjian102621@gmail.com>
+ * @since v4.1.12(2017-09-12)
+ * @site http://git.oschina.net/blackfox/kindeditor
+ */
+KindEditor.plugin('filemanager', function(K) {
+	var self = this;
+	var fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php');
+	var lang = self.lang('filemanager.');
+	if(typeof jQuery == 'undefined') {
+		K.options.errorMsgHandler(lang.depJQueryError, "error");
+		return;
+	} else {
+		K.loadScript(K.options.pluginsPath+"filemanager/FManager.js");
+		K.loadStyle(K.options.pluginsPath+"multiimage/css/upload.css");
+	}
+
+	self.plugin.filemanagerDialog = function(options) {
+
+		var clickFn = options.clickFn;
+		new FManager({
+			list_url : fileManagerJson,	//图片列表数据获取url
+			lang : lang, //语言包
+			fileType : options.dirName,
+			top : self.dialogOffset,
+			callback : function(data) {
+				//console.log(data);
+				clickFn.call(this, data[0]);
+			}
+		});
+		//return dialog;
+	}
+
+});
diff --git a/public/assets/addons/nkeditor/plugins/fixtoolbar/fixtoolbar.js b/public/assets/addons/nkeditor/plugins/fixtoolbar/fixtoolbar.js
new file mode 100644
index 0000000..7a16fca
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/fixtoolbar/fixtoolbar.js
@@ -0,0 +1,35 @@
+/**
+ * Created by chenyihong on 14/12/4.
+ */
+
+KindEditor.plugin('fixtoolbar', function (K) {
+    var self = this;
+    if (!self.fixToolBar) {
+        return;
+    }
+
+    function init() {
+        var toolbar = K('.ke-toolbar');
+        var originY = toolbar.pos().y;
+        K(window).bind('scroll', function () {
+            if (toolbar.css('position') == 'fixed') {
+                if(document.body.scrollTop - originY < 0){
+                    toolbar.css('position', 'static');
+                    toolbar.css('top', 'auto');
+                }
+            } else {
+                if (toolbar.pos().y - document.body.scrollTop < 0) {
+                    toolbar.css('position', 'fixed');
+                    toolbar.css('top', 0);
+                }
+            }
+        });
+    }
+
+    if (self.isCreated) {
+        init();
+    } else {
+        self.afterCreate(init);
+    }
+
+});
diff --git a/public/assets/addons/nkeditor/plugins/flash/flash.js b/public/assets/addons/nkeditor/plugins/flash/flash.js
new file mode 100644
index 0000000..f26eaf3
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/flash/flash.js
@@ -0,0 +1,165 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('flash', function(K) {
+	var self = this, name = 'flash', lang = self.lang(name + '.'),
+		allowFlashUpload = K.undef(self.allowFlashUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+	self.plugin.flash = {
+		edit : function() {
+			var html = [
+				'<div class="ke-dialog-content-inner">',
+				//url
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+				'<div class="row-right">',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+				'<span class="ke-button-common ke-button-outer">',
+				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+				'</span>',
+				'</div>',
+				'</div>',
+				//width
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keWidth" class="row-left">' + lang.width + ':</label>',
+				'<div class="row-right">',
+				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',
+				'</div>',
+				'</div>',
+				//height
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keHeight" class="row-left">' + lang.height + ':</label>',
+				'<div class="row-right">',
+				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',
+				'</div>',
+				'</div>',
+				'</div>'
+			].join('');
+
+			var dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var url = K.trim(urlBox.val()),
+							width = widthBox.val(),
+							height = heightBox.val();
+						if (url == 'http://' || K.invalidUrl(url)) {
+							K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+							urlBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+							heightBox[0].focus();
+							return;
+						}
+						var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+								src : url,
+								type : K.mediaType('.swf'),
+								width : width,
+								height : height,
+								quality : 'high'
+							});
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('[name="width"]', div),
+			heightBox = K('[name="height"]', div);
+			urlBox.val('http://');
+
+			if (allowFlashUpload) {
+				var uploadbutton = K.uploadbutton({
+					button : K('.ke-upload-button', div)[0],
+					fieldName : filePostName,
+					extraParams : extraParams,
+					url : K.addParam(uploadJson, 'fileType=flash'),
+					afterUpload : function(data) {
+						dialog.hideLoading();
+						if (data.code === "000") {
+							var url = data.data.url;
+							if (formatUploadUrl) {
+								url = K.formatUrl(url, 'absolute');
+							}
+							urlBox.val(url);
+							if (self.afterUpload) {
+								self.afterUpload.call(self, url, data, name);
+							}
+							K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+						} else {
+							K.options.errorMsgHandler(data.message, "error");
+						}
+					},
+					afterError : function(html) {
+						dialog.hideLoading();
+						self.errorDialog(html);
+					}
+				});
+				uploadbutton.fileBox.change(function(e) {
+					dialog.showLoading(self.lang('uploadLoading'));
+					uploadbutton.submit();
+				});
+			} else {
+				K('.ke-upload-button', div).hide();
+			}
+
+			if (allowFileManager) {
+				viewServerBtn.click(function(e) {
+					self.loadPlugin('filemanager', function() {
+						self.plugin.filemanagerDialog({
+							dirName : 'flash',
+							clickFn : function(url) {
+								K('[name="url"]', div).val(url);
+								if (self.afterSelectFile) {
+									self.afterSelectFile.call(self, url);
+								}
+							}
+						});
+					});
+				});
+			} else {
+				K('[name="url"]').css("width", "250px");
+				viewServerBtn.hide();
+			}
+
+			var img = self.plugin.getSelectedFlash();
+			if (img) {
+				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+				urlBox.val(attrs.src);
+				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedFlash().remove();
+			// [IE] 删除图片后立即点击图片按钮出错
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.flash.edit);
+});
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/addimg.png b/public/assets/addons/nkeditor/plugins/graft/css/images/addimg.png
new file mode 100644
index 0000000..03a8713
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/addimg.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/blur.png b/public/assets/addons/nkeditor/plugins/graft/css/images/blur.png
new file mode 100644
index 0000000..6307d27
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/blur.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/brush.png b/public/assets/addons/nkeditor/plugins/graft/css/images/brush.png
new file mode 100644
index 0000000..efa6fdb
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/brush.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/delimg.png b/public/assets/addons/nkeditor/plugins/graft/css/images/delimg.png
new file mode 100644
index 0000000..5a892e4
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/delimg.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/delimgH.png b/public/assets/addons/nkeditor/plugins/graft/css/images/delimgH.png
new file mode 100644
index 0000000..2f0c5c9
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/delimgH.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/empty.png b/public/assets/addons/nkeditor/plugins/graft/css/images/empty.png
new file mode 100644
index 0000000..0375196
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/empty.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/emptyH.png b/public/assets/addons/nkeditor/plugins/graft/css/images/emptyH.png
new file mode 100644
index 0000000..838ca72
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/emptyH.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/eraser.png b/public/assets/addons/nkeditor/plugins/graft/css/images/eraser.png
new file mode 100644
index 0000000..63e87ce
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/eraser.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/init.png b/public/assets/addons/nkeditor/plugins/graft/css/images/init.png
new file mode 100644
index 0000000..c2eb7be
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/init.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/redo.png b/public/assets/addons/nkeditor/plugins/graft/css/images/redo.png
new file mode 100644
index 0000000..12cd9bb
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/redo.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/redoH.png b/public/assets/addons/nkeditor/plugins/graft/css/images/redoH.png
new file mode 100644
index 0000000..d9f33d3
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/redoH.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/save.png b/public/assets/addons/nkeditor/plugins/graft/css/images/save.png
new file mode 100644
index 0000000..2ab611e
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/save.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/scale.png b/public/assets/addons/nkeditor/plugins/graft/css/images/scale.png
new file mode 100644
index 0000000..935a3f3
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/scale.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/scaleH.png b/public/assets/addons/nkeditor/plugins/graft/css/images/scaleH.png
new file mode 100644
index 0000000..72e64a9
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/scaleH.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/size.png b/public/assets/addons/nkeditor/plugins/graft/css/images/size.png
new file mode 100644
index 0000000..8366845
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/size.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/undo.png b/public/assets/addons/nkeditor/plugins/graft/css/images/undo.png
new file mode 100644
index 0000000..084c7cc
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/undo.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/images/undoH.png b/public/assets/addons/nkeditor/plugins/graft/css/images/undoH.png
new file mode 100644
index 0000000..fde7eb3
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/graft/css/images/undoH.png differ
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/scrawl.css b/public/assets/addons/nkeditor/plugins/graft/css/scrawl.css
new file mode 100644
index 0000000..f53a5d7
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/graft/css/scrawl.css
@@ -0,0 +1,204 @@
+/*common
+*/
+body {
+  margin: 0; }
+  body a {
+    text-decoration: none; }
+  body em {
+    font-style: normal; }
+  body .border_style {
+    border: 1px solid #ccc;
+    border-radius: 5px;
+    box-shadow: 2px 2px 5px #d3d6da; }
+  body em {
+    font-style: normal; }
+  body .ke-dialog-body {
+    padding-top: 8px; }
+  body .scrawl-main {
+    padding: 0px 8px;
+    zoom: 1;
+    overflow: hidden;
+    max-width: 1000px; }
+    body .scrawl-main .hot {
+      float: left; }
+      body .scrawl-main .hot .drawBoard {
+        position: relative;
+        cursor: crosshair; }
+        body .scrawl-main .hot .drawBoard .brushBorad {
+          position: absolute;
+          left: 0;
+          top: 0;
+          z-index: 998; }
+        body .scrawl-main .hot .drawBoard .picBoard {
+          border: none;
+          text-align: center;
+          cursor: default; }
+      body .scrawl-main .hot .operateBar {
+        margin-top: 10px;
+        font-size: 12px;
+        text-align: center; }
+        body .scrawl-main .hot .operateBar span {
+          margin-left: 10px; }
+        body .scrawl-main .hot .operateBar button {
+          background: #e1e1e1;
+          border: 1px solid #cccccc;
+          margin: 0px 5px;
+          cursor: default; }
+        body .scrawl-main .hot .operateBar .prevStep .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/undo.png"); }
+        body .scrawl-main .hot .operateBar .prevStep.active {
+          cursor: pointer;
+          background: #FFFFFF;
+          border-color: #56CCCC; }
+          body .scrawl-main .hot .operateBar .prevStep.active .icon {
+            background-image: url("images/undoH.png"); }
+        body .scrawl-main .hot .operateBar .nextStep .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/redo.png"); }
+        body .scrawl-main .hot .operateBar .nextStep.active {
+          cursor: pointer;
+          background: #FFFFFF;
+          border-color: #56CCCC; }
+          body .scrawl-main .hot .operateBar .nextStep.active .icon {
+            background-image: url("images/redoH.png"); }
+        body .scrawl-main .hot .operateBar .clearBoard {
+          cursor: default; }
+          body .scrawl-main .hot .operateBar .clearBoard .icon {
+            display: inline-block;
+            width: 16px;
+            height: 16px;
+            background-image: url("images/empty.png"); }
+        body .scrawl-main .hot .operateBar .clearBoard.active {
+          cursor: pointer;
+          background: #FFFFFF;
+          border-color: #56CCCC; }
+          body .scrawl-main .hot .operateBar .clearBoard.active .icon {
+            background-image: url("images/emptyH.png"); }
+        body .scrawl-main .hot .operateBar .scaleBoard .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/scale.png");
+          cursor: default; }
+        body .scrawl-main .hot .operateBar .scaleBoard .iconH {
+          background-image: url("images/scaleH.png"); }
+        body .scrawl-main .hot .operateBar .scaleBoard .text {
+          color: #ccc;
+          cursor: default; }
+    body .scrawl-main .drawToolbar {
+      float: right;
+      width: 110px;
+      height: 320px;
+      overflow: hidden; }
+      body .scrawl-main .drawToolbar .brushIcon {
+        display: inline-block;
+        width: 16px;
+        height: 16px;
+        background-image: url("images/brush.png"); }
+      body .scrawl-main .drawToolbar .eraserIcon {
+        display: inline-block;
+        width: 16px;
+        height: 16px;
+        background-image: url("images/eraser.png"); }
+      body .scrawl-main .drawToolbar .blurIcon {
+        display: inline-block;
+        width: 16px;
+        height: 16px;
+        background: url(images/blur.png) -2px -2px;
+        background-size: 22px 20px; }
+      body .scrawl-main .drawToolbar .colorBar {
+        margin-top: 10px;
+        font-size: 12px;
+        text-align: center;
+        zoom: 1;
+        overflow: hidden; }
+        body .scrawl-main .drawToolbar .colorBar span {
+          float: left;
+          margin: 2px 3px;
+          width: 10px;
+          height: 10px;
+          border: 1px solid #c1c1c1;
+          border-radius: 3px;
+          cursor: pointer; }
+        body .scrawl-main .drawToolbar .colorBar .active {
+          border-color: #FF0000;
+          box-shadow: 2px 2px 5px #d3d6da; }
+      body .scrawl-main .drawToolbar .sectionBar {
+        margin-top: 15px;
+        font-size: 12px;
+        text-align: center; }
+        body .scrawl-main .drawToolbar .sectionBar a {
+          display: inline-block;
+          width: 10px;
+          height: 12px;
+          color: #888;
+          text-indent: -999px;
+          opacity: 0.3; }
+        body .scrawl-main .drawToolbar .sectionBar .size1 {
+          background: url("images/size.png") 1px center no-repeat; }
+        body .scrawl-main .drawToolbar .sectionBar .size2 {
+          background: url("images/size.png") -10px center no-repeat; }
+        body .scrawl-main .drawToolbar .sectionBar .size3 {
+          background: url("images/size.png") -22px center no-repeat; }
+        body .scrawl-main .drawToolbar .sectionBar .size4 {
+          background: url("images/size.png") -35px center no-repeat; }
+        body .scrawl-main .drawToolbar .sectionBar .icon {
+          position: relative;
+          top: 3px; }
+        body .scrawl-main .drawToolbar .sectionBar .clearSetting .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/init.png");
+          background-size: 16px 16px; }
+        body .scrawl-main .drawToolbar .sectionBar .addImgH {
+          position: relative; }
+          body .scrawl-main .drawToolbar .sectionBar .addImgH .icon {
+            display: inline-block;
+            width: 16px;
+            height: 16px;
+            background-image: url("images/addimg.png");
+            cursor: default; }
+          body .scrawl-main .drawToolbar .sectionBar .addImgH .upload {
+            position: absolute;
+            left: 18px;
+            top: -1px;
+            width: 75px;
+            height: 21px;
+            opacity: 0;
+            cursor: pointer;
+            opacity: 0; }
+        body .scrawl-main .drawToolbar .sectionBar .removeImg .icon {
+          display: inline-block;
+          width: 16px;
+          height: 16px;
+          background-image: url("images/delimg.png");
+          cursor: default; }
+        body .scrawl-main .drawToolbar .sectionBar .removeImg .text {
+          color: #ccc;
+          cursor: default; }
+        body .scrawl-main .drawToolbar .sectionBar .removeImg.active {
+          cursor: pointer; }
+          body .scrawl-main .drawToolbar .sectionBar .removeImg.active .icon {
+            background-image: url("images/delimgH.png"); }
+          body .scrawl-main .drawToolbar .sectionBar .removeImg.active .text {
+            color: #000;
+            cursor: default; }
+        body .scrawl-main .drawToolbar .sectionBar .saveImg {
+          cursor: pointer; }
+          body .scrawl-main .drawToolbar .sectionBar .saveImg .icon {
+            display: inline-block;
+            width: 16px;
+            height: 16px;
+            background-image: url("images/save.png");
+            background-size: 18px 18px;
+            cursor: default; }
+      body .scrawl-main .drawToolbar #clearSetting {
+        cursor: pointer; }
+
+/*# sourceMappingURL=scrawl.css.map */
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/scrawl.css.map b/public/assets/addons/nkeditor/plugins/graft/css/scrawl.css.map
new file mode 100644
index 0000000..6143e2c
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/graft/css/scrawl.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["scrawl.scss"],
+"names": [],
+"file": "scrawl.css"
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/graft/css/scrawl.scss b/public/assets/addons/nkeditor/plugins/graft/css/scrawl.scss
new file mode 100644
index 0000000..fc23a3e
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/graft/css/scrawl.scss
@@ -0,0 +1,284 @@
+/*common
+*/
+body {
+
+    margin: 0;
+    a{text-decoration: none;}
+    em{font-style: normal;}
+
+    .border_style{
+        border: 1px solid #ccc;
+        border-radius: 5px;
+        box-shadow:2px 2px 5px #d3d6da;
+    }
+    em {font-style: normal;}
+
+    .ke-dialog-body {
+        padding-top: 8px;
+    }
+    .scrawl-main {
+        padding: 0px 8px;
+        zoom: 1;
+        overflow: hidden;
+        max-width: 1000px;
+
+
+        // 绘图区域
+        .hot {
+            float:left;
+
+            .drawBoard{
+                position: relative;
+                cursor: crosshair;
+
+                .brushBorad{
+                    position: absolute;
+                    left:0;
+                    top:0;
+                    z-index: 998;
+                }
+
+                .picBoard{
+                    border: none;
+                    text-align: center;
+                    cursor: default;
+                }
+            }
+
+            .operateBar{
+                margin-top:10px;
+                font-size:12px;
+                text-align: center;
+
+                span {margin-left: 10px;}
+
+                button {
+                    background:#e1e1e1;
+                    border: 1px solid #cccccc;
+                    margin: 0px 5px;
+                    cursor:default;
+                }
+
+                .prevStep {
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/undo.png');
+                    }
+                }
+
+                .prevStep.active {
+                    cursor: pointer;
+                    background: #FFFFFF;
+                    border-color: #56CCCC;
+
+                    .icon {
+                        background-image: url('images/undoH.png');
+                    }
+
+                }
+
+                .nextStep {
+                    .icon {
+                        display: inline-block;
+                        width:16px;
+                        height:16px;
+                        background-image: url('images/redo.png');
+                    }
+                }
+
+                .nextStep.active {
+                    cursor: pointer;
+                    background: #FFFFFF;
+                    border-color: #56CCCC;
+
+                    .icon {
+                        background-image: url('images/redoH.png');
+                    }
+                }
+
+                .clearBoard {
+                    cursor: default;
+
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/empty.png');
+                    }
+
+                }
+
+                .clearBoard.active {
+                    cursor: pointer;
+                    background: #FFFFFF;
+                    border-color: #56CCCC;
+
+                    .icon {
+                        background-image: url('images/emptyH.png');
+                    }
+                }
+
+                .scaleBoard {
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/scale.png');
+                        cursor:default;}
+
+                    .iconH {
+                        background-image: url('images/scaleH.png');
+                    }
+
+                    .text{
+                        color:#ccc;
+                        cursor:default;}
+                }
+
+
+            }
+        }
+
+        // 绘图工具
+        .drawToolbar {
+            float:right;
+            width:110px;
+            height:320px;
+            overflow: hidden;
+
+            .brushIcon {
+                display: inline-block;
+                width:16px;height:16px;
+                background-image: url('images/brush.png')}
+
+            .eraserIcon {
+                display: inline-block;
+                width:16px;height:16px;
+                background-image: url('images/eraser.png')}
+
+            .blurIcon {
+                display: inline-block;
+                width:16px;height:16px;
+                background: url(images/blur.png) -2px -2px;
+                background-size: 22px 20px;
+            }
+
+            .colorBar {
+                margin-top:10px;
+                font-size: 12px;
+                text-align: center;
+                zoom: 1;
+                overflow: hidden;
+
+                span {
+                    float: left;
+                    margin: 2px 3px;
+                    width: 10px;
+                    height: 10px;
+                    border:1px solid #c1c1c1;
+                    border-radius: 3px;
+                    cursor: pointer;
+                }
+
+                .active {
+                    border-color: #FF0000;
+                    box-shadow:2px 2px 5px #d3d6da;
+                }
+            }
+
+            .sectionBar {
+                margin-top:15px;
+                font-size: 12px;
+                text-align: center;
+
+                a {
+                    display:inline-block;
+                    width:10px;
+                    height:12px;
+                    color: #888;
+                    text-indent: -999px;
+                    opacity: 0.3
+                }
+
+                .size1 {background: url('images/size.png') 1px center no-repeat ;}
+                .size2 {background: url('images/size.png') -10px center no-repeat;}
+                .size3 {background: url('images/size.png') -22px center no-repeat;}
+                .size4 {background: url('images/size.png') -35px center no-repeat;}
+
+                .icon {
+                    position: relative;
+                    top:3px;
+                }
+                .clearSetting {
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/init.png');
+                        background-size: 16px 16px;
+                    }
+                }
+
+                .addImgH {
+                    position: relative;
+
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/addimg.png');
+                        cursor:default;
+                    }
+
+                    .upload {
+                        position: absolute;
+                        left: 18px;top: -1px;
+                        width: 75px;
+                        height: 21px;
+                        opacity: 0;
+                        cursor: pointer;
+                        opacity: 0;
+                    }
+                }
+
+                .removeImg {
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/delimg.png');
+                        cursor:default;
+                    }
+
+                    .text{color:#ccc;cursor:default;}
+                } //end removeImg
+
+                .removeImg.active {
+                    cursor: pointer;
+
+                    .icon {
+                        background-image: url('images/delimgH.png');
+                    }
+
+                    .text{color:#000;cursor:default;}
+                } //end removeImg
+
+                //保存图片
+                .saveImg {
+                    cursor: pointer;
+
+                    .icon {
+                        display: inline-block;
+                        width:16px;height:16px;
+                        background-image: url('images/save.png');
+                        background-size: 18px 18px;
+                        cursor:default;
+                    }
+                }
+
+            }
+
+            #clearSetting {cursor: pointer;}
+        }
+    }
+
+
+}
+
+
diff --git a/public/assets/addons/nkeditor/plugins/graft/graft.js b/public/assets/addons/nkeditor/plugins/graft/graft.js
new file mode 100644
index 0000000..0102a88
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/graft/graft.js
@@ -0,0 +1,189 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('graft', function(K) {
+	var self = this, name = 'graft',
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		allowUploadGraft = K.undef(self.allowUploadGraft, true),
+		lang = self.lang(name + '.');
+
+	if(typeof jQuery == 'undefined') {
+		K.options.errorMsgHandler(lang.depJQueryError, "error");
+		return;
+	} else {
+		K.loadStyle(K.options.pluginsPath+"graft/css/scrawl.css");
+		K.loadScript(K.options.pluginsPath+"graft/scrawl.js");
+	}
+
+	self.plugin.graftDialog = function(options) {
+		var clickFn = options.clickFn;
+		var html = [
+			'<div class="scrawl-main" id="scrawl-main">',
+			//绘图区域
+			'<div class="hot">',
+			'<div class="drawBoard border_style">',
+			'<canvas id="canvas-borad" class="brushBorad">你的浏览器不支持 canvas 绘图</canvas>',
+			'<div class="picBoard" id="picBoard" style=""></div>',
+			'</div>',
+			'<div class="operateBar">',
+			'<button id="J_prevStep" class="prevStep" title="上一步">',
+			'<em class="icon"></em>',
+			'</button>',
+			'<button id="J_nextStep" class="nextStep" title="下一步">',
+			'<em class="icon"></em>',
+			'</button>',
+			'<button id="J_clearBoard" class="clearBoard" title="清空">',
+			'<em class="icon"></em>',
+			'</button>',
+			'</div>',
+			'</div>',
+			//绘图区域 end
+
+			//工具栏
+			'<div class="drawToolbar border_style">',
+			'<div class="colorBar">',
+			'<span data-color="#0099CC" style="background:#0099CC;" class="active"></span>',
+			'<span data-color="#003366" style="background:#003366;"></span>',
+			'<span data-color="#993333" style="background:#993333;"></span>',
+			'<span data-color="#FF9900" style="background:#FF9900;"></span>',
+			'<span data-color="#0000CC" style="background:#0000CC;"></span>',
+			'<span data-color="#CC3333" style="background:#CC3333;"></span>',
+
+			'<span data-color="#F4D03F" style="background:#641E16;"></span>',
+			'<span data-color="#4A235A" style="background:#4A235A;"></span>',
+			'<span data-color="#009966" style="background:#009966;"></span>',
+			'<span data-color="#ffff00" style="background:#ffff00;"></span>',
+			'<span data-color="#7D6608" style="background:#7D6608;"></span>',
+			'<span data-color="#FF33CC" style="background:#FF33CC;"></span>',
+
+			'<span data-color="#990066" style="background:#990066;"></span>',
+			'<span data-color="#ffffff" style="background:#ffffff;"></span>',
+			'<span data-color="#9bbb59" style="background:#9bbb59;"></span>',
+			'<span data-color="#CCFFFF" style="background:#CCFFFF;"></span>',
+			'<span data-color="#FFCCCC" style="background:#FFCCCC;"></span>',
+			'<span data-color="#CC99CC" style="background:#CC99CC;"></span>',
+			'</div>',
+
+			//笔刷设置
+			'<div class="sectionBar">',
+			'<em class="brushIcon"></em>',
+			'<a href="javascript:void(0)" class="brush-size size1">1</a>',
+			'<a href="javascript:void(0)" class="brush-size size2">3</a>',
+			'<a href="javascript:void(0)" class="brush-size size3">5</a>',
+			'<a href="javascript:void(0)" class="brush-size size4">7</a>',
+			'</div>',
+			'<div class="sectionBar">',
+			'<em class="eraserIcon"></em>',
+			'<a href="javascript:void(0)" class="eraser-size size1">5</a>',
+			'<a href="javascript:void(0)" class="eraser-size size2">10</a>',
+			'<a href="javascript:void(0)" class="eraser-size size3">15</a>',
+			'<a href="javascript:void(0)" class="eraser-size size4">20</a>',
+			'</div>',
+			'<div class="sectionBar">',
+			'<em class="blurIcon"></em>',
+			'<a href="javascript:void(0)" class="blur-size size1">2</a>',
+			'<a href="javascript:void(0)" class="blur-size size2">4</a>',
+			'<a href="javascript:void(0)" class="blur-size size3">6</a>',
+			'<a href="javascript:void(0)" class="blur-size size4">8</a>',
+			'</div>',
+			//end 笔刷设置
+			'<div class="sectionBar">',
+			'<span id="clearSetting" class="clearSetting">',
+			'<em class="icon"></em>',
+			'<em class="text">初始化设置</em>',
+			'</span>',
+			'</div>',
+			'<div class="sectionBar">',
+			'<div id="J_addImg" class="addImgH">',
+			'<em class="icon"></em>',
+			'<em class="text">添加背景</em>',
+			'<input type="file" class="upload" id="J_canvas_bg" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>',
+			'</div>',
+			'</div>',
+			'<div class="sectionBar">',
+			'<span id="J_removeImg" class="removeImg">',
+			'<em class="icon"></em>',
+			'<em class="text">删除背景</em>',
+			'</span>',
+			'</div>',
+			'</div>'
+		].join('');
+
+		var dialog = self.createDialog({
+				name : name,
+				width : 750,
+				height : 440,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : lang.btnText,
+					click : function(e) {
+
+						if (dialog.isLoading) {
+							return;
+						}
+						if (canvas.isEmpty()) {
+							K.options.errorMsgHandler(lang.empty, "error");
+							return;
+						}
+						canvas.save(function(data) {
+							//上传涂鸦到服务器
+							if (allowUploadGraft) {
+								dialog.showLoading(self.lang('uploadLoading'));
+								$.post(uploadJson, {
+									img_base64_data : data,
+									fileType : "image",
+									base64 : 1
+								}, function(res) {
+
+									dialog.hideLoading();
+									if (res.code == "000") {
+										K.options.errorMsgHandler(lang.uploadSuccess, "ok");
+										clickFn.call(self, res.data.url);
+										self.hideDialog().focus();
+									} else {
+										K.options.errorMsgHandler(lang.uploadFaild, "error");
+									}
+
+								}, "json");
+
+							} else {
+								clickFn.call(self, data);
+								self.hideDialog().focus();
+							}
+
+						});
+
+					}
+				}
+			});
+		//console.log(div);
+
+		//var urlBox = K('[name="url"]', div),
+		//	viewServerBtn = K('[name="viewServer"]', div),
+		//	titleBox = K('[name="title"]', div);
+
+		var canvas = new Canvas({
+			canvasId : "canvas-borad",
+			width : 600,
+			height : 320
+		});
+
+
+
+	};
+
+	self.clickToolbar(name, function() {
+		self.plugin.graftDialog({
+			clickFn : function(url) {
+				self.exec('insertimage', url);
+			}
+		});
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/graft/index.html b/public/assets/addons/nkeditor/plugins/graft/index.html
new file mode 100644
index 0000000..9b684f9
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/graft/index.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>在线涂鸦工具</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <link rel="stylesheet" type="text/css" href="css/scrawl.css">
+</head>
+<body>
+<div class="scrawl-main" id="scrawl-main">
+    <div class="hot">
+        <div class="drawBoard border_style">
+            <canvas id="canvas-borad" class="brushBorad">你的浏览器不支持 canvas 绘图</canvas>
+            <div class="picBoard" id="picBoard" style=""></div>
+        </div>
+        <div class="operateBar">
+            <button id="J_prevStep" class="prevStep" title="上一步">
+                <em class="icon"></em>
+            </button>
+            <button id="J_nextStep" class="nextStep" title="下一步">
+                <em class="icon"></em>
+            </button>
+            <button id="J_clearBoard" class="clearBoard" title="清空">
+                <em class="icon"></em>
+            </button>
+            <!--<span id="J_sacleBoard" class="scaleBoard">-->
+                <!--<em class="icon"></em>-->
+                <!--<em class="text">缩放背景</em>-->
+            <!--</span>-->
+        </div>
+    </div>
+    <div class="drawToolbar border_style">
+        <div class="colorBar">
+            <span data-color="#0099CC" style="background:#0099CC;" class="active"></span>
+            <span data-color="#003366" style="background:#003366;"></span>
+            <span data-color="#993333" style="background:#993333;"></span>
+            <span data-color="#FF9900" style="background:#FF9900;"></span>
+            <span data-color="#0000CC" style="background:#0000CC;"></span>
+            <span data-color="#CC3333" style="background:#CC3333;"></span>
+
+            <span data-color="#F4D03F" style="background:#641E16;"></span>
+            <span data-color="#4A235A" style="background:#4A235A;"></span>
+            <span data-color="#009966" style="background:#009966;"></span>
+            <span data-color="#ffff00" style="background:#ffff00;"></span>
+            <span data-color="#7D6608" style="background:#7D6608;"></span>
+            <span data-color="#FF33CC" style="background:#FF33CC;"></span>
+
+            <span data-color="#c00000" style="background:#641E16;"></span>
+            <span data-color="#ffffff" style="background:#ffffff;"></span>
+            <span data-color="#9bbb59" style="background:#9bbb59;"></span>
+            <span data-color="#CCFFFF" style="background:#CCFFFF;"></span>
+            <span data-color="#FFCCCC" style="background:#FFCCCC;"></span>
+            <span data-color="#CC99CC" style="background:#CC99CC;"></span>
+        </div>
+
+        <div class="sectionBar">
+            <em class="brushIcon"></em>
+            <a href="javascript:void(0)" class="brush-size size1">1</a>
+            <a href="javascript:void(0)" class="brush-size size2">3</a>
+            <a href="javascript:void(0)" class="brush-size size3">5</a>
+            <a href="javascript:void(0)" class="brush-size size4">7</a>
+        </div>
+        <div class="sectionBar">
+            <em class="eraserIcon"></em>
+            <a href="javascript:void(0)" class="eraser-size size1">5</a>
+            <a href="javascript:void(0)" class="eraser-size size2">10</a>
+            <a href="javascript:void(0)" class="eraser-size size3">15</a>
+            <a href="javascript:void(0)" class="eraser-size size4">20</a>
+        </div>
+
+        <div class="sectionBar">
+            <em class="blurIcon"></em>
+            <a href="javascript:void(0)" class="blur-size size1">2</a>
+            <a href="javascript:void(0)" class="blur-size size2">4</a>
+            <a href="javascript:void(0)" class="blur-size size3">6</a>
+            <a href="javascript:void(0)" class="blur-size size4">8</a>
+        </div>
+
+        <div class="sectionBar">
+            <span id="clearSetting" class="clearSetting">
+                <em class="icon"></em>
+                <em class="text">初始化设置</em>
+            </span>
+        </div>
+
+        <div class="sectionBar">
+            <div id="J_addImg" class="addImgH">
+                <em class="icon"></em>
+                <em class="text">添加背景</em>
+                <input type="file" class="upload" id="J_canvas_bg"
+                       accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>
+
+            </div>
+        </div>
+
+        <div class="sectionBar">
+            <span id="J_removeImg" class="removeImg">
+                <em class="icon"></em>
+                <em class="text">删除背景</em>
+            </span>
+        </div>
+
+        <div class="sectionBar">
+            <span id="J_saveImg" class="saveImg">
+                <em class="icon"></em>
+                <em class="text">保存图片</em>
+            </span>
+        </div>
+
+    </div>
+</div>
+
+<script type="text/javascript" src="scrawl/libs/jquery.min.js"></script>
+<script type="text/javascript" src="scrawl.js"></script>
+<script>
+    new Canvas({
+        canvasId : "canvas-borad",
+        width : 700,
+        height : 400,
+        save : function(data) {
+            $.post("upload.php", {imgBase64: data}, function(res) {
+                if (res.code == "000") {
+                	alert("图片保存成功!");
+                	location.href = res.url;
+                } else {
+                	alert(res.url);
+                }
+            }, "json");
+        }
+    });
+</script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/graft/scrawl.js b/public/assets/addons/nkeditor/plugins/graft/scrawl.js
new file mode 100644
index 0000000..fe13f07
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/graft/scrawl.js
@@ -0,0 +1,262 @@
+/**
+ * Created by yangjian on 17-9-18.
+ */
+(function($) {
+
+	// 设置元素可用状态
+	$.fn.enable = function() {
+		$(this).addClass("active");
+		$(this).removeAttr("disabled");
+	}
+
+	// 设置元素不可用状态
+	$.fn.disable = function() {
+		$(this).removeClass("active");
+		$(this).attr("disabled", true);
+	}
+
+	var Canvas = function(options) {
+
+		var configs = {
+			width : 360,
+			height : 300
+		}; //默认配置
+		options = options || {};
+		$.extend(configs, options);
+
+		var canvas = $("#"+configs.canvasId)[0]; //画布
+		canvas.width = configs.width;
+		canvas.height = configs.height;
+		var context = canvas.getContext("2d"); //绘图环境
+		context.lineCap = "round"; //设置线条两端为圆弧
+		context.lineJoin = "round"; //设置线条转折为圆弧
+		//设置默认颜色
+		setColor();
+		var $prevBtn = $("#J_prevStep"); //上一步
+		var $nextBtn = $("#J_nextStep"); //下一步
+		var $clearBtn = $("#J_clearBoard"); //清空画板
+		var drawing = false; //是否正在绘制
+		var erasering = false; //是否正在擦除
+		var prevSteps = []; //返回上一步操作集合
+		var nextSteps = []; //恢复下一步操作集合
+		var o = {};
+
+		$("#picBoard").css({
+			width : configs.width + "px",
+			height : configs.height + "px"
+		});
+
+		// 事件绑定
+		canvas.onmousedown = startDrawing;
+		canvas.onmouseup = stopDrawing;
+		canvas.onmouseout = stopDrawing;
+		canvas.onmousemove = doDrawing;
+		$prevBtn.on("click", gotoPrevStep);
+		$nextBtn.on("click", gotoNextStep);
+		$clearBtn.on("click", clearBoard);
+
+		// 清空设置
+		$("#clearSetting").on("click", function() {
+			context.lineWidth = 1;
+			setColor($(".colorBar span:first").data("color"));
+			context.shadowBlur = 0;
+			alert("画笔已重新初始化,请重新配置画笔。");
+		});
+
+		//上传背景图片
+		$("#J_canvas_bg").on("change", function() {
+
+			if ($("#picBoard img").length > 0) {
+				$("#picBoard img:eq(0)").attr("src", window.URL.createObjectURL(this.files[0]));
+				return;
+			}
+			var $img = '<img src="'+window.URL.createObjectURL(this.files[0])+'" width="'+configs.width+'" height="'+configs.height+'" />';
+			$("#picBoard").append($img);
+
+			// 激活删除背景按钮
+			$("#J_removeImg").enable();
+
+		});
+
+		// 删除背景图片
+		$("#J_removeImg").on("click", function() {
+			$("#picBoard").empty();
+			$(this).disable();
+		});
+
+		//保存图片
+		$('#J_saveImg').on("click", saveImage);
+
+		// 设置笔刷大小
+		$("#scrawl-main .brush-size").on("click", function() {
+
+			context.restore(); //恢复到canvas的上一个状态
+			context.lineWidth = parseInt($(this).text());
+			erasering = false;
+
+		});
+
+		// 设置笔触虚化
+		$("#scrawl-main .blur-size").on("click", function() {
+			context.shadowBlur = parseInt($(this).text());
+		});
+
+		// 橡皮擦功能
+		$("#scrawl-main .eraser-size").on("click", function() {
+
+			if (erasering == true) {
+				return;
+			}
+			erasering = true;
+			context.save(); //保存canvas状态
+			context.lineCap = "round"; //设置线条两端为圆弧
+			context.lineJoin = "round"; //设置线条转折为圆弧
+			context.lineWidth = 10;
+			context.globalCompositeOperation = "destination-out";
+
+		});
+
+		//设置颜色
+		$("#scrawl-main .colorBar span").on("click",function() {
+
+			$("#scrawl-main .colorBar .active").removeClass("active");
+			$(this).addClass("active");
+			setColor($(this).data("color"));
+		});
+
+		// 开始绘制
+		function startDrawing(e) {
+			drawing = true;
+			//记录上一步的数据
+			prevSteps.push(context.getImageData(0, 0, configs.width, configs.height));
+			// 创建一个新的绘图路径
+			context.beginPath();
+			// 把画笔移动到鼠标位置
+			var offset = $(canvas).offset();
+			context.moveTo(e.pageX - offset.left, e.pageY - offset.top);
+		}
+
+		// 停止绘制
+		function stopDrawing() {
+
+			drawing = false;
+			//清空下一步的数据集合,从新开始记录
+			nextSteps = [];
+			$nextBtn.disable();
+			if (prevSteps.length == 1) {
+				$prevBtn.enable();
+				$clearBtn.enable();
+			}
+		}
+
+		//绘制图像
+		function doDrawing(e) {
+			if (drawing) {
+				// 找到鼠标最新位置
+				var offset = $(canvas).offset();
+				var x = e.pageX - offset.left;
+				var y = e.pageY - offset.top;
+				// 画一条直线到鼠标最新位置
+				context.lineTo(x, y);
+				context.stroke();
+			}
+		}
+
+		/**
+		 * 返回上一步操作
+		 */
+		function gotoPrevStep() {
+			if (prevSteps.length > 0) {
+				//保存当前状态到下一步的操作历史库
+				nextSteps.push(context.getImageData(0, 0, configs.width, configs.height));
+				var popData = prevSteps.pop();
+				context.putImageData(popData, 0, 0);
+				$nextBtn.enable();
+
+				if (prevSteps.length == 0) {
+					$prevBtn.disable();
+				}
+			}
+		}
+
+		/**
+		 * 恢复下一步操作
+		 */
+		function gotoNextStep() {
+			if (nextSteps.length > 0) {
+				//保存当前状态到上一步的操作历史库
+				prevSteps.push(context.getImageData(0, 0, configs.width, configs.height));
+				var imgData = nextSteps.pop();
+				context.putImageData(imgData, 0, 0);
+				$prevBtn.enable();
+
+				if (nextSteps.length == 0) {
+					$nextBtn.disable();
+				}
+			}
+		}
+
+		/**
+		 * 清空画板
+		 */
+		function clearBoard() {
+			context.clearRect(0, 0, context.canvas.width, context.canvas.height);
+			prevSteps = [];
+			nextSteps = [];
+
+			$prevBtn.disable();
+			$nextBtn.disable();
+			$clearBtn.disable();
+		}
+
+		/**
+		 * 设置画笔颜色
+		 * @param color
+		 */
+		function setColor(color) {
+			if (!color) {
+				color = $(".colorBar .active:eq(0)").data("color");
+			}
+			context.strokeStyle = color;
+			context.shadowColor = color;
+		}
+
+		/**
+		 * 获取图片 base64 编码
+		 */
+		function saveImage(callback) {
+
+			if ($("#picBoard img").length > 0) {
+				var image = new Image();
+				image.src = $("#picBoard img:eq(0)").attr("src");
+				image.onload = function() {
+					context.save();
+					context.shadowBlur = 0;
+					context.shadowColor = '#FFF';
+					context.globalCompositeOperation = "destination-atop";
+					context.drawImage(this, 0, 0, configs.width, configs.height);
+					context.restore();
+
+					callback(canvas.toDataURL("image/png"));
+				}
+
+			} else {
+				callback(canvas.toDataURL("image/png"));
+			}
+		}
+
+
+		//要导出的API
+		o.nextStep = gotoNextStep;
+		o.prevStep = gotoNextStep;
+		o.setColor = setColor;
+		o.save = saveImage;
+		o.isEmpty = function() {
+			return prevSteps.length == 0;
+		}
+		return o;
+	}
+
+
+	window.Canvas = Canvas;
+})(jQuery);
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/image/image.js b/public/assets/addons/nkeditor/plugins/image/image.js
new file mode 100644
index 0000000..dc4848a
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/image/image.js
@@ -0,0 +1,340 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('image', function(K) {
+	var self = this, name = 'image',
+		allowImageUpload = K.undef(self.allowImageUpload, true),
+		allowImageRemote = K.undef(self.allowImageRemote, true),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		imageTabIndex = K.undef(self.imageTabIndex, 0),
+		imgPath = self.pluginsPath + 'image/images/',
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false),
+		lang = self.lang(name + '.');
+
+	self.plugin.imageDialog = function(options) {
+		var imageUrl = options.imageUrl,
+			imageWidth = K.undef(options.imageWidth, ''),
+			imageHeight = K.undef(options.imageHeight, ''),
+			imageTitle = K.undef(options.imageTitle, ''),
+			imageAlign = K.undef(options.imageAlign, ''),
+			showRemote = K.undef(options.showRemote, true),
+			showLocal = K.undef(options.showLocal, true),
+			tabIndex = K.undef(options.tabIndex, 0),
+			clickFn = options.clickFn;
+		var target = 'kindeditor_upload_iframe_' + new Date().getTime();
+		var hiddenElements = [];
+		for(var k in extraParams){
+			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+		}
+		var html = [
+			'<div class="ke-dialog-content-inner">',
+			//tabs
+			'<div class="tabs"></div>',
+			//remote image - start
+			'<div class="tab1" style="display:none;">',
+			//url
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label for="remoteUrl" class="row-left">' + lang.remoteUrl + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:250px;" /> &nbsp;',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+			'</span>',
+			'</div>',
+			'</div>',
+			//size
+			'<div class="ke-dialog-row ke-clearfix ">',
+			'<label for="remoteWidth" class="row-left">' + lang.size + ':</label>',
+			'<div class="row-right">'+lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',
+			lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ',
+			'<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />',
+			'</div>',
+			'</div>',
+			//align
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label class="row-left">' + lang.align + ':</label>',
+			'<div class="row-right">',
+			'<span><input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> ' +
+			'<img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" /></span>',
+
+			' <span><input type="radio" name="align" class="ke-inline-block" value="left" /> ' +
+			'<img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" /></span>',
+
+			' <span><input type="radio" name="align" class="ke-inline-block" value="right" /> ' +
+			'<img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" /></span>',
+			'</div>',
+			'</div>',
+			//title
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label for="remoteTitle" class="row-left">' + lang.imgTitle + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:250px;" />',
+			'</div>',
+			'</div>',
+			'</div>',
+			//remote image - end
+			//local upload - start
+			'<div class="tab2" style="display:none;">',
+			'<iframe name="' + target + '" style="display:none;"></iframe>',
+			'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'fileType=image') + '">',
+			//file
+			'<div class="ke-dialog-row ke-clearfix">',
+			hiddenElements.join(''),
+			'<label class="row-left">' + lang.localUrl + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:250px;" readonly="true" /> &nbsp;',
+			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" />',
+			'</div>',
+			'</div>',
+			'</form>',
+			'</div>',
+			//local upload - end
+			'</div>'
+		].join('');
+
+		var dialogWidth = showLocal || allowFileManager ? 450 : 400,
+			dialogHeight = showLocal && showRemote ? 310 : 260;
+		var dialog = self.createDialog({
+			name : name,
+			width : dialogWidth,
+			height : dialogHeight,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					// Bugfix: http://code.google.com/p/kindeditor/issues/detail?id=319
+					if (dialog.isLoading) {
+						return;
+					}
+					// insert local image
+					if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) {
+						if (uploadbutton.fileBox.val() == '') {
+							K.options.errorMsgHandler(self.lang('pleaseSelectFile'), "error");
+							return;
+						}
+						dialog.showLoading(self.lang('uploadLoading'));
+						uploadbutton.submit();
+						localUrlBox.val('');
+						return;
+					}
+					// insert remote image
+					var url = K.trim(urlBox.val()),
+						width = widthBox.val(),
+						height = heightBox.val(),
+						title = titleBox.val(),
+						align = '';
+					alignBox.each(function() {
+						if (this.checked) {
+							align = this.value;
+							return false;
+						}
+					});
+					if (url == 'http://' || K.invalidUrl(url)) {
+						K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+						urlBox[0].focus();
+						return;
+					}
+					if (!/^\d*$/.test(width)) {
+						K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+						widthBox[0].focus();
+						return;
+					}
+					if (!/^\d*$/.test(height)) {
+						K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+						heightBox[0].focus();
+						return;
+					}
+					clickFn.call(self, url, title, width, height, 0, align);
+				}
+			},
+			beforeRemove : function() {
+				viewServerBtn.unbind();
+				widthBox.unbind();
+				heightBox.unbind();
+				refreshBtn.unbind();
+			}
+		}),
+		div = dialog.div;
+
+		var urlBox = K('[name="url"]', div),
+			localUrlBox = K('[name="localUrl"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('.tab1 [name="width"]', div),
+			heightBox = K('.tab1 [name="height"]', div),
+			refreshBtn = K('.ke-refresh-btn', div),
+			titleBox = K('.tab1 [name="title"]', div),
+			alignBox = K('.tab1 [name="align"]', div);
+
+		var tabs;
+		if (showRemote && showLocal) {
+			tabs = K.tabs({
+				src : K('.tabs', div),
+				afterSelect : function(i) {}
+			});
+			tabs.add({
+				title : lang.remoteImage,
+				panel : K('.tab1', div)
+			});
+			tabs.add({
+				title : lang.localImage,
+				panel : K('.tab2', div)
+			});
+			tabs.select(tabIndex);
+		} else if (showRemote) {
+			K('.tab1', div).show();
+		} else if (showLocal) {
+			K('.tab2', div).show();
+		}
+
+		var uploadbutton = K.uploadbutton({
+			button : K('.ke-upload-button', div)[0],
+			fieldName : filePostName,
+			form : K('.ke-form', div),
+			target : target,
+			width: 60,
+			afterUpload : function(data) {
+
+				dialog.hideLoading();
+				if (data.code == "000") {
+
+					K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+
+					var url = data.data.url;
+					if (formatUploadUrl) {
+						url = K.formatUrl(url, 'absolute');
+					}
+					if (!fillDescAfterUploadImage) {
+						clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align);
+					} else {
+						K(".ke-dialog-row ke-clearfix #remoteUrl", div).val(url);
+						K(".ke-tabs-li", div)[0].click();
+						K(".ke-refresh-btn", div).click();
+					}
+				} else {
+					K.options.errorMsgHandler(data.message, "error");
+				}
+			},
+			afterError : function(html) {
+				dialog.hideLoading();
+				self.errorDialog(html);
+			}
+		});
+		uploadbutton.fileBox.change(function(e) {
+			localUrlBox.val(uploadbutton.fileBox.val());
+		});
+		if (allowFileManager) {
+			viewServerBtn.click(function(e) {
+				self.loadPlugin('filemanager', function() {
+					self.plugin.filemanagerDialog({
+						dirName : 'image',
+						clickFn : function(url) {
+							K('[name="url"]', div).val(url);
+							if (self.afterSelectFile) {
+								self.afterSelectFile.call(self, url);
+							}
+						}
+					});
+				});
+			});
+		} else {
+			viewServerBtn.hide();
+		}
+		var originalWidth = 0, originalHeight = 0;
+		function setSize(width, height) {
+			widthBox.val(width);
+			heightBox.val(height);
+			originalWidth = width;
+			originalHeight = height;
+		}
+		refreshBtn.click(function(e) {
+			var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({
+				position : 'absolute',
+				visibility : 'hidden',
+				top : 0,
+				left : '-1000px'
+			});
+			tempImg.bind('load', function() {
+				setSize(tempImg.width(), tempImg.height());
+				tempImg.remove();
+			});
+			K(document.body).append(tempImg);
+		});
+		widthBox.change(function(e) {
+			if (originalWidth > 0) {
+				heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10)));
+			}
+		});
+		heightBox.change(function(e) {
+			if (originalHeight > 0) {
+				widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10)));
+			}
+		});
+		urlBox.val(options.imageUrl);
+		setSize(options.imageWidth, options.imageHeight);
+		titleBox.val(options.imageTitle);
+		alignBox.each(function() {
+			if (this.value === options.imageAlign) {
+				this.checked = true;
+				return false;
+			}
+		});
+		if (showRemote && tabIndex === 0) {
+			urlBox[0].focus();
+			urlBox[0].select();
+		}
+		return dialog;
+	};
+	self.plugin.image = {
+		edit : function() {
+			var img = self.plugin.getSelectedImage();
+			self.plugin.imageDialog({
+				imageUrl : img ? img.attr('data-ke-src') : 'http://',
+				imageWidth : img ? img.width() : '',
+				imageHeight : img ? img.height() : '',
+				imageTitle : img ? img.attr('title') : '',
+				imageAlign : img ? img.attr('align') : '',
+				showRemote : allowImageRemote,
+				showLocal : allowImageUpload,
+				tabIndex: img ? 0 : imageTabIndex,
+				clickFn : function(url, title, width, height, border, align) {
+					if (img) {
+						img.attr('src', url);
+						img.attr('data-ke-src', url);
+						img.attr('width', width);
+						img.attr('height', height);
+						img.attr('title', title);
+						img.attr('align', align);
+						img.attr('alt', title);
+					} else {
+						self.exec('insertimage', url, title, width, height, border, align);
+					}
+					// Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog
+					setTimeout(function() {
+						self.hideDialog().focus();
+					}, 0);
+				}
+			});
+		},
+		'delete' : function() {
+			var target = self.plugin.getSelectedImage();
+			if (target.parent().name == 'a') {
+				target = target.parent();
+			}
+			target.remove();
+			// [IE] 删除图片后立即点击图片按钮出错
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.image.edit);
+});
diff --git a/public/assets/addons/nkeditor/plugins/image/images/align_left.gif b/public/assets/addons/nkeditor/plugins/image/images/align_left.gif
new file mode 100644
index 0000000..ab17f56
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/image/images/align_left.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/image/images/align_right.gif b/public/assets/addons/nkeditor/plugins/image/images/align_right.gif
new file mode 100644
index 0000000..e8ebe6a
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/image/images/align_right.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/image/images/align_top.gif b/public/assets/addons/nkeditor/plugins/image/images/align_top.gif
new file mode 100644
index 0000000..d8826a5
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/image/images/align_top.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/image/images/refresh.png b/public/assets/addons/nkeditor/plugins/image/images/refresh.png
new file mode 100644
index 0000000..77e12d1
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/image/images/refresh.png differ
diff --git a/public/assets/addons/nkeditor/plugins/insertfile/insertfile.js b/public/assets/addons/nkeditor/plugins/insertfile/insertfile.js
new file mode 100644
index 0000000..12d6e27
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/insertfile/insertfile.js
@@ -0,0 +1,141 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('insertfile', function(K) {
+	var self = this, name = 'insertfile',
+		allowFileUpload = K.undef(self.allowFileUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		lang = self.lang(name + '.');
+	self.plugin.fileDialog = function(options) {
+		var fileUrl = K.undef(options.fileUrl, 'http://'),
+			fileTitle = K.undef(options.fileTitle, ''),
+			clickFn = options.clickFn;
+		var html = [
+			'<div class="ke-dialog-content-inner">',
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;',
+			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+			'</span>',
+			'</div>',
+			'</div>',
+			//title
+			'<div class="ke-dialog-row ke-clearfix">',
+			'<label for="keTitle" class="row-left">' + lang.title + ':</label>',
+			'<div class="row-right">',
+			'<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',
+			'</div>',
+			'</div>',
+			//form end
+			'</form>',
+			'</div>'
+			].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 450,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var url = K.trim(urlBox.val()),
+						title = titleBox.val();
+					if (url == 'http://' || K.invalidUrl(url)) {
+						K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+						urlBox[0].focus();
+						return;
+					}
+					if (K.trim(title) === '') {
+						title = url;
+					}
+					clickFn.call(self, url, title);
+				}
+			}
+		}),
+		div = dialog.div;
+
+		var urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			titleBox = K('[name="title"]', div);
+
+		if (allowFileUpload) {
+			var uploadbutton = K.uploadbutton({
+				button : K('.ke-upload-button', div)[0],
+				fieldName : filePostName,
+				url : K.addParam(uploadJson, 'fileType=file'),
+				extraParams : extraParams,
+				afterUpload : function(data) {
+					dialog.hideLoading();
+					if (data.code === "000") {
+						var url = data.data.url;
+						if (formatUploadUrl) {
+							url = K.formatUrl(url, 'absolute');
+						}
+						urlBox.val(url);
+						if (self.afterUpload) {
+							self.afterUpload.call(self, url, data, name);
+						}
+						K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+					} else {
+						K.options.errorMsgHandler(data.message, "error");
+					}
+				},
+				afterError : function(html) {
+					dialog.hideLoading();
+					self.errorDialog(html);
+				}
+			});
+			uploadbutton.fileBox.change(function(e) {
+				dialog.showLoading(self.lang('uploadLoading'));
+				uploadbutton.submit();
+			});
+		} else {
+			K('.ke-upload-button', div).hide();
+		}
+		if (allowFileManager) {
+			viewServerBtn.click(function(e) {
+				self.loadPlugin('filemanager', function() {
+					self.plugin.filemanagerDialog({
+						viewType : 'LIST',
+						dirName : 'file',
+						clickFn : function(url) {
+							//console.log(url);
+							K('[name="url"]', div).val(url);
+							if (self.afterSelectFile) {
+								self.afterSelectFile.call(self, url);
+							}
+						}
+					});
+				});
+			});
+		} else {
+			K("#keUrl").css("width", "250px");
+			viewServerBtn.hide();
+		}
+		urlBox.val(fileUrl);
+		titleBox.val(fileTitle);
+		urlBox[0].focus();
+		urlBox[0].select();
+	};
+	self.clickToolbar(name, function() {
+		self.plugin.fileDialog({
+			clickFn : function(url, title) {
+				var html = '<a class="ke-insertfile" href="' + url + '" data-ke-src="' + url + '" target="_blank">' + title + '</a>';
+				self.insertHtml(html).hideDialog().focus();
+			}
+		});
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/lineheight/lineheight.js b/public/assets/addons/nkeditor/plugins/lineheight/lineheight.js
new file mode 100644
index 0000000..ae679d7
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/lineheight/lineheight.js
@@ -0,0 +1,38 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('lineheight', function(K) {
+	var self = this, name = 'lineheight', lang = self.lang(name + '.');
+	self.clickToolbar(name, function() {
+		var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'});
+		if (commonNode) {
+			curVal = commonNode.css('line-height');
+		}
+		var menu = self.createMenu({
+			name : name,
+			width : 150
+		});
+		K.each(lang.lineHeight, function(i, row) {
+			K.each(row, function(key, val) {
+				menu.addItem({
+					title : val,
+					checked : curVal === key,
+					click : function() {
+						self.cmd.toggle('<span style="line-height:' + key + ';"></span>', {
+							span : '.line-height=' + key
+						});
+						self.updateState();
+						self.addBookmark();
+						self.hideMenu();
+					}
+				});
+			});
+		});
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/link/link.js b/public/assets/addons/nkeditor/plugins/link/link.js
new file mode 100644
index 0000000..9a42fbd
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/link/link.js
@@ -0,0 +1,71 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('link', function(K) {
+	var self = this, name = 'link';
+	self.plugin.link = {
+		edit : function() {
+			var lang = self.lang(name + '.'),
+				html = ['<div class="ke-dialog-content-inner">',
+				//url
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+				'<div class="row-right">',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" />',
+				'</div>',
+				'</div>',
+				//type
+				'<div class="ke-dialog-row ke-clearfix"">',
+				'<label for="keType" class="row-left">' + lang.linkType + ':</label>',
+				'<div class="row-right">',
+				'<select id="keType" class="ke-select" name="type"></select>',
+				'</div>',
+				'</div>',
+				'</div>'].join(""),
+				dialog = self.createDialog({
+					name : name,
+					width : 450,
+					title : self.lang(name),
+					body : html,
+					yesBtn : {
+						name : self.lang('yes'),
+						click : function(e) {
+							var url = K.trim(urlBox.val());
+							if (url == 'http://' || K.invalidUrl(url)) {
+								K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+								urlBox[0].focus();
+								return;
+							}
+							self.exec('createlink', url, typeBox.val()).hideDialog().focus();
+						}
+					}
+				}),
+				div = dialog.div,
+				urlBox = K('input[name="url"]', div),
+				typeBox = K('select[name="type"]', div);
+			urlBox.val('http://');
+			typeBox[0].options[0] = new Option(lang.newWindow, '_blank');
+			typeBox[0].options[1] = new Option(lang.selfWindow, '');
+			self.cmd.selection();
+			var a = self.plugin.getSelectedLink();
+			if (a) {
+				self.cmd.range.selectNode(a[0]);
+				self.cmd.select();
+				urlBox.val(a.attr('data-ke-src'));
+				typeBox.val(a.attr('target'));
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.exec('unlink', null);
+		}
+	};
+	self.clickToolbar(name, self.plugin.link.edit);
+});
diff --git a/public/assets/addons/nkeditor/plugins/map/map.html b/public/assets/addons/nkeditor/plugins/map/map.html
new file mode 100644
index 0000000..fb27555
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/map/map.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+	<head>
+	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
+	<style>
+		html { height: 100% }
+		body { height: 100%; margin: 0; padding: 0; background-color: #FFF }
+		#map_canvas { height: 100% }
+	</style>
+	<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=zh_CN"></script>
+	<script>
+		var map, geocoder;
+		function initialize() {
+			var latlng = new google.maps.LatLng(-34.397, 150.644);
+			var options = {
+				zoom: 11,
+				center: latlng,
+				disableDefaultUI: true,
+				panControl: true,
+				zoomControl: true,
+				mapTypeControl: true,
+				scaleControl: true,
+				streetViewControl: false,
+				overviewMapControl: true,
+				mapTypeId: google.maps.MapTypeId.ROADMAP
+			};
+			map = new google.maps.Map(document.getElementById("map_canvas"), options);
+			geocoder = new google.maps.Geocoder();
+			geocoder.geocode({latLng: latlng}, function(results, status) {
+				if (status == google.maps.GeocoderStatus.OK) {
+					if (results[3]) {
+						parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;
+					}
+				}
+			});
+		}
+		function search(address) {
+			if (!map) return;
+			geocoder.geocode({address : address}, function(results, status) {
+				if (status == google.maps.GeocoderStatus.OK) {
+					map.setZoom(11);
+					map.setCenter(results[0].geometry.location);
+					var marker = new google.maps.Marker({
+						map: map,
+						position: results[0].geometry.location
+					});
+				} else {
+					alert("Invalid address: " + address);
+				}
+			});
+		}
+	</script>
+	</head>
+	<body onload="initialize();">
+		<div id="map_canvas" style="width:100%; height:100%"></div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/map/map.js b/public/assets/addons/nkeditor/plugins/map/map.js
new file mode 100644
index 0000000..5290875
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/map/map.js
@@ -0,0 +1,137 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Google Maps: http://code.google.com/apis/maps/index.html
+
+KindEditor.plugin('map', function(K) {
+	var self = this, name = 'map', lang = self.lang(name + '.');
+	self.clickToolbar(name, function() {
+		var html = ['<div style="padding:10px 20px;">',
+			'<div class="ke-dialog-row">',
+			lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
+			'</span>',
+			'</div>',
+			'<div class="ke-map" style="width:558px;height:360px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 600,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var geocoder = win.geocoder,
+						map = win.map,
+						center = map.getCenter().lat() + ',' + map.getCenter().lng(),
+						zoom = map.getZoom(),
+						maptype = map.getMapTypeId(),
+						url = 'http://maps.googleapis.com/maps/api/staticmap';
+						url += '?center=' + encodeURIComponent(center);
+						url += '&zoom=' + encodeURIComponent(zoom);
+						url += '&size=558x360';
+						url += '&maptype=' + encodeURIComponent(maptype);
+						url += '&markers=' + encodeURIComponent(center);
+						url += '&language=' + self.langType;
+						url += '&sensor=false';
+					self.exec('insertimage', url).hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			win, doc;
+		var iframeHtml = ['<!doctype html><html><head>',
+			'<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',
+			'<style>',
+			'	html { height: 100% }',
+			'	body { height: 100%; margin: 0; padding: 0; background-color: #FFF }',
+			'	#map_canvas { height: 100% }',
+			'</style>',
+			'<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=' + self.langType + '"></script>',
+			'<script>',
+			'var map, geocoder;',
+			'function initialize() {',
+			'	var latlng = new google.maps.LatLng(31.230393, 121.473704);',
+			'	var options = {',
+			'		zoom: 11,',
+			'		center: latlng,',
+			'		disableDefaultUI: true,',
+			'		panControl: true,',
+			'		zoomControl: true,',
+			'		mapTypeControl: true,',
+			'		scaleControl: true,',
+			'		streetViewControl: false,',
+			'		overviewMapControl: true,',
+			'		mapTypeId: google.maps.MapTypeId.ROADMAP',
+			'	};',
+			'	map = new google.maps.Map(document.getElementById("map_canvas"), options);',
+			'	geocoder = new google.maps.Geocoder();',
+			'	geocoder.geocode({latLng: latlng}, function(results, status) {',
+			'		if (status == google.maps.GeocoderStatus.OK) {',
+			'			if (results[3]) {',
+			'				parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',
+			'			}',
+			'		}',
+			'	});',
+			'}',
+			'function search(address) {',
+			'	if (!map) return;',
+			'	geocoder.geocode({address : address}, function(results, status) {',
+			'		if (status == google.maps.GeocoderStatus.OK) {',
+			'			map.setZoom(11);',
+			'			map.setCenter(results[0].geometry.location);',
+			'			var marker = new google.maps.Marker({',
+			'				map: map,',
+			'				position: results[0].geometry.location',
+			'			});',
+			'		} else {',
+			'			alert("Invalid address: " + address);',
+			'		}',
+			'	});',
+			'}',
+			'</script>',
+			'</head>',
+			'<body onload="initialize();">',
+			'<div id="map_canvas" style="width:100%; height:100%"></div>',
+			'</body></html>'].join('\n');
+		// TODO:用doc.write(iframeHtml)方式加载时,在IE6上第一次加载报错,暂时使用src方式
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'map/map.html" style="width:558px;height:360px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+			//doc.open();
+			//doc.write(iframeHtml);
+			//doc.close();
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/media/media.js b/public/assets/addons/nkeditor/plugins/media/media.js
new file mode 100644
index 0000000..fab7faa
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/media/media.js
@@ -0,0 +1,186 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('media', function(K) {
+	var self = this, name = 'media', lang = self.lang(name + '.'),
+		allowMediaUpload = K.undef(self.allowMediaUpload, false),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+
+	self.plugin.media = {
+		edit : function() {
+			var html = [
+				'<div class="ke-dialog-content-inner">',
+				//url
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keUrl" class="row-left">' + lang.url + ':</label>',
+				'<div class="row-right">',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:180px;" /> &nbsp;',
+				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+				'<span class="ke-button-common ke-button-outer">',
+				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+				'</span>',
+				'<div>支持优酷、爱奇艺、土豆、腾讯视频、56等视频网站【<span style="color:green">通用代码</span>】',
+				'</div>',
+				'</div>',
+				'</div>',
+				//width
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keWidth" class="row-left">' + lang.width + ':</label>',
+				'<div class="row-right">',
+				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',
+				'</div>',
+				'</div>',
+				//height
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keHeight" class="row-left">' + lang.height + ':</label>',
+				'<div class="row-right">',
+				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',
+				'</div>',
+				'</div>',
+				//autostart
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keAutostart" class="row-left">' + lang.autostart + ':</label>',
+				'<div class="row-right">',
+				'<input type="checkbox" id="keAutostart" name="autostart" class="ke-input-checkbox" value="" /> ',
+				'</div>',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 450,
+				height : 260,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+                        var url = K.trim(urlBox.val()),
+                            width = widthBox.val(),
+                            height = heightBox.val();
+                        var match = url.match(/^<iframe\s(.*?)src=('|")(.*?)('|")/);
+                        if(!match) {
+                            if (url == 'http://' || K.invalidUrl(url)) {
+                                K.options.errorMsgHandler(self.lang('invalidUrl'), "error");
+                                urlBox[0].focus();
+                                return;
+                            }
+                        }
+                        if (!/^\d*$/.test(width)) {
+                            K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+                            widthBox[0].focus();
+                            return;
+                        }
+                        if (!/^\d*$/.test(height)) {
+                            K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+                            heightBox[0].focus();
+                            return;
+                        }
+                        if(!match) {
+                            var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+                                src: url,
+                                type: K.mediaType(url),
+                                width: width,
+                                height: height,
+                                autostart: autostartBox[0].checked ? 'true' : 'false',
+                                loop: 'true'
+                            });
+                        } else {
+                            var html = '<iframe src="' + match[3] + '" frameborder="0" style="width:' + width + 'px;height:' + height + 'px;"></iframe>';
+                        }
+                        self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('[name="width"]', div),
+			heightBox = K('[name="height"]', div),
+			autostartBox = K('[name="autostart"]', div);
+			urlBox.val('http://');
+
+			if (allowMediaUpload) {
+				var uploadbutton = K.uploadbutton({
+					button : K('.ke-upload-button', div)[0],
+					fieldName : filePostName,
+					extraParams : extraParams,
+					url : K.addParam(uploadJson, 'fileType=media'),
+					afterUpload : function(data) {
+						dialog.hideLoading();
+						if (data.code == "000") {
+							var url = data.data.url;
+							if (formatUploadUrl) {
+								url = K.formatUrl(url, 'absolute');
+							}
+							urlBox.val(url);
+
+							if (self.afterUpload) {
+								self.afterUpload.call(self, url, data, name);
+							}
+							K.options.errorMsgHandler(self.lang('uploadSuccess'), "ok");
+						} else {
+							K.options.errorMsgHandler(data.message, "error", "error");
+						}
+					},
+					afterError : function(html) {
+						dialog.hideLoading();
+						self.errorDialog(html);
+					}
+				});
+				uploadbutton.fileBox.change(function(e) {
+					dialog.showLoading(self.lang('uploadLoading'));
+					uploadbutton.submit();
+				});
+			} else {
+				K('.ke-upload-button', div).hide();
+			}
+
+			if (allowMediaUpload && allowFileManager) {
+				viewServerBtn.click(function(e) {
+					self.loadPlugin('filemanager', function() {
+						self.plugin.filemanagerDialog({
+							dirName : 'media',
+							clickFn : function(url) {
+								K('[name="url"]', div).val(url);
+								if (self.afterSelectFile) {
+									self.afterSelectFile.call(self, url);
+								}
+							}
+						});
+					});
+				});
+			} else {
+				K("#keUrl").css("width", "280px");
+				viewServerBtn.hide();
+			}
+
+			var img = self.plugin.getSelectedMedia();
+			if (img) {
+				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+				urlBox.val(attrs.src);
+				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+				autostartBox[0].checked = (attrs.autostart === 'true');
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedMedia().remove();
+			// [IE] 删除图片后立即点击图片按钮出错
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.media.edit);
+});
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/BUpload.js b/public/assets/addons/nkeditor/plugins/multiimage/BUpload.js
new file mode 100644
index 0000000..a314e0c
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/multiimage/BUpload.js
@@ -0,0 +1,625 @@
+/**
+ * HTML5上传插件
+ * @site https://git.oschina.net/blackfox/ajaxUpload
+ * @author yangjian<yangjian102621@gmail.com>
+ * @version 1.0.1
+ */
+(function($) {
+
+	//判断浏览器是否支持html5
+	// if ( !window.applicationCache )
+	// 	throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");
+
+	//image crop
+	$.fn.imageCrop = function(__width, __height) {
+		$(this).on("load", function () {
+
+			var width, height, left, top;
+			var orgRate = this.width/this.height;
+			var cropRate = __width/__height;
+			if ( orgRate >= cropRate ) {
+				height = __height;
+				width = __width * orgRate;
+				top = 0;
+				left = (width - __width)/2;
+			} else {
+				width = __width;
+				height = __height / orgRate;
+				left = 0;
+				//top = (height - __height)/2;
+				top = 0;
+			}
+			$(this).css({
+				"position" : "absolute",
+				top : -top + "px",
+				left : -left + "px",
+				width : width + "px",
+				height : height + "px"
+			});
+		});
+	}
+
+	//make element draggable
+	$.fn.draggable = function(options) {
+		var defaults = {
+			handler : null
+		}
+		options = $.extend(defaults, options);
+		var __self = this;
+		$(options.handler).mousedown(function(e) {
+			var offsetLeft = e.pageX - $(__self).position().left;
+			var offsetTop = e.pageY - $(__self).position().top;
+			$(document).mousemove(function(e) {
+				//清除拖动鼠标的时候选择文本
+				window.getSelection ? window.getSelection().removeAllRanges():document.selection.empty();
+				$(__self).css({
+					'top'  : e.pageY-offsetTop + 'px',
+					'left' : e.pageX-offsetLeft + 'px'
+				});
+			});
+
+		}).mouseup(function() {
+			$(document).unbind('mousemove');
+		});
+
+	}
+
+	if ( Array.prototype.remove == undefined ) {
+		Array.prototype.remove = function(item) {
+			for ( var i = 0; i < this.length; i++ ) {
+				if ( this[i] == item ) {
+					this.splice(i, 1);
+					break;
+				}
+			}
+		}
+	}
+	if ( Array.prototype.uinque == undefined ) {
+		Array.prototype.uinque = function() {
+			var result = [], hash = {};
+			for ( var i = 0, item; (item = this[i]) != null; i++ ) {
+				if ( !hash[item] ) {
+					result.push(item);
+					hash[item] = true;
+				}
+			}
+			return result;
+		}
+	}
+
+	window.BUpload = function(options) {
+
+		options = $.extend({
+			src : "src",
+			upload_url : null,
+			list_url : null,
+			data_type : "json",
+			top : 20,
+			fileType : "image", //文件类型,默认是图片,可选flash,media,file
+			max_filesize : 2048,    //unit:KB
+			max_filenum : 20,
+			no_data_text : "(⊙o⊙)亲,没有多数据了。",
+			ext_allow : "jpg|png|gif|jpeg",
+			ext_refuse : "exe|txt",
+			errorHandler : function(messsage, type) {
+				alert(messsage);
+			},
+			callback : function(data) {
+				console.log(data);
+			}
+		}, options);
+
+		//错误代码和提示消息
+		var codeMessageMap = {
+			'000' : '文件上传成功',
+			'001' : '文件上传失败',
+			'003' : '文件大小超出限制',
+			'004' : '非法文件名后缀'
+		};
+
+		var mimeType = {
+			"3gpp":"audio/3gpp, video/3gpp",
+			"ac3":"audio/ac3",
+			"asf":"allpication/vnd.ms-asf",
+			"au":"audio/basic",
+			"css":"text/css",
+			"csv":"text/csv",
+			"doc":"application/msword",
+			"dot":"application/msword",
+			"dtd":"application/xml-dtd",
+			"dwg":"image/vnd.dwg",
+			"dxf":"image/vnd.dxf",
+			"gif":"image/gif",
+			"htm":"text/html",
+			"html":"text/html",
+			"jp2":"image/jp2",
+			"jpe":"image/jpeg",
+			"jpeg":"image/jpeg",
+			"jpg":"image/jpeg",
+			"js":"text/javascript, application/javascript",
+			"json":"application/json",
+			"mp2":"audio/mpeg, video/mpeg",
+			"mp3":"audio/mpeg",
+			"mp4":"audio/mp4, video/mp4",
+			"mpeg":"video/mpeg",
+			"mpg":"video/mpeg",
+			"mpp":"application/vnd.ms-project",
+			"ogg":"application/ogg, audio/ogg",
+			"pdf":"application/pdf",
+			"png":"image/png",
+			"pot":"application/vnd.ms-powerpoint",
+			"pps":"application/vnd.ms-powerpoint",
+			"ppt":"application/vnd.ms-powerpoint",
+			"rtf":"application/rtf, text/rtf",
+			"svf":"image/vnd.svf",
+			"tif":"image/tiff",
+			"tiff":"image/tiff",
+			"txt":"text/plain",
+			"wdb":"application/vnd.ms-works",
+			"wps":"application/vnd.ms-works",
+			"xhtml":"application/xhtml+xml",
+			"xlc":"application/vnd.ms-excel",
+			"xlm":"application/vnd.ms-excel",
+			"xls":"application/vnd.ms-excel",
+			"xlt":"application/vnd.ms-excel",
+			"xlw":"application/vnd.ms-excel",
+			"xml":"text/xml, application/xml",
+			"zip":"aplication/zip",
+			"xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+		}
+
+		var o = {};
+		o.dialog = null;
+		o.todoList = new Array(); //the file queue to be uploaded
+		o.uploadSuccessNum = 0; //已经上传成功的图片数量
+		o.selectedList = new Array(); //the file queue upload successfully
+		o.addedFileNumber = 0; //the numbers of files that has added
+		o.totalFilesize = 0; //total file size
+		o.uploadLock = false; //upload thread lock
+		o.page = 1; //服务器图片列表页码
+		o.marker = null, //七牛云上传的分页标识
+		o.noRecord = false;
+		var dialogSCode = Math.ceil(Math.random() * 1000000000000); //对话框的令牌,如果创建多个BUpload上传对象用来保持唯一性
+
+		//close the dialog
+		o.close = function () {
+			o.dialog.remove();
+			if (typeof options.close == 'function') {
+				options.close();
+			}
+		}
+
+		//create dialog
+		function createDialog() {
+
+			var builder = new StringBuilder();
+			builder.append('<div class="uedbody ke-animated"><div class="ued_title">');
+			builder.append('<div class="uedbar"><span>'+options.lang.title+'</span></div><div class="close_btn icon"' +
+				' title="'+options.lang.closeText+'"></div>');
+			builder.append('</div><div class="wrapper"><div id="wra_head" class="wra_head"><span class="tab' +
+				' tab-upload focus" tab="upload-panel">'+options.lang.localUpload+'</span>');
+			if ( options.list_url != null ) {
+				builder.append('<span class="tab tab-online" tab="online">'+options.lang.fileServer+'</span>');
+			}
+			builder.append('</div><div class="wra_body"><div class="tab-panel upload-panel"><div class="wra_pla"><div class="upload-image-placeholder">');
+			builder.append('<div class="btn btn-primary image-select">'+options.lang.selectFile+'</div><input type="file" name="'+options.src+'" class="webuploader-element-invisible"' +
+				' multiple="multiple" accept="'+getAccept()+'">');
+			builder.append('</div></div><div class="image-list-box" style="display: none;"><div class="wra_bar"><div class="info fl"></div>');
+			builder.append('<div class="fr"><span class="btn btn-default btn-continue-add">'+options.lang.continueAdd+'</span><span class="btn btn-primary btn-start-upload">'+options.lang.startUpload+'</span></div></div>');
+			builder.append('<ul class="filelist"></ul></div></div><div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>');
+			builder.append('<div class="tab-panel searchbox"><div class="search-bar"><input class="searTxt"' +
+				' type="text" placeholder="'+options.lang.searchPlaceholder+'" />');
+			builder.append('<input value="'+options.lang.searchBtn+'" class="btn btn-primary btn-search" type="button" /><input value="'+options.lang.searchClear+'" class="btn btn-default btn-reset" type="button" />');
+			builder.append('</div><div class="search-imagelist-box"><ul class="search-list"></ul><div class="no-data"></div></div>');
+			builder.append('</div><div class="loading-icon"></div></div><!-- end of wrapper --></div><div class="wra-btn-group"><span class="btn btn-primary btn-confirm">'+options.lang.confirmBtnText+'</span>');
+			builder.append('<span class="btn btn-default btn-cancel">'+options.lang.cancelBtnText+'</span></div></div>');
+
+			o.dialog = $(builder.toString());
+			$("body").append(o.dialog);
+			if (options.top == 0) {
+				options.top = ($(window).height() - o.dialog.height())/2;
+			}
+			o.dialog.css({
+				left : ($(window).width() - o.dialog.width())/2 + "px",
+				top : options.top + "px"
+			});
+			//给对话框添加拖拽事件
+			o.dialog.draggable({handler : o.dialog.find(".ued_title")})
+
+		}
+
+		//绑定元素事件
+		function bindEvent() {
+
+			//选项卡事件
+			G(".tab").on("click", function() {
+				var tab = $(this).attr("tab");
+				G(".tab-panel").hide();
+				G("."+tab).show();
+				G(".tab").removeClass("focus");
+				$(this).addClass("focus");
+			});
+
+			//关闭对话框
+			G(".close_btn").on("click", function() {
+				o.close();
+			});
+
+			//选择文件事件
+			G(".webuploader-element-invisible").on("change", function() {
+				addFiles(this);
+			});
+
+			//弹出上传文件选择框
+			G(".image-select").on("click", function() {
+				G(".webuploader-element-invisible").trigger("click");
+			});
+			G(".btn-continue-add").on("click", function() {
+				G(".webuploader-element-invisible").trigger("click");
+			});
+
+			//开始上传按钮事件
+			G(".btn-start-upload").on("click", function() {
+				if ( o.uploadLock ) return;
+
+				if ( o.todoList.length == 0 ) {
+					options.errorHandler(options.lang.noFileAdded, "error");
+					return false;
+				}
+				$(this).addClass("disabled").text(options.lang.uploading);
+				uploadFile(o.todoList.shift());
+			});
+
+			//点击确认|取消按钮事件
+			G(".btn-confirm").on("click", function() {
+				if ( o.todoList.length > 0 ) {
+					options.errorHandler(options.lang.fileNotUpload, "error");
+					return false;
+				}
+				if (o.selectedList.length == 0) {
+					options.errorHandler(options.lang.noFileSelected, "error");
+					return false;
+				}
+				options.callback(o.selectedList);
+				o.close();
+
+			});
+			G(".btn-cancel").on("click", function() {
+				o.close();
+			});
+
+			//从服务器加载文件
+			G(".tab-online").on("click", function() {
+
+				if ( G(".imagelist .list").children().length == 0 ) {
+					loadFilesFromServer()
+				}
+
+			});
+
+			//当滚动条滚到底部时自动去加载图片
+			G(".imagelist").on("scroll", function() {
+
+				if ( this.scrollTop + this.clientHeight >= this.scrollHeight ) {
+					loadFilesFromServer();
+				}
+			});
+		}
+
+		//add file to upload list
+		function addFiles(input) {
+
+			var files = input.files;
+			var totalFileNum = o.todoList.length + o.uploadSuccessNum + files.length; //本次上传文件总数
+			for ( var i = o.addedFileNumber; i < o.addedFileNumber+files.length; i++ ) {
+
+				if ( totalFileNum > options.max_filenum ) {
+					options.errorHandler(KindEditor.tmpl(options.lang.uploadLimit, {uploadLimit: options.max_filenum}), "error");
+					return;
+				}
+				var builder = new StringBuilder();
+				var tempFile = files[i- o.addedFileNumber];
+				builder.append('<li id="img-comtainer-'+dialogSCode+i+'"><div class="imgWrap">');
+
+				//如果上传的不是图片,则通过判断文件后缀来显示不同的图标
+				var extension = getFileExt(tempFile.name);
+				if ( extension == '' ) extension = "default";
+				extension = extension.toLowerCase();
+				if ( "jpg|jpeg|gif|png|bmp".indexOf(extension) == -1 ) {
+					builder.append('<span class="icon-placeholder icon-default icon-'+extension+'"></span>');
+				} else {
+					builder.append('<img src="'+window.URL.createObjectURL(tempFile)+'" border="0" />');
+				}
+
+				builder.append('</div><div class="file-opt-box clearfix"><span class="remove" index="'+i+'">'+options.lang.remove+'</span><span class="rotateRight">'+options.lang.rotateRight+'</span>');
+				builder.append('<span class="rotateLeft">'+options.lang.rotateLeft+'</span></div><div class="success"></div><div class="error"></div>');
+				builder.append('<div class="progress"><span style="display: none; width: 0px;"></span></div></li>');
+
+				var $image = $(builder.toString());
+				//bind onelele event
+				$image.find(".remove").on("click", function() {
+					$(this).parents("li").remove(); //remove element
+					//remove file from todoList
+					var index = $(this).attr("index");
+					for ( var i = 0; i < o.todoList.length; i++ ) {
+						if ( o.todoList[i].index == index ) {
+							o.totalFilesize -= o.todoList[i].file.size;
+							updateInfoText(o.uploadSuccessNum + o.todoList.length-1, o.totalFilesize);
+							o.todoList.splice(i, 1);
+							break;
+						}
+					}
+					if (G(".filelist li").length == 0) {
+						G(".image-list-box").hide();
+						G(".wra_pla").show();
+					}
+				});
+				$image.on("mouseover", function() {
+					$(this).find(".file-opt-box").show();
+				}).on("mouseout", function() {
+					$(this).find(".file-opt-box").hide();
+				});
+
+				G(".wra_pla").hide();
+				G(".image-list-box").show();
+				G(".filelist").append($image);
+
+				o.todoList.push({index:i, file:tempFile});
+				o.totalFilesize += tempFile.size;
+
+				//console.log(tempFile);
+			}
+			o.addedFileNumber += files.length;
+			updateInfoText(o.uploadSuccessNum + o.todoList.length, o.totalFilesize);
+
+			//缩放并裁剪图片
+			$(".imgWrap img").imageCrop(113,113);
+
+		}
+
+		/**
+		 * upload file function(文件上传主函数)
+		 * @param node 数据节点
+		 */
+		function uploadFile(node) {
+
+			if ( !fileCheckHandler(node) ) {
+				uploadNextFile();   //skip the file and upload the next file
+				return;
+			}
+
+			// prepare XMLHttpRequest
+			var xhr = new XMLHttpRequest();
+			xhr.open('POST', options.upload_url);
+			//upload successfully
+			xhr.addEventListener('load',function(e) {
+
+				if ( options.data_type == "json" ) {
+					//console.log(e);
+					var data = $.parseJSON(e.target.responseText);
+					if ( data.code == "000" ) {
+						o.selectedList.push(data.data.url);   //添加文件到上传文件列表
+						o.uploadSuccessNum++;
+						$("#img-comtainer-"+dialogSCode+ node.index).find(".file-opt-box").remove();
+						$("#img-comtainer-"+dialogSCode+ node.index).find(".progress").remove();
+						$("#img-comtainer-"+dialogSCode+ node.index).find(".success").show();
+					} else {
+						__error__(codeMessageMap[data.code], node);
+					}
+				}
+
+			}, false);
+
+			// file upload complete
+			xhr.addEventListener('loadend', function () {
+				uploadNextFile();   //upload the next file
+			}, false);
+
+			//上传失败
+			xhr.addEventListener('error', function() {
+				__error__(options.lang.uploadFail, node);
+			}, false);
+
+			xhr.upload.addEventListener('progress', function(e) {
+				updateProgress(e, node);
+			}, false);
+
+			// prepare FormData
+			var formData = new FormData();
+			formData.append(options.src, node.file);
+			xhr.send(formData);
+
+		}
+
+		//upload next file(上传下一个文件)
+		function uploadNextFile() {
+
+			if ( o.todoList.length ) {
+				var nextFile = o.todoList.shift();
+				uploadFile(nextFile);
+			} else {
+				o.uploadLock = false; //release the upload lock
+				G(".btn-start-upload").removeClass("disabled").text(options.lang.startUpload);
+				//console.log(o.selectedList);
+			}
+		}
+
+		// progress handler(文件上传进度控制)
+		function updateProgress(e, node) {
+			if ( e.lengthComputable ) {
+				$("#img-comtainer-"+dialogSCode+ node.index).find(".progress span").css({"width" : (e.loaded/e.total)*100+'%', "display":"block"});
+			}
+		}
+
+		//update file info text
+		function updateInfoText(filenum, filesize) {
+			var text = KindEditor.tmpl(options.lang.uploadDesc, {numSelect:filenum, totalSize:formatFileSize(filesize), numLeft:(options.max_filenum - filenum)});
+			G(".info").text(text);
+		}
+
+		//format file size(格式化文件大小)
+		function formatFileSize(size) {
+
+			if ( size/1048576 > 1 ) {
+				return (size/1048576).toFixed(2)+"MB";
+			} else {
+				return (size/1024).toFixed(2)+"KB";
+			}
+
+		}
+
+		//file check handler(文件检测处理函数)
+		function fileCheckHandler(node) {
+
+			//检查文件大小
+			var maxsize = options.max_filesize * 1024;
+			if ( maxsize > 0 && node.file.size > maxsize ) {
+				__error__(KindEditor.tmpl(options.lang.sizeLimit, {sizeLimit:options.max_filesize}), node);
+				return false;
+			}
+
+			//检查文件后缀名
+			var ext = getFileExt(node.file.name);
+			if ( ext && options.ext_allow.indexOf(ext) != -1
+				&& options.ext_refuse.indexOf(ext) == -1 ) {
+				return true;
+			} else {
+				__error__(KindEditor.tmpl(options.lang.invalidExt, {invalidExt:ext}), node);
+				return false;
+			}
+
+		}
+
+		//获取文件后缀名
+		function getFileExt(filename) {
+			if ( !filename ) return false;
+			var position = filename.lastIndexOf('.')
+			if ( position != -1 ) {
+				return filename.substr(position+1).toLowerCase();
+			}
+			return false;
+		}
+
+		//获取可接受的文件后缀
+		function getAccept() {
+			var extensions = options.ext_allow.split("|");
+			var accept = [];
+			$.each(extensions, function(idx, item) {
+				accept.push(mimeType[item]);
+			});
+			if ( accept.length > 1 ) {
+				return accept.uinque().join(",");
+			}
+			return "*";
+		}
+
+		//显示上传错误信息
+		function __error__(message, node) {
+			G("#img-comtainer-"+dialogSCode+ node.index).find(".error").show().text(message);
+		}
+
+		//query
+		function G(query) {
+			return o.dialog.find(query);
+		}
+
+		//从服务器上获取图片地址
+		function loadFilesFromServer() {
+			if ( !options.list_url ) {
+				G(".online .no-data").html('<span class="error">'+options.lang.noListUrl+'</span>').show();
+				return false;
+			}
+			if ( o.noRecord ) return false;
+
+			G(".loading-icon").show(); //显示加载图标
+			$.get(options.list_url, {
+				page : o.page,
+				marker : o.marker,
+				fileType : options.fileType,
+			}, function(res) {
+
+				G(".loading-icon").hide(); //隐藏加载图标
+				if ( res.code == "000" ) {
+
+					if (!res.data[0]) { //没有加载到数据
+						G(".online .no-data").text(options.lang.noDataText).show();
+						return;
+					}
+					o.marker = res.extra; //存储marker
+					o.page++;
+					appendFiles(res.data, "online");
+				} else {
+					G(".online .no-data").text(options.lang.noDataText).show();
+					o.noRecord = true;
+				}
+
+			}, "json");
+		}
+
+		//追加元素到图片列表
+		function appendFiles(data, module) {
+
+			$.each(data, function(idx, item) {
+
+				var builder = new StringBuilder();
+				builder.append('<li>');
+				var extension = getFileExt(item.thumbURL);
+				if ( extension == '' ) extension = "default";
+				extension = extension.toLowerCase();
+				//如果不是图片,则根据文件的后缀名去加载对应的缩略图
+				var imgSize = item.width+'x'+item.height; //图片尺寸
+				if ( "jpg|jpeg|gif|png|bmp".indexOf(extension) == -1 ) {
+					imgSize = formatFileSize(item.filesize); //如果是文件则显示文件大小
+					builder.append('<span class="icon-placeholder icon-'+extension+'" data-src="'+item.oriURL+'"></span>');
+				} else {
+					builder.append('<img src="'+item.thumbURL+'" data-src="'+item.oriURL+'" border="0">');
+				}
+
+				builder.append('<span class="ic" data-module="'+module+'"><em class="img-size">'+imgSize+'</em></span></li>');
+				var $image = $(builder.toString());
+
+				//绑定选择图片事件
+				$image.find(".ic").on("click", function() {
+					var src = $(this).prev().data("src");
+					var module = $(this).data("module");
+					if ( $(this).hasClass("selected") ) {
+						$(this).removeClass("selected");
+					} else {
+						$(this).addClass("selected");
+						o.selectedList.push(src);
+					}
+					//console.log(o.selectedList);
+				});
+				//裁剪显示图片
+				$image.find("img").imageCrop(113, 113);
+				if ( module == "online" ) {
+					G(".imagelist .list").append($image);
+				} else if ( module == "search" ) {
+					G(".search-imagelist-box .search-list").append($image);
+				}
+			});
+
+		}
+
+		//initialize dialog
+		createDialog();
+		bindEvent();
+		return o;
+	}; //end of JUpload
+
+	//string builder
+	var StringBuilder = function() {
+
+		var buffer = new Array();
+		StringBuilder.prototype.append = function(str) {
+			buffer.push(str);
+		}
+
+		StringBuilder.prototype.toString = function () {
+			return buffer.join("");
+		}
+
+	}
+
+
+})(jQuery);
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/BUpload.min.js b/public/assets/addons/nkeditor/plugins/multiimage/BUpload.min.js
new file mode 100644
index 0000000..182c6fa
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/multiimage/BUpload.min.js
@@ -0,0 +1,2 @@
+/* NKeditor 5.0.3 (2018-10-25), Copyright (C) r9it.com,*/
+!function(a){if(!window.applicationCache)throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");a.fn.imageCrop=function(b,c){a(this).on("load",function(){var d,e,f,g,h=this.width/this.height,i=b/c;h>=i?(e=c,d=b*h,g=0,f=(d-b)/2):(d=b,e=c/h,f=0,g=0),a(this).css({position:"absolute",top:-g+"px",left:-f+"px",width:d+"px",height:e+"px"})})},a.fn.draggable=function(b){var c={handler:null};b=a.extend(c,b);var d=this;a(b.handler).mousedown(function(b){var c=b.pageX-a(d).position().left,e=b.pageY-a(d).position().top;a(document).mousemove(function(b){window.getSelection?window.getSelection().removeAllRanges():document.selection.empty(),a(d).css({top:b.pageY-e+"px",left:b.pageX-c+"px"})})}).mouseup(function(){a(document).unbind("mousemove")})},void 0==Array.prototype.remove&&(Array.prototype.remove=function(a){for(var b=0;b<this.length;b++)if(this[b]==a){this.splice(b,1);break}}),void 0==Array.prototype.uinque&&(Array.prototype.uinque=function(){for(var a,b=[],c={},d=0;null!=(a=this[d]);d++)c[a]||(b.push(a),c[a]=!0);return b}),window.BUpload=function(c){function d(){var d=new b;d.append('<div class="uedbody ke-animated"><div class="ued_title">'),d.append('<div class="uedbar"><span>'+c.lang.title+'</span></div><div class="close_btn icon" title="'+c.lang.closeText+'"></div>'),d.append('</div><div class="wrapper"><div id="wra_head" class="wra_head"><span class="tab tab-upload focus" tab="upload-panel">'+c.lang.localUpload+"</span>"),null!=c.list_url&&d.append('<span class="tab tab-online" tab="online">'+c.lang.fileServer+"</span>"),d.append('</div><div class="wra_body"><div class="tab-panel upload-panel"><div class="wra_pla"><div class="upload-image-placeholder">'),d.append('<div class="btn btn-primary image-select">'+c.lang.selectFile+'</div><input type="file" name="'+c.src+'" class="webuploader-element-invisible" multiple="multiple" accept="'+n()+'">'),d.append('</div></div><div class="image-list-box" style="display: none;"><div class="wra_bar"><div class="info fl"></div>'),d.append('<div class="fr"><span class="btn btn-default btn-continue-add">'+c.lang.continueAdd+'</span><span class="btn btn-primary btn-start-upload">'+c.lang.startUpload+"</span></div></div>"),d.append('<ul class="filelist"></ul></div></div><div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>'),d.append('<div class="tab-panel searchbox"><div class="search-bar"><input class="searTxt" type="text" placeholder="'+c.lang.searchPlaceholder+'" />'),d.append('<input value="'+c.lang.searchBtn+'" class="btn btn-primary btn-search" type="button" /><input value="'+c.lang.searchClear+'" class="btn btn-default btn-reset" type="button" />'),d.append('</div><div class="search-imagelist-box"><ul class="search-list"></ul><div class="no-data"></div></div>'),d.append('</div><div class="loading-icon"></div></div><!-- end of wrapper --></div><div class="wra-btn-group"><span class="btn btn-primary btn-confirm">'+c.lang.confirmBtnText+"</span>"),d.append('<span class="btn btn-default btn-cancel">'+c.lang.cancelBtnText+"</span></div></div>"),u.dialog=a(d.toString()),a("body").append(u.dialog),0==c.top&&(c.top=(a(window).height()-u.dialog.height())/2),u.dialog.css({left:(a(window).width()-u.dialog.width())/2+"px",top:c.top+"px"}),u.dialog.draggable({handler:u.dialog.find(".ued_title")})}function e(){p(".tab").on("click",function(){var b=a(this).attr("tab");p(".tab-panel").hide(),p("."+b).show(),p(".tab").removeClass("focus"),a(this).addClass("focus")}),p(".close_btn").on("click",function(){u.close()}),p(".webuploader-element-invisible").on("change",function(){f(this)}),p(".image-select").on("click",function(){p(".webuploader-element-invisible").trigger("click")}),p(".btn-continue-add").on("click",function(){p(".webuploader-element-invisible").trigger("click")}),p(".btn-start-upload").on("click",function(){if(!u.uploadLock){if(0==u.todoList.length)return c.errorHandler(c.lang.noFileAdded,"error"),!1;a(this).addClass("disabled").text(c.lang.uploading),g(u.todoList.shift())}}),p(".btn-confirm").on("click",function(){return u.todoList.length>0?(c.errorHandler(c.lang.fileNotUpload,"error"),!1):0==u.selectedList.length?(c.errorHandler(c.lang.noFileSelected,"error"),!1):(c.callback(u.selectedList),void u.close())}),p(".btn-cancel").on("click",function(){u.close()}),p(".tab-online").on("click",function(){0==p(".imagelist .list").children().length&&q()}),p(".imagelist").on("scroll",function(){this.scrollTop+this.clientHeight>=this.scrollHeight&&q()})}function f(d){for(var e=d.files,f=u.todoList.length+u.uploadSuccessNum+e.length,g=u.addedFileNumber;g<u.addedFileNumber+e.length;g++){if(f>c.max_filenum)return void c.errorHandler(KindEditor.tmpl(c.lang.uploadLimit,{uploadLimit:c.max_filenum}),"error");var h=new b,i=e[g-u.addedFileNumber];h.append('<li id="img-comtainer-'+v+g+'"><div class="imgWrap">');var k=m(i.name);""==k&&(k="default"),k=k.toLowerCase(),-1=="jpg|jpeg|gif|png|bmp".indexOf(k)?h.append('<span class="icon-placeholder icon-default icon-'+k+'"></span>'):h.append('<img src="'+window.URL.createObjectURL(i)+'" border="0" />'),h.append('</div><div class="file-opt-box clearfix"><span class="remove" index="'+g+'">'+c.lang.remove+'</span><span class="rotateRight">'+c.lang.rotateRight+"</span>"),h.append('<span class="rotateLeft">'+c.lang.rotateLeft+'</span></div><div class="success"></div><div class="error"></div>'),h.append('<div class="progress"><span style="display: none; width: 0px;"></span></div></li>');var l=a(h.toString());l.find(".remove").on("click",function(){a(this).parents("li").remove();for(var b=a(this).attr("index"),c=0;c<u.todoList.length;c++)if(u.todoList[c].index==b){u.totalFilesize-=u.todoList[c].file.size,j(u.uploadSuccessNum+u.todoList.length-1,u.totalFilesize),u.todoList.splice(c,1);break}0==p(".filelist li").length&&(p(".image-list-box").hide(),p(".wra_pla").show())}),l.on("mouseover",function(){a(this).find(".file-opt-box").show()}).on("mouseout",function(){a(this).find(".file-opt-box").hide()}),p(".wra_pla").hide(),p(".image-list-box").show(),p(".filelist").append(l),u.todoList.push({index:g,file:i}),u.totalFilesize+=i.size}u.addedFileNumber+=e.length,j(u.uploadSuccessNum+u.todoList.length,u.totalFilesize),a(".imgWrap img").imageCrop(113,113)}function g(b){if(!l(b))return void h();var d=new XMLHttpRequest;d.open("POST",c.upload_url),d.addEventListener("load",function(d){if("json"==c.data_type){var e=a.parseJSON(d.target.responseText);"000"==e.code?(u.selectedList.push(e.data.url),u.uploadSuccessNum++,a("#img-comtainer-"+v+b.index).find(".file-opt-box").remove(),a("#img-comtainer-"+v+b.index).find(".progress").remove(),a("#img-comtainer-"+v+b.index).find(".success").show()):o(s[e.code],b)}},!1),d.addEventListener("loadend",function(){h()},!1),d.addEventListener("error",function(){o(c.lang.uploadFail,b)},!1),d.upload.addEventListener("progress",function(a){i(a,b)},!1);var e=new FormData;e.append(c.src,b.file),d.send(e)}function h(){if(u.todoList.length){var a=u.todoList.shift();g(a)}else u.uploadLock=!1,p(".btn-start-upload").removeClass("disabled").text(c.lang.startUpload)}function i(b,c){b.lengthComputable&&a("#img-comtainer-"+v+c.index).find(".progress span").css({width:b.loaded/b.total*100+"%",display:"block"})}function j(a,b){var d=KindEditor.tmpl(c.lang.uploadDesc,{numSelect:a,totalSize:k(b),numLeft:c.max_filenum-a});p(".info").text(d)}function k(a){return a/1048576>1?(a/1048576).toFixed(2)+"MB":(a/1024).toFixed(2)+"KB"}function l(a){var b=1024*c.max_filesize;if(b>0&&a.file.size>b)return o(KindEditor.tmpl(c.lang.sizeLimit,{sizeLimit:c.max_filesize}),a),!1;var d=m(a.file.name);return d&&-1!=c.ext_allow.indexOf(d)&&-1==c.ext_refuse.indexOf(d)?!0:(o(KindEditor.tmpl(c.lang.invalidExt,{invalidExt:d}),a),!1)}function m(a){if(!a)return!1;var b=a.lastIndexOf(".");return-1!=b?a.substr(b+1).toLowerCase():!1}function n(){var b=c.ext_allow.split("|"),d=[];return a.each(b,function(a,b){d.push(t[b])}),d.length>1?d.uinque().join(","):"*"}function o(a,b){p("#img-comtainer-"+v+b.index).find(".error").show().text(a)}function p(a){return u.dialog.find(a)}function q(){return c.list_url?u.noRecord?!1:(p(".loading-icon").show(),void a.get(c.list_url,{page:u.page,marker:u.marker,fileType:c.fileType},function(a){if(p(".loading-icon").hide(),"000"==a.code){if(!a.data[0])return void p(".online .no-data").text(c.lang.noDataText).show();u.marker=a.extra,u.page++,r(a.data,"online")}else p(".online .no-data").text(c.lang.noDataText).show(),u.noRecord=!0},"json")):(p(".online .no-data").html('<span class="error">'+c.lang.noListUrl+"</span>").show(),!1)}function r(c,d){a.each(c,function(c,e){var f=new b;f.append("<li>");var g=m(e.thumbURL);""==g&&(g="default"),g=g.toLowerCase();var h=e.width+"x"+e.height;-1=="jpg|jpeg|gif|png|bmp".indexOf(g)?(h=k(e.filesize),f.append('<span class="icon-placeholder icon-'+g+'" data-src="'+e.oriURL+'"></span>')):f.append('<img src="'+e.thumbURL+'" data-src="'+e.oriURL+'" border="0">'),f.append('<span class="ic" data-module="'+d+'"><em class="img-size">'+h+"</em></span></li>");var i=a(f.toString());i.find(".ic").on("click",function(){var b=a(this).prev().data("src");a(this).data("module");a(this).hasClass("selected")?a(this).removeClass("selected"):(a(this).addClass("selected"),u.selectedList.push(b))}),i.find("img").imageCrop(113,113),"online"==d?p(".imagelist .list").append(i):"search"==d&&p(".search-imagelist-box .search-list").append(i)})}c=a.extend({src:"src",upload_url:null,list_url:null,data_type:"json",top:20,fileType:"image",max_filesize:2048,max_filenum:20,no_data_text:"(⊙o⊙)亲,没有多数据了。",ext_allow:"jpg|png|gif|jpeg",ext_refuse:"exe|txt",errorHandler:function(a,b){alert(a)},callback:function(a){console.log(a)}},c);var s={"000":"文件上传成功","001":"文件上传失败","003":"文件大小超出限制","004":"非法文件名后缀"},t={"3gpp":"audio/3gpp, video/3gpp",ac3:"audio/ac3",asf:"allpication/vnd.ms-asf",au:"audio/basic",css:"text/css",csv:"text/csv",doc:"application/msword",dot:"application/msword",dtd:"application/xml-dtd",dwg:"image/vnd.dwg",dxf:"image/vnd.dxf",gif:"image/gif",htm:"text/html",html:"text/html",jp2:"image/jp2",jpe:"image/jpeg",jpeg:"image/jpeg",jpg:"image/jpeg",js:"text/javascript, application/javascript",json:"application/json",mp2:"audio/mpeg, video/mpeg",mp3:"audio/mpeg",mp4:"audio/mp4, video/mp4",mpeg:"video/mpeg",mpg:"video/mpeg",mpp:"application/vnd.ms-project",ogg:"application/ogg, audio/ogg",pdf:"application/pdf",png:"image/png",pot:"application/vnd.ms-powerpoint",pps:"application/vnd.ms-powerpoint",ppt:"application/vnd.ms-powerpoint",rtf:"application/rtf, text/rtf",svf:"image/vnd.svf",tif:"image/tiff",tiff:"image/tiff",txt:"text/plain",wdb:"application/vnd.ms-works",wps:"application/vnd.ms-works",xhtml:"application/xhtml+xml",xlc:"application/vnd.ms-excel",xlm:"application/vnd.ms-excel",xls:"application/vnd.ms-excel",xlt:"application/vnd.ms-excel",xlw:"application/vnd.ms-excel",xml:"text/xml, application/xml",zip:"aplication/zip",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},u={};u.dialog=null,u.todoList=new Array,u.uploadSuccessNum=0,u.selectedList=new Array,u.addedFileNumber=0,u.totalFilesize=0,u.uploadLock=!1,u.page=1,u.marker=null,u.noRecord=!1;var v=Math.ceil(1e12*Math.random());return u.close=function(){u.dialog.remove(),"function"==typeof c.close&&c.close()},d(),e(),u};var b=function(){var a=new Array;b.prototype.append=function(b){a.push(b)},b.prototype.toString=function(){return a.join("")}}}(jQuery);
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/aep.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/aep.png
new file mode 100644
index 0000000..1ae4e95
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/aep.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/asp.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/asp.png
new file mode 100644
index 0000000..a4fb174
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/asp.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/avi.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/avi.png
new file mode 100644
index 0000000..f358993
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/avi.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/c.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/c.png
new file mode 100644
index 0000000..bdc1f78
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/c.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/conf.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/conf.png
new file mode 100644
index 0000000..ac9cf49
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/conf.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/css.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/css.png
new file mode 100644
index 0000000..5475124
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/css.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/default.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/default.png
new file mode 100644
index 0000000..946d095
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/default.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/doc.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/doc.png
new file mode 100644
index 0000000..6b827c6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/doc.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/eml.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/eml.png
new file mode 100644
index 0000000..8edc065
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/eml.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/eps.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/eps.png
new file mode 100644
index 0000000..0e6fb79
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/eps.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/fla.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/fla.png
new file mode 100644
index 0000000..767c56c
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/fla.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/htm.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/htm.png
new file mode 100644
index 0000000..9cc5171
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/htm.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/idn.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/idn.png
new file mode 100644
index 0000000..3c83e99
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/idn.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/ini.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/ini.png
new file mode 100644
index 0000000..0449595
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/ini.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/java.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/java.png
new file mode 100644
index 0000000..cbd350a
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/java.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/js.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/js.png
new file mode 100644
index 0000000..f65b15d
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/js.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/jsf.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/jsf.png
new file mode 100644
index 0000000..e551416
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/jsf.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/markdown.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/markdown.png
new file mode 100644
index 0000000..57e0870
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/markdown.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mdb.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mdb.png
new file mode 100644
index 0000000..56f037c
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mdb.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/midi.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/midi.png
new file mode 100644
index 0000000..7ff836a
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/midi.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mov.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mov.png
new file mode 100644
index 0000000..8b5b776
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mov.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mp3.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mp3.png
new file mode 100644
index 0000000..11f13ad
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mp3.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mpeg.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mpeg.png
new file mode 100644
index 0000000..eccb9fc
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/mpeg.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pdf.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pdf.png
new file mode 100644
index 0000000..ca81a58
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pdf.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/php.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/php.png
new file mode 100644
index 0000000..8c4a2c2
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/php.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/ppt.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/ppt.png
new file mode 100644
index 0000000..4b15ad6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/ppt.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/psd.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/psd.png
new file mode 100644
index 0000000..a5f49e2
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/psd.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pst.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pst.png
new file mode 100644
index 0000000..fbe7fe5
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pst.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pub.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pub.png
new file mode 100644
index 0000000..71a92c1
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/pub.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/py.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/py.png
new file mode 100644
index 0000000..8e2f6e2
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/py.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/rb.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/rb.png
new file mode 100644
index 0000000..5956ee7
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/rb.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/rmvb.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/rmvb.png
new file mode 100644
index 0000000..eccb9fc
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/rmvb.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/scss.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/scss.png
new file mode 100644
index 0000000..e043f36
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/scss.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/sql.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/sql.png
new file mode 100644
index 0000000..0023d84
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/sql.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/tif.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/tif.png
new file mode 100644
index 0000000..04e77a4
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/tif.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/txt.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/txt.png
new file mode 100644
index 0000000..876352b
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/txt.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/vsd.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/vsd.png
new file mode 100644
index 0000000..c248eb3
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/vsd.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wav.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wav.png
new file mode 100644
index 0000000..c6ec2f6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wav.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wma.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wma.png
new file mode 100644
index 0000000..68316b5
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wma.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wmv.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wmv.png
new file mode 100644
index 0000000..194ac20
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/wmv.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/xls.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/xls.png
new file mode 100644
index 0000000..b9eada4
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/xls.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/xml.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/xml.png
new file mode 100644
index 0000000..805f307
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/xml.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/icons/zip.png b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/zip.png
new file mode 100644
index 0000000..6f0a434
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/icons/zip.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/images/dialog-title-bg.png b/public/assets/addons/nkeditor/plugins/multiimage/css/images/dialog-title-bg.png
new file mode 100644
index 0000000..f744f26
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/images/dialog-title-bg.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/images/icons-all.gif b/public/assets/addons/nkeditor/plugins/multiimage/css/images/icons-all.gif
new file mode 100644
index 0000000..21915e5
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/images/icons-all.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/images/icons.png b/public/assets/addons/nkeditor/plugins/multiimage/css/images/icons.png
new file mode 100644
index 0000000..12e4700
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/images/icons.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/images/image.png b/public/assets/addons/nkeditor/plugins/multiimage/css/images/image.png
new file mode 100644
index 0000000..19699f6
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/images/image.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/images/loader.gif b/public/assets/addons/nkeditor/plugins/multiimage/css/images/loader.gif
new file mode 100644
index 0000000..5bb90fd
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/images/loader.gif differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/images/progress.png b/public/assets/addons/nkeditor/plugins/multiimage/css/images/progress.png
new file mode 100644
index 0000000..717c486
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/images/progress.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/images/success.png b/public/assets/addons/nkeditor/plugins/multiimage/css/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/public/assets/addons/nkeditor/plugins/multiimage/css/images/success.png differ
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/upload.css b/public/assets/addons/nkeditor/plugins/multiimage/css/upload.css
new file mode 100644
index 0000000..cff67e2
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/multiimage/css/upload.css
@@ -0,0 +1,552 @@
+@charset "UTF-8";
+.uedbody {
+  box-sizing: content-box !important;
+  -webkit-box-sizing: content-box !important;
+  -moz-box-sizing: content-box !important;
+  width: 652px;
+  position: fixed;
+  padding: 2px 0px 0px 2px;
+  background-color: #FFF;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.2);
+  z-index: 811213;
+  font-family: "微软雅黑";
+  font-size: 12px;
+  margin: 0px auto; }
+  .uedbody div, .uedbody dl, .uedbody dt, .uedbody dd, .uedbody ul, .uedbody li, .uedbody ol, .uedbody h1, .uedbody h2, .uedbody h3, .uedbody h4, .uedbody h5, .uedbody h6, .uedbody pre, .uedbody code, .uedbody form, .uedbody fieldset, .uedbody legend, .uedbody button, .uedbody textarea, .uedbody blockquote, .uedbody p {
+    margin: 0;
+    padding: 0; }
+  .uedbody h1, .uedbody h2, .uedbody h3, .uedbody h4, .uedbody h5, .uedbody h6 {
+    font-weight: normal; }
+  .uedbody li {
+    list-style-type: none; }
+  .uedbody ol, .uedbody ul, .uedbody dl {
+    list-style: none; }
+  .uedbody em {
+    font-style: normal; }
+  .uedbody img {
+    border: none;
+    vertical-align: middle; }
+  .uedbody select, .uedbody label, .uedbody input {
+    vertical-align: middle;
+    padding: 0;
+    margin: 0;
+    outline: medium;
+    font-size: 12px; }
+  .uedbody textarea {
+    resize: none;
+    line-height: 18px; }
+  .uedbody table {
+    border-collapse: collapse;
+    border-spacing: 0;
+    empty-cell: show; }
+  .uedbody a {
+    text-decoration: none;
+    color: #333;
+    outline: none;
+    cursor: pointer; }
+  .uedbody a:hover {
+    cursor: pointer;
+    blr: expression(this.onFocus=this.blur()); }
+  .uedbody * {
+    padding: 0;
+    margin: 0;
+    box-sizing: content-box !important;
+    -webkit-box-sizing: content-box !important;
+    -moz-box-sizing: content-box !important; }
+  .uedbody .clearfix:before, .uedbody .clearfix:after {
+    content: "";
+    display: table; }
+  .uedbody .clearfix:after {
+    clear: both; }
+  .uedbody .clearfix {
+    *zoom: 1; }
+  .uedbody .fr {
+    float: right; }
+  .uedbody .fl {
+    float: left; }
+  .uedbody .ued_title {
+    height: 26px;
+    border-bottom: 1px solid #C6C6C6;
+    background: transparent url("images/dialog-title-bg.png") repeat-x scroll 0% 0%;
+    position: relative;
+    cursor: move; }
+    .uedbody .ued_title .icon {
+      background: url("images/icons-all.gif") no-repeat center; }
+    .uedbody .ued_title .uedbar span {
+      font-weight: bold;
+      font-size: 14px;
+      color: #444;
+      line-height: 26px;
+      padding-left: 5px; }
+    .uedbody .ued_title .close_btn {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background-position: 0px -59px;
+      position: absolute;
+      right: 5px;
+      top: 3px; }
+      .uedbody .ued_title .close_btn:hover {
+        background-position: 0px -89px; }
+  .uedbody .btn {
+    display: inline-block;
+    margin-bottom: 0px;
+    margin-right: 5px;
+    padding: 4px 10px;
+    font-weight: 400;
+    text-align: center;
+    cursor: pointer;
+    border: 1px solid transparent;
+    white-space: nowrap;
+    font-size: 14px;
+    border-radius: 3px;
+    -moz-user-select: none;
+    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+    padding: 5px 14px; }
+  .uedbody .btn-default {
+    border: 1px solid #CFCFCF;
+    color: #565656;
+    background: #ffffff; }
+    .uedbody .btn-default:hover {
+      background: #f0f0f0; }
+  .uedbody .btn-primary {
+    background: #00b7ee;
+    color: #ffffff; }
+    .uedbody .btn-primary:hover {
+      background: #00a2d4; }
+  .uedbody .btn.disabled {
+    cursor: not-allowed;
+    opacity: .65; }
+    .uedbody .btn.disabled:hover {
+      background: #00b7ee; }
+  .uedbody .wrapper {
+    width: 630px;
+    height: 380px;
+    margin: 0px auto;
+    padding: 10px;
+    position: relative;
+    font-family: sans-serif; }
+    .uedbody .wrapper .wra_head span {
+      float: left;
+      padding: 0px 5px;
+      margin-right: 3px;
+      height: 30px;
+      border: 1px solid #CCC;
+      background: transparent url("images/dialog-title-bg.png") repeat-x scroll 0% 0%;
+      text-align: center;
+      line-height: 30px;
+      cursor: pointer;
+      position: relative; }
+    .uedbody .wrapper .wra_head span.focus {
+      height: 31px;
+      border-bottom: medium none;
+      background: #FFF none repeat scroll 0% 0%;
+      position: relative;
+      z-index: 2; }
+    .uedbody .wrapper .wra_body {
+      width: 100%;
+      height: 346px;
+      clear: both;
+      margin: 0px auto;
+      border: 1px solid #CCC;
+      display: block;
+      clip: auto;
+      overflow: hidden;
+      top: -1px;
+      position: relative; }
+      .uedbody .wrapper .wra_body .upload-panel .wra_pla {
+        zoom: 1;
+        overflow: hidden;
+        text-align: center; }
+        .uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder {
+          margin: 10px;
+          border: 2px dashed #e6e6e6;
+          height: 172px;
+          padding-top: 150px;
+          text-align: center;
+          background: url("images/image.png") center 70px no-repeat;
+          position: relative;
+          top: 0; }
+          .uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder .webuploader-element-invisible {
+            opacity: 0;
+            width: 0;
+            height: 0; }
+          .uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder .image-select {
+            padding: 10px 30px;
+            cursor: pointer; }
+      .uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar {
+        border-bottom: 1px solid #DADADA;
+        padding: 8px;
+        vertical-align: middle;
+        position: relative;
+        zoom: 1;
+        overflow: hidden; }
+        .uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar .info {
+          font-size: 14px;
+          color: #666;
+          margin-top: 6px; }
+        .uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar .fr .btn {
+          padding: 6px 15px; }
+      .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist {
+        list-style: outside none none;
+        margin: 0px;
+        padding: 0px;
+        overflow-x: hidden;
+        overflow-y: auto;
+        position: relative;
+        height: 300px; }
+        .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li {
+          width: 113px;
+          height: 113px;
+          margin: 9px 0px 0px 9px;
+          position: relative;
+          display: block;
+          float: left;
+          overflow: hidden;
+          font-size: 12px; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .imgWrap {
+            position: relative;
+            vertical-align: middle;
+            text-align: center;
+            overflow: hidden;
+            width: 113px;
+            height: 113px;
+            transform-origin: 50% 50% 0px;
+            transition: all 200ms ease-out 0s; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box {
+            position: absolute;
+            display: none;
+            background: rgba(0, 0, 0, 0.5) none repeat scroll 0% 0%;
+            width: 100%;
+            top: 0px;
+            left: 0px;
+            overflow: hidden; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box span {
+              width: 24px;
+              height: 24px;
+              display: inline;
+              float: right;
+              text-indent: -9999px;
+              overflow: hidden;
+              background: url("images/icons.png") no-repeat;
+              margin: 5px 1px 1px;
+              cursor: pointer;
+              -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+              -webkit-user-select: none;
+              -moz-user-select: none;
+              -ms-user-select: none;
+              user-select: none; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .remove {
+              background-position: -48px -24px; }
+              .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .remove:hover {
+                background-position: -48px -0px; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateRight {
+              display: none;
+              background-position: -24px -24px; }
+              .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateRight:hover {
+                background-position: -24px -0px; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateLeft {
+              display: none;
+              background-position: 0px -24px; }
+              .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateLeft:hover {
+                background-position: 0px 0px; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .success {
+            background: url("images/success.png") no-repeat right;
+            position: absolute;
+            display: none;
+            left: 0px;
+            bottom: 0px;
+            height: 40px;
+            width: 100%; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .error {
+            position: absolute;
+            width: 100%;
+            display: none;
+            background: rgba(255, 255, 255, 0.7) none repeat scroll 0% 0%;
+            left: 0;
+            padding: 5px 3px;
+            color: #cc0000;
+            border: 1px solid #cccccc;
+            bottom: 0; }
+          .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .progress {
+            position: absolute;
+            width: 100%;
+            bottom: 0;
+            left: 0;
+            bottom: 0;
+            height: 8px;
+            overflow: hidden;
+            z-index: 50;
+            margin: 0;
+            border-radius: 0;
+            background: none;
+            -webkit-box-shadow: 0 0 0; }
+            .uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .progress span {
+              width: 0;
+              height: 100%;
+              background: #1483d8 url("images/progress.png") repeat-x;
+              -webit-transition: width 200ms linear;
+              -moz-transition: width 200ms linear;
+              -o-transition: width 200ms linear;
+              -ms-transition: width 200ms linear;
+              transition: width 200ms linear;
+              -webkit-animation: progressmove 2s linear infinite;
+              -moz-animation: progressmove 2s linear infinite;
+              -o-animation: progressmove 2s linear infinite;
+              -ms-animation: progressmove 2s linear infinite;
+              animation: progressmove 2s linear infinite;
+              -webkit-transform: translateZ(0); }
+      .uedbody .wrapper .wra_body .online {
+        width: 100%;
+        height: 336px;
+        padding: 10px 0px 0px;
+        display: none; }
+        .uedbody .wrapper .wra_body .online .imagelist {
+          width: 100%;
+          height: 100%;
+          overflow-x: hidden;
+          overflow-y: auto;
+          position: relative; }
+          .uedbody .wrapper .wra_body .online .imagelist .list li {
+            float: left;
+            display: block;
+            list-style: outside none none;
+            padding: 0px;
+            width: 113px;
+            height: 113px;
+            margin: 0px 0px 9px 9px;
+            background-color: #EEE;
+            overflow: hidden;
+            cursor: pointer;
+            position: relative; }
+            .uedbody .wrapper .wra_body .online .imagelist .list li img {
+              cursor: pointer; }
+            .uedbody .wrapper .wra_body .online .imagelist .list li span.ic {
+              position: absolute;
+              top: 0px;
+              left: 0px;
+              cursor: pointer;
+              width: 113px;
+              height: 113px; }
+              .uedbody .wrapper .wra_body .online .imagelist .list li span.ic .img-size {
+                font-size: 12px;
+                padding: 5px;
+                background: rgba(0, 0, 0, 0.6);
+                display: none;
+                color: #ffffff; }
+              .uedbody .wrapper .wra_body .online .imagelist .list li span.ic:hover {
+                width: 107px;
+                height: 107px;
+                border: 3px solid #1094FA;
+                background-position: 72px 72px; }
+                .uedbody .wrapper .wra_body .online .imagelist .list li span.ic:hover .img-size {
+                  display: inline-block;
+                  width: 97px; }
+            .uedbody .wrapper .wra_body .online .imagelist .list li span.selected {
+              background: url("images/success.png") no-repeat 75px 75px; }
+      .uedbody .wrapper .wra_body .searchbox {
+        width: 100%;
+        padding: 10px 0px 0px;
+        zoom: 1;
+        overflow: hidden;
+        display: none; }
+        .uedbody .wrapper .wra_body .searchbox .search-bar .searTxt {
+          margin-left: 5px;
+          background: #FFF none repeat scroll 0% 0%;
+          width: 300px;
+          height: 21px;
+          line-height: 21px;
+          padding: 3px 6px;
+          font-size: 14px;
+          line-height: 1.42857;
+          border: 1px solid #CCC;
+          border-radius: 4px;
+          box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
+          transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
+          margin-right: 10px; }
+        .uedbody .wrapper .wra_body .searchbox .search-bar .searchBtn {
+          color: #FFF;
+          border-color: #285E8E;
+          background-color: #3B97D7; }
+        .uedbody .wrapper .wra_body .searchbox .search-bar .searchRese {
+          color: #333;
+          border-color: #CCC;
+          background-color: #FFF; }
+        .uedbody .wrapper .wra_body .searchbox .search-imagelist-box {
+          width: 100%;
+          height: 292px;
+          overflow-x: hidden;
+          overflow-y: auto;
+          position: relative;
+          margin-top: 10px; }
+          .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list {
+            zoom: 1;
+            overflow: hidden; }
+            .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li {
+              float: left;
+              display: block;
+              list-style: outside none none;
+              padding: 0px;
+              width: 113px;
+              height: 113px;
+              margin: 0px 0px 9px 9px;
+              background-color: #EEE;
+              overflow: hidden;
+              cursor: pointer;
+              position: relative; }
+              .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li img {
+                cursor: pointer; }
+              .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic {
+                position: absolute;
+                top: 0px;
+                left: 0px;
+                cursor: pointer;
+                width: 113px;
+                height: 113px; }
+                .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic .img-size {
+                  font-size: 12px;
+                  padding: 5px;
+                  background: rgba(0, 0, 0, 0.6);
+                  display: none;
+                  color: #ffffff; }
+                .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic:hover {
+                  width: 107px;
+                  height: 107px;
+                  border: 3px solid #1094FA;
+                  background-position: 72px 72px;
+                  overflow: hidden; }
+                  .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic:hover .img-size {
+                    display: inline-block;
+                    width: 97px; }
+              .uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.selected {
+                background: url("images/success.png") no-repeat 75px 75px; }
+      .uedbody .wrapper .wra_body .no-data {
+        line-height: 40px;
+        height: 40px;
+        font-size: 14px;
+        color: #999999;
+        text-align: center;
+        display: none; }
+        .uedbody .wrapper .wra_body .no-data .error {
+          color: #cc0000; }
+      .uedbody .wrapper .wra_body .loading-icon {
+        background: rgba(0, 0, 0, 0.4) url("images/loader.gif") no-repeat center center;
+        position: absolute;
+        width: 100%;
+        height: 346px;
+        top: 0;
+        left: 0;
+        display: none;
+        text-align: center; }
+        .uedbody .wrapper .wra_body .loading-icon .loading-message {
+          position: absolute;
+          font-size: 14px;
+          color: #f0f0f0;
+          top: 210px;
+          left: 253px; }
+      .uedbody .wrapper .wra_body .icon-placeholder {
+        background-size: 113px 113px;
+        display: block;
+        width: 113px;
+        height: 113px; }
+      .uedbody .wrapper .wra_body .icon-aep, .uedbody .wrapper .wra_body .icon-aepx {
+        background-image: url("icons/aep.png"); }
+      .uedbody .wrapper .wra_body .icon-asp {
+        background-image: url("icons/asp.png"); }
+      .uedbody .wrapper .wra_body .icon-avi {
+        background-image: url("icons/avi.png"); }
+      .uedbody .wrapper .wra_body .icon-c, .uedbody .wrapper .wra_body .icon-cpp {
+        background-image: url("icons/c.png"); }
+      .uedbody .wrapper .wra_body .icon-conf {
+        background-image: url("icons/conf.png"); }
+      .uedbody .wrapper .wra_body .icon-css {
+        background-image: url("icons/css.png"); }
+      .uedbody .wrapper .wra_body .icon-htm, .uedbody .wrapper .wra_body .icon-html {
+        background-image: url("icons/htm.png"); }
+      .uedbody .wrapper .wra_body .icon-default {
+        background-image: url("icons/txt.png"); }
+      .uedbody .wrapper .wra_body .icon-doc, .uedbody .wrapper .wra_body .icon-docx {
+        background-image: url("icons/doc.png"); }
+      .uedbody .wrapper .wra_body .icon-eps {
+        background-image: url("icons/eps.png"); }
+      .uedbody .wrapper .wra_body .icon-fla, .uedbody .wrapper .wra_body .icon-swf {
+        background-image: url("icons/fla.png"); }
+      .uedbody .wrapper .wra_body .icon-idn {
+        background-image: url("icons/idn.png"); }
+      .uedbody .wrapper .wra_body .icon-ini {
+        background-image: url("icons/ini.png"); }
+      .uedbody .wrapper .wra_body .icon-java, .uedbody .wrapper .wra_body .icon-jar, .uedbody .wrapper .wra_body .icon-war {
+        background-image: url("icons/java.png"); }
+      .uedbody .wrapper .wra_body .icon-js {
+        background-image: url("icons/js.png"); }
+      .uedbody .wrapper .wra_body .icon-jsf {
+        background-image: url("icons/jsf.png"); }
+      .uedbody .wrapper .wra_body .icon-md, .uedbody .wrapper .wra_body .icon-markdown {
+        background-image: url("icons/markdown.png"); }
+      .uedbody .wrapper .wra_body .icon-mdb {
+        background-image: url("icons/mdb.png"); }
+      .uedbody .wrapper .wra_body .icon-midi {
+        background-image: url("icons/midi.png"); }
+      .uedbody .wrapper .wra_body .icon-mov {
+        background-image: url("icons/mov.png"); }
+      .uedbody .wrapper .wra_body .icon-mp3 {
+        background-image: url("icons/mp3.png"); }
+      .uedbody .wrapper .wra_body .icon-mpeg {
+        background-image: url("icons/mpeg.png"); }
+      .uedbody .wrapper .wra_body .icon-pdf {
+        background-image: url("icons/pdf.png"); }
+      .uedbody .wrapper .wra_body .icon-php {
+        background-image: url("icons/php.png"); }
+      .uedbody .wrapper .wra_body .icon-ppt, .uedbody .wrapper .wra_body .icon-pptx {
+        background-image: url("icons/ppt.png"); }
+      .uedbody .wrapper .wra_body .icon-psd {
+        background-image: url("icons/psd.png"); }
+      .uedbody .wrapper .wra_body .icon-pst {
+        background-image: url("icons/pst.png"); }
+      .uedbody .wrapper .wra_body .icon-pub {
+        background-image: url("icons/pub.png"); }
+      .uedbody .wrapper .wra_body .icon-py {
+        background-image: url("icons/py.png"); }
+      .uedbody .wrapper .wra_body .icon-rb {
+        background-image: url("icons/rb.png"); }
+      .uedbody .wrapper .wra_body .icon-rm, .uedbody .wrapper .wra_body .icon-rmvb {
+        background-image: url("icons/rmvb.png"); }
+      .uedbody .wrapper .wra_body .icon-scss {
+        background-image: url("icons/scss.png"); }
+      .uedbody .wrapper .wra_body .icon-tif {
+        background-image: url("icons/tif.png"); }
+      .uedbody .wrapper .wra_body .icon-txt {
+        background-image: url("icons/txt.png"); }
+      .uedbody .wrapper .wra_body .icon-vsd {
+        background-image: url("icons/vsd.png"); }
+      .uedbody .wrapper .wra_body .icon-wav {
+        background-image: url("icons/wav.png"); }
+      .uedbody .wrapper .wra_body .icon-wma {
+        background-image: url("icons/wma.png"); }
+      .uedbody .wrapper .wra_body .icon-wmv {
+        background-image: url("icons/wmv.png"); }
+      .uedbody .wrapper .wra_body .icon-xls, .uedbody .wrapper .wra_body .icon-xlsx {
+        background-image: url("icons/xls.png"); }
+      .uedbody .wrapper .wra_body .icon-xml {
+        background-image: url("icons/xml.png"); }
+      .uedbody .wrapper .wra_body .icon-zip, .uedbody .wrapper .wra_body .icon-rar, .uedbody .wrapper .wra_body .icon-tgz, .uedbody .wrapper .wra_body .icon-gz, .uedbody .wrapper .wra_body .icon-tar, .uedbody .wrapper .wra_body .icon-7z {
+        background-image: url("icons/zip.png"); }
+    .uedbody .wrapper .wra_body_server {
+      height: 380px; }
+      .uedbody .wrapper .wra_body_server .online {
+        display: block !important;
+        height: 365px; }
+  .uedbody .wra-btn-group {
+    clear: both;
+    zoom: 1;
+    text-align: right;
+    padding: 10px 20px 20px 0px; }
+    .uedbody .wra-btn-group .tip-text {
+      float: left;
+      padding: 5px 10px;
+      color: #999;
+      font-size: 14px; }
+
+/*# sourceMappingURL=upload.css.map */
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/upload.css.map b/public/assets/addons/nkeditor/plugins/multiimage/css/upload.css.map
new file mode 100644
index 0000000..b7e49d4
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/multiimage/css/upload.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["upload.scss"],
+"names": [],
+"file": "upload.css"
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/upload.min.css b/public/assets/addons/nkeditor/plugins/multiimage/css/upload.min.css
new file mode 100644
index 0000000..3f463d7
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/multiimage/css/upload.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.uedbody{box-sizing:content-box!important;-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;width:652px;position:fixed;padding:2px 0 0 2px;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);z-index:811213;font-family:"微软雅黑";font-size:12px;margin:0 auto}.uedbody blockquote,.uedbody button,.uedbody code,.uedbody dd,.uedbody div,.uedbody dl,.uedbody dt,.uedbody fieldset,.uedbody form,.uedbody h1,.uedbody h2,.uedbody h3,.uedbody h4,.uedbody h5,.uedbody h6,.uedbody legend,.uedbody li,.uedbody ol,.uedbody p,.uedbody pre,.uedbody textarea,.uedbody ul{margin:0;padding:0}.uedbody h1,.uedbody h2,.uedbody h3,.uedbody h4,.uedbody h5,.uedbody h6{font-weight:400}.uedbody li{list-style-type:none}.uedbody dl,.uedbody ol,.uedbody ul{list-style:none}.uedbody em{font-style:normal}.uedbody img{border:none;vertical-align:middle}.uedbody input,.uedbody label,.uedbody select{vertical-align:middle;padding:0;margin:0;outline:medium;font-size:12px}.uedbody textarea{resize:none;line-height:18px}.uedbody table{border-collapse:collapse;border-spacing:0;empty-cell:show}.uedbody a{text-decoration:none;color:#333;outline:0;cursor:pointer}.uedbody a:hover{cursor:pointer;blr:expression(this.onFocus=this.blur())}.uedbody *{padding:0;margin:0;box-sizing:content-box!important;-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important}.uedbody .clearfix:after,.uedbody .clearfix:before{content:"";display:table}.uedbody .clearfix:after{clear:both}.uedbody .fr{float:right}.uedbody .fl{float:left}.uedbody .ued_title{height:26px;border-bottom:1px solid #c6c6c6;background:transparent url(images/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.uedbody .ued_title .icon{background:url(images/icons-all.gif) no-repeat center}.uedbody .ued_title .uedbar span{font-weight:700;font-size:14px;color:#444;line-height:26px;padding-left:5px}.uedbody .ued_title .close_btn{height:20px;width:20px;cursor:pointer;background-position:0 -59px;position:absolute;right:5px;top:3px}.uedbody .ued_title .close_btn:hover{background-position:0 -89px}.uedbody .btn{display:inline-block;margin-bottom:0;margin-right:5px;padding:4px 10px;font-weight:400;text-align:center;cursor:pointer;border:1px solid transparent;white-space:nowrap;font-size:14px;border-radius:3px;-moz-user-select:none;box-shadow:0 1px 1px rgba(0,0,0,.1);padding:5px 14px}.uedbody .btn-default{border:1px solid #cfcfcf;color:#565656;background:#fff}.uedbody .btn-default:hover{background:#f0f0f0}.uedbody .btn-primary{background:#00b7ee;color:#fff}.uedbody .btn-primary:hover{background:#00a2d4}.uedbody .btn.disabled{cursor:not-allowed;opacity:.65}.uedbody .btn.disabled:hover{background:#00b7ee}.uedbody .wrapper{width:630px;height:380px;margin:0 auto;padding:10px;position:relative;font-family:sans-serif}.uedbody .wrapper .wra_head span{float:left;padding:0 5px;margin-right:3px;height:30px;border:1px solid #ccc;background:transparent url(images/dialog-title-bg.png) repeat-x scroll 0 0;text-align:center;line-height:30px;cursor:pointer;position:relative}.uedbody .wrapper .wra_head span.focus{height:31px;border-bottom:medium none;background:#fff none repeat scroll 0 0;position:relative;z-index:2}.uedbody .wrapper .wra_body{width:100%;height:346px;clear:both;margin:0 auto;border:1px solid #ccc;display:block;clip:auto;overflow:hidden;top:-1px;position:relative}.uedbody .wrapper .wra_body .upload-panel .wra_pla{zoom:1;overflow:hidden;text-align:center}.uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder{margin:10px;border:2px dashed #e6e6e6;height:172px;padding-top:150px;text-align:center;background:url(images/image.png) center 70px no-repeat;position:relative;top:0}.uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder .webuploader-element-invisible{opacity:0;width:0;height:0}.uedbody .wrapper .wra_body .upload-panel .wra_pla .upload-image-placeholder .image-select{padding:10px 30px;cursor:pointer}.uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar{border-bottom:1px solid #dadada;padding:8px;vertical-align:middle;position:relative;zoom:1;overflow:hidden}.uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar .info{font-size:14px;color:#666;margin-top:6px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .wra_bar .fr .btn{padding:6px 15px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist{list-style:outside none none;margin:0;padding:0;overflow-x:hidden;overflow-y:auto;position:relative;height:300px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li{width:113px;height:113px;margin:9px 0 0 9px;position:relative;display:block;float:left;overflow:hidden;font-size:12px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .imgWrap{position:relative;vertical-align:middle;text-align:center;overflow:hidden;width:113px;height:113px;transform-origin:50% 50% 0;transition:all .2s ease-out 0s}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box{position:absolute;display:none;background:rgba(0,0,0,.5) none repeat scroll 0 0;width:100%;top:0;left:0;overflow:hidden}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box span{width:24px;height:24px;display:inline;float:right;text-indent:-9999px;overflow:hidden;background:url(images/icons.png) no-repeat;margin:5px 1px 1px;cursor:pointer;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .remove{background-position:-48px -24px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .remove:hover{background-position:-48px 0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateRight{display:none;background-position:-24px -24px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateRight:hover{background-position:-24px 0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateLeft{display:none;background-position:0 -24px}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .file-opt-box .rotateLeft:hover{background-position:0 0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .success{background:url(images/success.png) no-repeat right;position:absolute;display:none;left:0;bottom:0;height:40px;width:100%}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .error{position:absolute;width:100%;display:none;background:rgba(255,255,255,.7) none repeat scroll 0 0;left:0;padding:5px 3px;color:#c00;border:1px solid #ccc;bottom:0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .progress{position:absolute;width:100%;bottom:0;left:0;bottom:0;height:8px;overflow:hidden;z-index:50;margin:0;border-radius:0;background:0 0;-webkit-box-shadow:0 0 0}.uedbody .wrapper .wra_body .upload-panel .image-list-box .filelist li .progress span{width:0;height:100%;background:#1483d8 url(images/progress.png) repeat-x;-webit-transition:width .2s linear;-moz-transition:width .2s linear;-o-transition:width .2s linear;-ms-transition:width .2s linear;transition:width .2s linear;-webkit-animation:progressmove 2s linear infinite;-moz-animation:progressmove 2s linear infinite;-o-animation:progressmove 2s linear infinite;-ms-animation:progressmove 2s linear infinite;animation:progressmove 2s linear infinite;-webkit-transform:translateZ(0)}.uedbody .wrapper .wra_body .online{width:100%;height:336px;padding:10px 0 0;display:none}.uedbody .wrapper .wra_body .online .imagelist{width:100%;height:100%;overflow-x:hidden;overflow-y:auto;position:relative}.uedbody .wrapper .wra_body .online .imagelist .list li{float:left;display:block;list-style:outside none none;padding:0;width:113px;height:113px;margin:0 0 9px 9px;background-color:#eee;overflow:hidden;cursor:pointer;position:relative}.uedbody .wrapper .wra_body .online .imagelist .list li img{cursor:pointer}.uedbody .wrapper .wra_body .online .imagelist .list li span.ic{position:absolute;top:0;left:0;cursor:pointer;width:113px;height:113px}.uedbody .wrapper .wra_body .online .imagelist .list li span.ic .img-size{font-size:12px;padding:5px;background:rgba(0,0,0,.6);display:none;color:#fff}.uedbody .wrapper .wra_body .online .imagelist .list li span.ic:hover{width:107px;height:107px;border:3px solid #1094fa;background-position:72px 72px}.uedbody .wrapper .wra_body .online .imagelist .list li span.ic:hover .img-size{display:inline-block;width:97px}.uedbody .wrapper .wra_body .online .imagelist .list li span.selected{background:url(images/success.png) no-repeat 75px 75px}.uedbody .wrapper .wra_body .searchbox{width:100%;padding:10px 0 0;zoom:1;overflow:hidden;display:none}.uedbody .wrapper .wra_body .searchbox .search-bar .searTxt{margin-left:5px;background:#fff none repeat scroll 0 0;width:300px;height:21px;line-height:21px;padding:3px 6px;font-size:14px;line-height:1.42857;border:1px solid #ccc;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.075) inset;transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;margin-right:10px}.uedbody .wrapper .wra_body .searchbox .search-bar .searchBtn{color:#fff;border-color:#285e8e;background-color:#3b97d7}.uedbody .wrapper .wra_body .searchbox .search-bar .searchRese{color:#333;border-color:#ccc;background-color:#fff}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box{width:100%;height:292px;overflow-x:hidden;overflow-y:auto;position:relative;margin-top:10px}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list{zoom:1;overflow:hidden}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li{float:left;display:block;list-style:outside none none;padding:0;width:113px;height:113px;margin:0 0 9px 9px;background-color:#eee;overflow:hidden;cursor:pointer;position:relative}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li img{cursor:pointer}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic{position:absolute;top:0;left:0;cursor:pointer;width:113px;height:113px}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic .img-size{font-size:12px;padding:5px;background:rgba(0,0,0,.6);display:none;color:#fff}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic:hover{width:107px;height:107px;border:3px solid #1094fa;background-position:72px 72px;overflow:hidden}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.ic:hover .img-size{display:inline-block;width:97px}.uedbody .wrapper .wra_body .searchbox .search-imagelist-box .search-list li span.selected{background:url(images/success.png) no-repeat 75px 75px}.uedbody .wrapper .wra_body .no-data{line-height:40px;height:40px;font-size:14px;color:#999;text-align:center;display:none}.uedbody .wrapper .wra_body .no-data .error{color:#c00}.uedbody .wrapper .wra_body .loading-icon{background:rgba(0,0,0,.4) url(images/loader.gif) no-repeat center center;position:absolute;width:100%;height:346px;top:0;left:0;display:none;text-align:center}.uedbody .wrapper .wra_body .loading-icon .loading-message{position:absolute;font-size:14px;color:#f0f0f0;top:210px;left:253px}.uedbody .wrapper .wra_body .icon-placeholder{background-size:113px 113px;display:block;width:113px;height:113px}.uedbody .wrapper .wra_body .icon-aep,.uedbody .wrapper .wra_body .icon-aepx{background-image:url(icons/aep.png)}.uedbody .wrapper .wra_body .icon-asp{background-image:url(icons/asp.png)}.uedbody .wrapper .wra_body .icon-avi{background-image:url(icons/avi.png)}.uedbody .wrapper .wra_body .icon-c,.uedbody .wrapper .wra_body .icon-cpp{background-image:url(icons/c.png)}.uedbody .wrapper .wra_body .icon-conf{background-image:url(icons/conf.png)}.uedbody .wrapper .wra_body .icon-css{background-image:url(icons/css.png)}.uedbody .wrapper .wra_body .icon-htm,.uedbody .wrapper .wra_body .icon-html{background-image:url(icons/htm.png)}.uedbody .wrapper .wra_body .icon-default{background-image:url(icons/txt.png)}.uedbody .wrapper .wra_body .icon-doc,.uedbody .wrapper .wra_body .icon-docx{background-image:url(icons/doc.png)}.uedbody .wrapper .wra_body .icon-eps{background-image:url(icons/eps.png)}.uedbody .wrapper .wra_body .icon-fla,.uedbody .wrapper .wra_body .icon-swf{background-image:url(icons/fla.png)}.uedbody .wrapper .wra_body .icon-idn{background-image:url(icons/idn.png)}.uedbody .wrapper .wra_body .icon-ini{background-image:url(icons/ini.png)}.uedbody .wrapper .wra_body .icon-jar,.uedbody .wrapper .wra_body .icon-java,.uedbody .wrapper .wra_body .icon-war{background-image:url(icons/java.png)}.uedbody .wrapper .wra_body .icon-js{background-image:url(icons/js.png)}.uedbody .wrapper .wra_body .icon-jsf{background-image:url(icons/jsf.png)}.uedbody .wrapper .wra_body .icon-markdown,.uedbody .wrapper .wra_body .icon-md{background-image:url(icons/markdown.png)}.uedbody .wrapper .wra_body .icon-mdb{background-image:url(icons/mdb.png)}.uedbody .wrapper .wra_body .icon-midi{background-image:url(icons/midi.png)}.uedbody .wrapper .wra_body .icon-mov{background-image:url(icons/mov.png)}.uedbody .wrapper .wra_body .icon-mp3{background-image:url(icons/mp3.png)}.uedbody .wrapper .wra_body .icon-mpeg{background-image:url(icons/mpeg.png)}.uedbody .wrapper .wra_body .icon-pdf{background-image:url(icons/pdf.png)}.uedbody .wrapper .wra_body .icon-php{background-image:url(icons/php.png)}.uedbody .wrapper .wra_body .icon-ppt,.uedbody .wrapper .wra_body .icon-pptx{background-image:url(icons/ppt.png)}.uedbody .wrapper .wra_body .icon-psd{background-image:url(icons/psd.png)}.uedbody .wrapper .wra_body .icon-pst{background-image:url(icons/pst.png)}.uedbody .wrapper .wra_body .icon-pub{background-image:url(icons/pub.png)}.uedbody .wrapper .wra_body .icon-py{background-image:url(icons/py.png)}.uedbody .wrapper .wra_body .icon-rb{background-image:url(icons/rb.png)}.uedbody .wrapper .wra_body .icon-rm,.uedbody .wrapper .wra_body .icon-rmvb{background-image:url(icons/rmvb.png)}.uedbody .wrapper .wra_body .icon-scss{background-image:url(icons/scss.png)}.uedbody .wrapper .wra_body .icon-tif{background-image:url(icons/tif.png)}.uedbody .wrapper .wra_body .icon-txt{background-image:url(icons/txt.png)}.uedbody .wrapper .wra_body .icon-vsd{background-image:url(icons/vsd.png)}.uedbody .wrapper .wra_body .icon-wav{background-image:url(icons/wav.png)}.uedbody .wrapper .wra_body .icon-wma{background-image:url(icons/wma.png)}.uedbody .wrapper .wra_body .icon-wmv{background-image:url(icons/wmv.png)}.uedbody .wrapper .wra_body .icon-xls,.uedbody .wrapper .wra_body .icon-xlsx{background-image:url(icons/xls.png)}.uedbody .wrapper .wra_body .icon-xml{background-image:url(icons/xml.png)}.uedbody .wrapper .wra_body .icon-7z,.uedbody .wrapper .wra_body .icon-gz,.uedbody .wrapper .wra_body .icon-rar,.uedbody .wrapper .wra_body .icon-tar,.uedbody .wrapper .wra_body .icon-tgz,.uedbody .wrapper .wra_body .icon-zip{background-image:url(icons/zip.png)}.uedbody .wrapper .wra_body_server{height:380px}.uedbody .wrapper .wra_body_server .online{display:block!important;height:365px}.uedbody .wra-btn-group{clear:both;zoom:1;text-align:right;padding:10px 20px 20px 0}.uedbody .wra-btn-group .tip-text{float:left;padding:5px 10px;color:#999;font-size:14px}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/css/upload.scss b/public/assets/addons/nkeditor/plugins/multiimage/css/upload.scss
new file mode 100644
index 0000000..10ff832
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/multiimage/css/upload.scss
@@ -0,0 +1,642 @@
+$dialogWidth:652px;
+$dialogZindex:811213;
+$fontsize:14px;
+.uedbody{
+	div, dl, dt, dd, ul, li,ol, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, button, textarea, blockquote,p{margin:0; padding:0;}
+	h1,h2,h3,h4,h5,h6 {font-weight:normal;}
+	li{list-style-type:none;}
+	ol,ul,dl{list-style:none;}
+	em{font-style:normal;}
+	img{border:none;vertical-align:middle;}
+	select,label,input{vertical-align:middle; padding:0; margin:0;outline:medium;font-size:12px;}
+	textarea{resize: none; line-height:18px;}
+	table { border-collapse: collapse; border-spacing: 0; empty-cell:show;}
+	a{text-decoration:none;color:#333;outline:none; cursor:pointer;}
+	a:hover{cursor:pointer;blr:expression(this.onFocus=this.blur());}
+
+	box-sizing : content-box !important;
+	-webkit-box-sizing: content-box !important;
+	-moz-box-sizing: content-box !important;
+
+	* {
+		padding: 0; margin: 0;
+		box-sizing : content-box !important;
+		-webkit-box-sizing: content-box !important;
+		-moz-box-sizing: content-box !important;
+	}
+
+	.clearfix:before, .clearfix:after {
+		content: "";
+		display: table;
+	}
+	.clearfix:after{
+		clear: both;
+	}
+	.clearfix{
+		*zoom: 1;
+	}
+	.fr{float: right;}
+	.fl{float: left;}
+
+	width: $dialogWidth;
+	position: fixed;
+	padding: 2px 0px 0px 2px;
+	background-color: #FFF;
+	border: 1px solid rgba(0, 0, 0, 0.2);
+	border-radius: 6px;
+	box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.2);
+	z-index: $dialogZindex;
+	font-family:"微软雅黑";
+	font-size: 12px;
+	margin: 0px auto;
+
+	//start of ued_title
+	.ued_title{
+		height: 26px;
+		border-bottom: 1px solid #C6C6C6;
+		background: transparent url("images/dialog-title-bg.png") repeat-x scroll 0% 0%;
+		position: relative;
+		cursor: move;
+
+		.icon{background: url("images/icons-all.gif") no-repeat center;}
+
+		.uedbar {
+			span{
+				font-weight: bold;
+				font-size: 14px;
+				color: #444;
+				line-height: 26px;
+				padding-left: 5px;
+			}
+		}
+
+		.close_btn{
+			height: 20px;
+			width: 20px;
+			cursor: pointer;
+			background-position :0px -59px;
+			position: absolute;
+			right: 5px;
+			top: 3px;
+
+			&:hover{background-position: 0px -89px;}
+		}
+	}
+	//end of ued_title
+
+	//button styles
+	.btn {
+		display: inline-block;
+		margin-bottom: 0px;
+		margin-right: 5px;
+		padding: 4px 10px;
+		font-weight: 400;
+		text-align: center;
+		cursor: pointer;
+		border: 1px solid transparent;
+		white-space: nowrap;
+		font-size: $fontsize;
+		border-radius: 3px;
+		-moz-user-select: none;
+		box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+		padding: 5px 14px;
+	}
+	.btn-default {
+		border: 1px solid #CFCFCF;
+		color: #565656;
+		background: #ffffff;
+		&:hover {
+			background: #f0f0f0;
+		}
+	}
+	.btn-primary {
+		background:#00b7ee;
+		color: #ffffff;
+		&:hover {
+			background: #00a2d4;
+		}
+	}//button style end
+	.btn.disabled {
+		cursor: not-allowed;
+		opacity: .65;
+		&:hover {
+			background: #00b7ee;
+		}
+	}
+
+	//start of wrapper
+	.wrapper {
+		width: 630px;
+		height: 380px;
+		margin: 0px auto;
+		padding: 10px;
+		position: relative;
+		font-family: sans-serif;
+
+		//start of wra_head
+		.wra_head {
+			span {
+				float: left;
+				padding: 0px 5px;
+				margin-right:3px;
+				height: 30px;
+				border: 1px solid #CCC;
+				background: transparent url("images/dialog-title-bg.png") repeat-x scroll 0% 0%;
+				text-align: center;
+				line-height: 30px;
+				cursor: pointer;
+				position: relative;
+			}
+			span.focus {
+				height: 31px;
+				border-bottom: medium none;
+				background: #FFF none repeat scroll 0% 0%;
+				position: relative;
+				z-index: 2;
+			}
+		}//end of wra_head
+
+		//start of wra_body
+		.wra_body{
+
+			width: 100%;
+			height: 346px;
+			clear: both;
+			margin: 0px auto;
+			border: 1px solid #CCC;
+			display: block;
+			clip: auto;
+			overflow: hidden;
+			top: -1px;
+			position: relative;
+
+			//upload panel start
+			.upload-panel {
+				.wra_pla {
+					zoom: 1; overflow: hidden;
+					text-align: center;
+
+					.upload-image-placeholder {
+						margin: 10px;
+						border: 2px dashed #e6e6e6;
+						height: 172px;
+						padding-top: 150px;
+						text-align: center;
+						background: url("images/image.png") center 70px no-repeat;
+						position: relative;
+						top: 0;
+
+						.webuploader-element-invisible {
+							//width: 145px;
+							//height: 40px;
+							//position: absolute;
+							//left: 225px;
+							opacity: 0;
+							width: 0; height: 0;
+						}
+
+						.image-select {
+							padding: 10px 30px;
+							cursor: pointer;
+						}
+					}
+				}
+
+				//image list box start
+				.image-list-box {
+					.wra_bar {
+						border-bottom: 1px solid #DADADA;
+						padding: 8px;
+						vertical-align: middle;
+						position: relative;
+						zoom: 1;  overflow: hidden;
+
+						.info{
+							font-size: $fontsize;
+							color: #666;
+							margin-top: 6px;
+						}
+
+						.fr {
+							.btn {padding: 6px 15px;}
+						}
+
+					}
+
+					//filelist start
+					.filelist{
+						list-style: outside none none;
+						margin: 0px;
+						padding: 0px;
+						overflow-x: hidden;
+						overflow-y: auto;
+						position: relative;
+						height: 300px;
+
+						li {
+							width: 113px;
+							height: 113px;
+							margin: 9px 0px 0px 9px;
+							position: relative;
+							display: block;
+							float: left;
+							overflow: hidden;
+							font-size: 12px;
+
+							.imgWrap{
+								position: relative;
+								vertical-align: middle;
+								text-align: center;
+								overflow: hidden;
+								width: 113px;
+								height: 113px;
+								transform-origin: 50% 50% 0px;
+								transition: all 200ms ease-out 0s;
+
+							}
+
+							//file opt box start
+							.file-opt-box{
+								position: absolute;
+								display: none;
+								background: rgba(0, 0, 0, 0.5) none repeat scroll 0% 0%;
+								width: 100%;
+								top: 0px;
+								left: 0px;
+								overflow: hidden;
+
+								span {
+									width: 24px;
+									height: 24px;
+									display: inline;
+									float: right;
+									text-indent: -9999px;
+									overflow: hidden;
+									background: url("images/icons.png") no-repeat;
+									margin: 5px 1px 1px;
+									cursor: pointer;
+									-webkit-tap-highlight-color: rgba(0,0,0,0);
+									-webkit-user-select: none;
+									-moz-user-select: none;
+									-ms-user-select: none;
+									user-select: none;
+								}
+
+								.remove{
+									background-position: -48px -24px;
+									&:hover{
+										background-position: -48px -0px;
+									}
+								}
+								.rotateRight{
+									display: none;
+									background-position: -24px -24px;
+									&:hover{
+										background-position: -24px -0px;
+									}
+								}
+								.rotateLeft{
+									display: none;
+									background-position: 0px -24px;
+									&:hover{
+										background-position: 0px 0px;
+									}
+								}
+							}//file opt box end
+
+							.success{
+								background: url("images/success.png") no-repeat right;
+								position: absolute;
+								display: none;
+								left: 0px;
+								bottom: 0px;
+								height: 40px;
+								width: 100%;
+							}
+
+							.error {
+								position: absolute;
+								width: 100%;
+								display: none;
+								background: rgba(255, 255, 255, 0.7) none repeat scroll 0% 0%;
+								left: 0;
+								padding:5px 3px;
+								color: #cc0000;
+								border: 1px solid #cccccc;
+								bottom: 0;
+							}
+
+							.progress {
+								position: absolute;
+								width: 100%;
+								bottom: 0;
+								left: 0;
+								bottom: 0;
+								height: 8px;
+								overflow: hidden;
+								z-index: 50;
+								margin: 0;
+								border-radius: 0;
+								background: none;
+								-webkit-box-shadow: 0 0 0;
+
+								span {
+									width: 0;
+									height: 100%;
+									background: #1483d8 url("images/progress.png") repeat-x;
+									-webit-transition: width 200ms linear;
+									-moz-transition: width 200ms linear;
+									-o-transition: width 200ms linear;
+									-ms-transition: width 200ms linear;
+									transition: width 200ms linear;
+									-webkit-animation: progressmove 2s linear infinite;
+									-moz-animation: progressmove 2s linear infinite;
+									-o-animation: progressmove 2s linear infinite;
+									-ms-animation: progressmove 2s linear infinite;
+									animation: progressmove 2s linear infinite;
+									-webkit-transform: translateZ(0);
+								}
+							}
+						}//end li
+
+					}//filelist end
+
+				}//image list box end
+			}//upload panel end
+
+			//image online start
+			.online{
+				width: 100%;
+				height: 336px;
+				padding: 10px 0px 0px;
+				display: none;
+
+				.imagelist {
+					width: 100%;
+					height: 100%;
+					overflow-x: hidden;
+					overflow-y: auto;
+					position: relative;
+
+					.list {
+						li {
+							float: left;
+							display: block;
+							list-style: outside none none;
+							padding: 0px;
+							width: 113px;
+							height: 113px;
+							margin: 0px 0px 9px 9px;
+							background-color: #EEE;
+							overflow: hidden;
+							cursor: pointer;
+							position: relative;
+
+							img{cursor: pointer;}
+
+							span.ic {
+								position: absolute;
+								top: 0px;
+								left: 0px;
+								cursor: pointer;
+								width: 113px;
+								height: 113px;
+
+								.img-size {
+									font-size:12px;
+									padding: 5px;
+									background:rgba(0,0,0,0.6);
+									display: none;
+									color: #ffffff;
+								}
+
+								&:hover{
+									width: 107px;
+									height: 107px;
+									border: 3px solid #1094FA;
+									background-position: 72px 72px;
+									.img-size {
+										display: inline-block;
+										width: 97px;
+									}
+
+								}
+							}
+							span.selected {
+								background: url("images/success.png") no-repeat 75px 75px;
+							}
+						}
+					}
+
+				}
+
+			} //image online end
+
+			//image search start
+			.searchbox {
+				width: 100%;
+				padding: 10px 0px 0px;
+				zoom: 1; overflow: hidden;
+				display: none;
+
+				//搜索条
+				.search-bar {
+
+					.searTxt{
+						margin-left: 5px;
+						background: #FFF none repeat scroll 0% 0%;
+						width: 300px;
+						height: 21px;
+						line-height: 21px;
+						padding: 3px 6px;
+						font-size: $fontsize;
+						line-height: 1.42857;
+						border: 1px solid #CCC;
+						border-radius: 4px;
+						box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
+						transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
+						margin-right:10px;
+					}
+
+					.searchBtn {
+						color: #FFF;
+						border-color: #285E8E;
+						background-color: #3B97D7;
+					}
+					.searchRese{
+						color: #333;
+						border-color: #CCC;
+						background-color: #FFF;
+					}
+				}
+
+				.search-imagelist-box {
+					width: 100%;
+					height: 292px;
+					overflow-x: hidden;
+					overflow-y: auto;
+					position: relative;
+					margin-top:10px;
+
+					.search-list {
+						zoom:1; overflow: hidden;
+						li {
+							float: left;
+							display: block;
+							list-style: outside none none;
+							padding: 0px;
+							width: 113px;
+							height: 113px;
+							margin: 0px 0px 9px 9px;
+							background-color: #EEE;
+							overflow: hidden;
+							cursor: pointer;
+							position: relative;
+
+							img {
+								cursor: pointer;
+							}
+
+							span.ic {
+								position: absolute;
+								top: 0px;
+								left: 0px;
+								cursor: pointer;
+								width: 113px;
+								height: 113px;
+
+								.img-size {
+									font-size:12px;
+									padding: 5px;
+									background:rgba(0,0,0,0.6);
+									display: none;
+									color: #ffffff;
+								}
+
+								&:hover {
+									width: 107px;
+									height: 107px;
+									border: 3px solid #1094FA;
+									background-position: 72px 72px;
+									overflow: hidden;
+									.img-size {
+										display: inline-block;
+										width: 97px;
+									}
+								}
+							}
+							span.selected {
+								background: url("images/success.png") no-repeat 75px 75px;
+							}
+						}
+					}
+				}
+
+			}//image search start end
+
+			.no-data {
+				line-height: 40px;
+				height: 40px;
+				font-size:$fontsize;
+				color: #999999;
+				text-align: center;
+				display: none;
+				.error {
+					color: #cc0000;
+				}
+			}
+
+			.loading-icon {
+				background:rgba(0,0,0,0.4) url("images/loader.gif") no-repeat center center;
+				position: absolute;
+				width: 100%;
+				height: 346px;
+				top:0; left: 0;
+				display: none;
+				text-align: center;
+
+				.loading-message {
+					position: absolute;
+					font-size: 14px;
+					color: #f0f0f0;
+					top: 210px;
+					left:253px;
+				}
+			}
+
+			//图片占位符
+			.icon-placeholder {
+				background-size: 113px 113px;
+				display: block;
+				width: 113px;
+				height: 113px;
+			}
+			.icon-aep, .icon-aepx {background-image: url("icons/aep.png");}
+			.icon-asp {background-image: url("icons/asp.png");}
+			.icon-avi {background-image: url("icons/avi.png");}
+			.icon-c, .icon-cpp {background-image: url("icons/c.png");}
+			.icon-conf {background-image: url("icons/conf.png");}
+			.icon-css {background-image: url("icons/css.png");}
+			.icon-htm,.icon-html {background-image: url("icons/htm.png");}
+			.icon-default {background-image: url("icons/txt.png");}
+			.icon-doc,.icon-docx {background-image: url("icons/doc.png");}
+			.icon-eps {background-image: url("icons/eps.png");}
+			.icon-fla,.icon-swf {background-image: url("icons/fla.png");}
+			.icon-idn {background-image: url("icons/idn.png");}
+			.icon-ini {background-image: url("icons/ini.png");}
+			.icon-java, .icon-jar, .icon-war {background-image: url("icons/java.png");}
+			.icon-js {background-image: url("icons/js.png");}
+			.icon-jsf {background-image: url("icons/jsf.png");}
+			.icon-md, .icon-markdown {background-image: url("icons/markdown.png");}
+			.icon-mdb {background-image: url("icons/mdb.png");}
+			.icon-midi {background-image: url("icons/midi.png");}
+			.icon-mov {background-image: url("icons/mov.png");}
+			.icon-mp3 {background-image: url("icons/mp3.png");}
+			.icon-mpeg {background-image: url("icons/mpeg.png");}
+			.icon-pdf {background-image: url("icons/pdf.png");}
+			.icon-php {background-image: url("icons/php.png");}
+			.icon-ppt, .icon-pptx {background-image: url("icons/ppt.png");}
+			.icon-psd {background-image: url("icons/psd.png");}
+			.icon-pst {background-image: url("icons/pst.png");}
+			.icon-pub {background-image: url("icons/pub.png");}
+			.icon-py {background-image: url("icons/py.png");}
+			.icon-rb {background-image: url("icons/rb.png");}
+			.icon-rm, .icon-rmvb {background-image: url("icons/rmvb.png");}
+			.icon-scss {background-image: url("icons/scss.png");}
+			.icon-tif {background-image: url("icons/tif.png");}
+			.icon-txt {background-image: url("icons/txt.png");}
+			.icon-vsd {background-image: url("icons/vsd.png");}
+			.icon-wav {background-image: url("icons/wav.png");}
+			.icon-wma {background-image: url("icons/wma.png");}
+			.icon-wmv {background-image: url("icons/wmv.png");}
+			.icon-xls, .icon-xlsx {background-image: url("icons/xls.png");}
+			.icon-xml {background-image: url("icons/xml.png");}
+			.icon-zip, .icon-rar, .icon-tgz, .icon-gz, .icon-tar, .icon-7z {background-image: url("icons/zip.png");}
+
+		}//end of wra_body
+
+		.wra_body_server {
+			height: 380px;
+
+			.online {
+				display: block !important;
+				height: 365px;
+			}
+		}
+
+	}//start of wrapper
+
+	.wra-btn-group {
+		clear: both;
+		zoom: 1;
+		text-align: right;
+		padding: 10px 20px 20px 0px;
+
+		.tip-text {
+			float: left;
+			padding: 5px 10px;
+			color: #999;
+			font-size: 14px;
+		}
+	}
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/multiimage.js b/public/assets/addons/nkeditor/plugins/multiimage/multiimage.js
new file mode 100644
index 0000000..fbc89b3
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/multiimage/multiimage.js
@@ -0,0 +1,90 @@
+/**
+ * HTML5 批量文件上传
+ * @author yangjian <yangjian102621@gmail.com>
+ * @since v4.1.12(2017-09-12)
+ * @site http://git.oschina.net/blackfox/kindeditor
+ */
+
+KindEditor.plugin('multiimage', function(K) {
+	var self = this, name = 'multiimage',
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'),
+		imageSizeLimit = K.undef(self.imageSizeLimit, 2048), //单位KB
+		imageFileTypes = K.undef(self.imageFileTypes, 'jpg|png|gif|jpeg'),
+		imageUploadLimit = K.undef(self.imageUploadLimit, 20),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		lang = self.lang(name + '.');
+
+	if(typeof jQuery == 'undefined') {
+		K.options.errorMsgHandler(lang.depJQueryError, "error");
+		return;
+	} else {
+		K.loadScript(K.options.pluginsPath+name+"/BUpload.js");
+		K.loadStyle(K.options.pluginsPath+name+"/css/upload.css");
+	}
+
+	//锁屏插件
+	K.locker = function () {
+		var docWidth = Math.max(document.documentElement.clientWidth, document.body.clientWidth);
+		var docHeight = Math.max(document.documentElement.clientHeight, document.body.clientHeight, $(document).height()) + document.documentElement.scrollTop;
+		return K.widget({
+			x : 0,
+			y : 0,
+			cls : 'ke-dialog-lock',
+			width : docWidth,
+			height : docHeight
+		});
+	}
+	self.plugin.multiImageDialog = function(options) {
+
+		if ( !window.applicationCache ) {
+			K.options.errorMsgHandler("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!", "error");
+			return;
+		}
+		var clickFn = options.clickFn;
+		var locker = K.locker();
+		locker.show();
+
+		var dialog = new BUpload({
+			src : filePostName,
+			upload_url : uploadJson,
+			list_url : fileManagerJson,	//图片列表数据获取url
+			max_filesize : imageSizeLimit,
+			max_filenum : imageUploadLimit,
+			ext_allow : imageFileTypes,
+			lang : lang,
+			top : self.dialogOffset,
+			fileType : "image",
+			errorHandler : K.options.errorMsgHandler,
+			callback : function(data) {
+				//console.log(data);
+				clickFn.call(this, data);
+			},
+			close : function () {
+				locker.remove();
+			}
+		});
+
+		return dialog;
+	};
+	self.clickToolbar(name, function() {
+		self.plugin.multiImageDialog({
+			clickFn : function (urlList) {
+
+				if (urlList.length === 0) {
+					return;
+				}
+				K.each(urlList, function(i, data) {
+					if (self.afterUpload) {
+						self.afterUpload.call(self, data, data, 'multiimage');
+					}
+					self.exec('insertimage', data);
+				});
+				// Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog
+				setTimeout(function() {
+					self.hideDialog().focus();
+				}, 0);
+			}
+		});
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/multiimage/template/template.html b/public/assets/addons/nkeditor/plugins/multiimage/template/template.html
new file mode 100644
index 0000000..6625f0a
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/multiimage/template/template.html
@@ -0,0 +1,95 @@
+<div class="uedbody">
+	<div class="ued_title">
+		<div class="uedbar">
+			<span>多图上传</span>
+		</div>
+		<div class="close_but icon" title="关闭对话框"></div>
+	</div>
+
+	<div class="wrapper">
+		<div id="wra_head" class="wra_head">
+			<span class="tab tab-upload focus" tab="upload-panel">本地上传</span>
+			<span class="tab tab-online" tab="online">文件服务器</span>
+			<span class="tab tab-search" tab="searchbox">图片搜索</span>
+		</div>
+
+		<div class="wra_body">
+			<div class="tab-panel upload-panel">
+				<div class="wra_pla">
+					<div class="upload-image-placeholder">
+						<div class="btn btn-primary image-select">点击选择图片</div>
+						<input type="file" name="src" class="webuploader-element-invisible" multiple="multiple">
+					</div>
+				</div>
+
+				<div class="image-list-box" style="display: none;">
+					<div class="wra_bar">
+						<div class="info fl">选中 {img.num} 张图片,共 {img.size} K</div>
+						<div class="fr">
+							<span class="btn btn-default btn-continue-add">继续添加</span>
+							<span class="btn btn-primary btn-start-upload">开始上传</span>
+						</div>
+					</div>
+
+					<ul class="filelist">
+						<?php for ( $i = 0; $i < 20; $i++ ) {?>
+						<li>
+							<div class="imgWrap">
+								<img src="http://ueditor.baidu.com/server/ueditor/upload/image/3.jpg?noCache=iokrzz5b" width="113" height="113" border="0" />
+							</div>
+							<div class="file-opt-box clearfix">
+								<span class="remove">删除</span>
+								<span class="rotateRight">向右旋转</span>
+								<span class="rotateLeft">向左旋转</span>
+							</div>
+							<div class="success"></div>
+							<div class="error">这是错误信息</div>
+							<div class="progress"><span style="display: none; width: 0px;"></span></div>
+						</li>
+						<?php }?>
+
+					</ul>
+
+				</div>
+			</div>
+
+			<div class="tab-panel online">
+				<div class="imagelist">
+					<ul class="list">
+						<li>
+							<img style="margin-left: -33px;" src="http://ueditor.baidu.com/server/ueditor/upload/image/10.jpg?noCache=iokuzbsf" height="113" width="179">
+							<span class="ic <?php if ($i%2==0) {echo "selected";}?>"></span>
+						</li>
+					</ul>
+					<div class="no-data">(⊙o⊙)亲,没有多数据了。</div>
+				</div>
+			</div>
+
+			<div class="tab-panel searchbox">
+				<div class="search-bar">
+					<input class="searTxt" type="text" placeholder="请输入搜索关键词" />
+					<input value="百度一下" class="btn btn-primary btn-search" type="button" />
+					<input value="清空搜索" class="btn btn-default btn-cancel" type="button" />
+				</div>
+
+				<div class="search-imagelist-box">
+					<ul class="search-list">
+						<li>
+							<img style="margin-left: -33px;" src="http://ueditor.baidu.com/server/ueditor/upload/image/10.jpg?noCache=iokuzbsf" height="113" width="179">
+							<span class="ic <?php if ($i%2==0) {echo "selected";}?>"></span>
+						</li>
+					</ul>
+					<div class="no-data">(⊙o⊙)亲,没有多数据了。</div>
+				</div>
+			</div>
+
+			<div class="loading-icon"></div>
+		</div><!-- end of wrapper -->
+
+	</div>
+
+	<div class="wra-btn-group">
+		<span class="btn btn-primary btn-confirm">确认</span>
+		<span class="btn btn-default btn-cancel">取消</span>
+	</div>
+</div>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/pagebreak/pagebreak.js b/public/assets/addons/nkeditor/plugins/pagebreak/pagebreak.js
new file mode 100644
index 0000000..dfa883a
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/pagebreak/pagebreak.js
@@ -0,0 +1,27 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('pagebreak', function(K) {
+	var self = this;
+	var name = 'pagebreak';
+	var pagebreakHtml = K.undef(self.pagebreakHtml, '<hr style="page-break-after: always;" class="ke-pagebreak" />');
+
+	self.clickToolbar(name, function() {
+		var cmd = self.cmd, range = cmd.range;
+		self.focus();
+		var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : '<span id="__kindeditor_tail_tag__"></span>';
+		self.insertHtml(pagebreakHtml + tail);
+		if (tail !== '') {
+			var p = K('#__kindeditor_tail_tag__', self.edit.doc);
+			range.selectNodeContents(p[0]);
+			p.removeAttr('id');
+			cmd.select();
+		}
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/plainpaste/plainpaste.js b/public/assets/addons/nkeditor/plugins/plainpaste/plainpaste.js
new file mode 100644
index 0000000..8f7bed8
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/plainpaste/plainpaste.js
@@ -0,0 +1,41 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('plainpaste', function(K) {
+	var self = this, name = 'plainpaste';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = '<div style="padding:10px 20px;">' +
+				'<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var html = textarea.val();
+						html = K.escape(html);
+						html = html.replace(/ {2}/g, ' &nbsp;');
+						if (self.newlineTag == 'p') {
+							html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>');
+						} else {
+							html = html.replace(/\n/g, '<br />$&');
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/preview/preview.js b/public/assets/addons/nkeditor/plugins/preview/preview.js
new file mode 100644
index 0000000..029c227
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/preview/preview.js
@@ -0,0 +1,134 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('preview', function(K) {
+	var self = this, name = 'preview', undefined;
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			width = document.documentElement.clientWidth * 0.9,
+			height = document.documentElement.clientHeight - 160,
+			html = '<div style="padding:10px 20px;">' +
+				'<iframe class="ke-textarea" frameborder="0" style="width:'+(width-42)+'px;height:'+height+'px;"></iframe>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : width,
+				title : self.lang(name),
+				body : html
+			}),
+			iframe = K('iframe', dialog.div),
+			doc = K.iframeDoc(iframe);
+		doc.open();
+
+		var cssPath = self.options.cssPath;
+		var jsPath = self.options.jsPath;
+		var arr = [
+			'<html lang="en">',
+			'<head><meta charset="utf-8" /><title></title>',
+			//'<link href="http://localhost/editor/nkeditor/plugins/code/prettify.css" rel="stylesheet">',
+			'<style>',
+			'html {margin:0;padding:0;}',
+			'body {margin:0;padding:5px;}',
+			'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
+			'body, p, div {word-wrap: break-word;}',
+			'p {margin:5px 0;}',
+			'table {border-collapse:collapse;}',
+			'img {border:0;}',
+			'noscript {display:none;}',
+			'table.ke-zeroborder td {border:1px dotted #AAA;}',
+			'img.ke-flash {',
+			'	border:1px solid #AAA;',
+			'	background-image:url(' + self.options.themesPath + 'common/flash.svg);',
+			'	*background-image:url(' + self.options.themesPath + 'common/flash.png);',
+			'	background-size:64px 64px;',
+			'	background-position:center center;',
+			'	background-repeat:no-repeat;',
+			'	width:100px;',
+			'	height:100px;',
+			'}',
+			'img.ke-rm {',
+			'	border:1px solid #AAA;',
+			'	background-image:url(' + self.options.themesPath + 'common/rm.gif);',
+			'	background-position:center center;',
+			'	background-repeat:no-repeat;',
+			'	width:100px;',
+			'	height:100px;',
+			'}',
+			'img.ke-media {',
+			'	border:1px solid #AAA;',
+			'	background-image:url(' + self.options.themesPath + 'common/play.svg);',
+			'	*background-image:url(' + self.options.themesPath + 'common/play.png);',
+			'	background-position:center center;',
+			'	background-size:64px 64px;',
+			'	background-repeat:no-repeat;',
+			'	width:100px;',
+			'	height:100px;',
+			'}',
+			'img.ke-anchor {',
+			'	border:1px dashed #666;',
+			'	width:16px;',
+			'	height:16px;',
+			'}',
+			'.ke-script, .ke-noscript, .ke-display-none {',
+			'	display:none;',
+			'	font-size:0;',
+			'	width:0;',
+			'	height:0;',
+			'}',
+			'.ke-pagebreak {',
+			'	border:1px dotted #AAA;',
+			'	font-size:0;',
+			'	height:2px;',
+			'}'
+		];
+
+		if (self.options.showHelpGrid) {
+			arr.push('p,ul,ol,li,div{border: 1px dashed #c1c1c1;}');
+			arr.push('li{margin:5px 0px}');
+			arr.push('div,ul,ol{margin-bottom:10px}');
+		}
+		arr.push('</style>');
+		// 加载 css
+		if (!K.isArray(cssPath)) {
+			cssPath = [cssPath];
+		}
+		if (K.inArray(self.options.pluginsPath+'code/prism.css', cssPath) < 0) {
+			cssPath.push(self.options.pluginsPath+'code/prism.css');
+		}
+		K.each(cssPath, function(i, path) {
+			if (path) {
+				arr.push('<link href="' + path + '" rel="stylesheet" />');
+			}
+		});
+		if (self.options.cssData) {
+			arr.push('<style>' + self.options.cssData + '</style>');
+		}
+		arr.push('</head><body ' + (self.options.bodyClass ? 'class="' + self.options.bodyClass + '"' : '') + '>');
+		// 获取编辑器内容
+		arr.push(self.fullHtml());
+		// 加载脚本
+		if (!K.isArray(jsPath)) {
+			jsPath = [jsPath];
+		}
+		// 加载代码高亮的脚本
+		if (K.inArray(self.options.pluginsPath+'code/prism.js', jsPath) < 0) {
+			jsPath.push(self.options.pluginsPath+'code/prism.js');
+		}
+		K.each(jsPath, function(i, path) {
+			if (path) {
+				arr.push('<script type="text/javascript" src="' + path + '"></script>');
+			}
+		});
+		arr.push('</body></html>');
+		doc.write(arr.join('\n'));
+		doc.close();
+		K(doc.body).css('background-color', '#FFF');
+		iframe[0].contentWindow.focus();
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/quickformat/quickformat.js b/public/assets/addons/nkeditor/plugins/quickformat/quickformat.js
new file mode 100644
index 0000000..5b98c72
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/quickformat/quickformat.js
@@ -0,0 +1,81 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('quickformat', function(K) {
+	var self = this, name = 'quickformat',
+		blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p');
+	function getFirstChild(knode) {
+		var child = knode.first();
+		while (child && child.first()) {
+			child = child.first();
+		}
+		return child;
+	}
+	self.clickToolbar(name, function() {
+		self.focus();
+		var doc = self.edit.doc,
+			range = self.cmd.range,
+			child = K(doc.body).first(), next,
+			nodeList = [], subList = [],
+			bookmark = range.createBookmark(true);
+		while(child) {
+			next = child.next();
+			var firstChild = getFirstChild(child);
+			if (!firstChild || firstChild.name != 'img') {
+				if (blockMap[child.name]) {
+					child.html(child.html().replace(/^(\s|&nbsp;| )+/ig, ''));
+					child.css('text-indent', '2em');
+				} else {
+					subList.push(child);
+				}
+				if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) {
+					if (subList.length > 0) {
+						nodeList.push(subList);
+					}
+					subList = [];
+				}
+			}
+			child = next;
+		}
+		K.each(nodeList, function(i, subList) {
+			var wrapper = K('<p style="text-indent:2em;"></p>', doc);
+			subList[0].before(wrapper);
+			K.each(subList, function(i, knode) {
+				wrapper.append(knode);
+			});
+		});
+		range.moveToBookmark(bookmark);
+		self.addBookmark();
+	});
+});
+
+/**
+--------------------------
+abcd<br />
+1234<br />
+
+to
+
+<p style="text-indent:2em;">
+	abcd<br />
+	1234<br />
+</p>
+
+--------------------------
+
+&nbsp; abcd<img>1233
+<p>1234</p>
+
+to
+
+<p style="text-indent:2em;">abcd<img>1233</p>
+<p style="text-indent:2em;">1234</p>
+
+--------------------------
+*/
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/quote/quote.js b/public/assets/addons/nkeditor/plugins/quote/quote.js
new file mode 100644
index 0000000..b4daca4
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/quote/quote.js
@@ -0,0 +1,12 @@
+/**
+ * 引用插件
+ * @author yangjian
+ */
+KindEditor.plugin('quote', function(K) {
+	var self = this;
+	var name = 'quote';
+	self.clickToolbar(name, function() {
+		self.insertHtml('<blockquote class="ke-quote"><p>这里输入引用内容...</p></blockquote><br/>');
+		self.focus();
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/table/table.js b/public/assets/addons/nkeditor/plugins/table/table.js
new file mode 100644
index 0000000..1068edc
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/table/table.js
@@ -0,0 +1,746 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('table', function(K) {
+	var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder';
+	var borderColor = K.undef(self.options.tableBorderColor, '#cccccc');
+	// 设置颜色
+	function _setColor(box, color) {
+		color = color.toUpperCase();
+		box.css('background-color', color);
+		box.css('color', color === '#000000' ? '#FFFFFF' : '#000000');
+		box.html(color);
+	}
+	// 初始化取色器
+	var pickerList = [];
+	function _initColorPicker(dialogDiv, colorBox) {
+		colorBox.bind('click,mousedown', function(e){
+			e.stopPropagation();
+		});
+		function removePicker() {
+			K.each(pickerList, function() {
+				this.remove();
+			});
+			pickerList = [];
+			K(document).unbind('click,mousedown', removePicker);
+			dialogDiv.unbind('click,mousedown', removePicker);
+		}
+		colorBox.click(function(e) {
+			removePicker();
+			var box = K(this),
+				pos = box.pos();
+			var picker = K.colorpicker({
+				x : pos.x,
+				y : pos.y + box.height(),
+				z : 811214,
+				selectedColor : K(this).html(),
+				colors : self.colorTable,
+				noColor : self.lang('noColor'),
+				shadowMode : self.shadowMode,
+				click : function(color) {
+					_setColor(box, color);
+					removePicker();
+				}
+			});
+			pickerList.push(picker);
+			K(document).bind('click,mousedown', removePicker);
+			dialogDiv.bind('click,mousedown', removePicker);
+		});
+	}
+	// 取得下一行cell的index
+	function _getCellIndex(table, row, cell) {
+		var rowSpanCount = 0;
+		for (var i = 0, len = row.cells.length; i < len; i++) {
+			if (row.cells[i] == cell) {
+				break;
+			}
+			rowSpanCount += row.cells[i].rowSpan - 1;
+		}
+		return cell.cellIndex - rowSpanCount;
+	}
+	self.plugin.table = {
+		//insert or modify table
+		prop : function(isInsert) {
+			var html = [
+				'<div class="ke-dialog-content-inner">',
+				//rows, cols
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keRows" class="row-left">' + lang.cells + ':</label>',
+				'<div class="row-right">',
+				lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',
+				lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',
+				'</div>',
+				'</div>',
+				//width, height
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keWidth" class="row-left">' + lang.size + ':</label>',
+				'<div class="row-right">',
+				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+				'<select name="widthType" class="ke-select">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select> &nbsp; ',
+				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+				'<select name="heightType" class="ke-select">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select>',
+				'</div>',
+				'</div>',
+				//space, padding
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="kePadding" class="row-left">' + lang.space + ':</label>',
+				'<div class="row-right">',
+				lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',
+				lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',
+				'</div>',
+				'</div>',
+				//align
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keAlign" class="row-left">' + lang.align + ':</label>',
+				'<div class="row-right">',
+				'<select id="keAlign" class="ke-select" name="align">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="left">' + lang.alignLeft + '</option>',
+				'<option value="center">' + lang.alignCenter + '</option>',
+				'<option value="right">' + lang.alignRight + '</option>',
+				'</select>',
+				'</div>',
+				'</div>',
+				//border
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keBorder" class="row-left">' + lang.border + ':</label>',
+				'<div class="row-right">',
+				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>',
+				//background color
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keBgColor" class="row-left">' + lang.backgroundColor + ':</label>',
+				'<div class="row-right">',
+				'<span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>',
+				'</div>'
+			].join('');
+			var bookmark = self.cmd.range.createBookmark();
+			var dialog = self.createDialog({
+				name : name,
+				width : 500,
+				title : self.lang(name),
+				body : html,
+				beforeRemove : function() {
+					colorBox.unbind();
+				},
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var rows = rowsBox.val(),
+							cols = colsBox.val(),
+							width = widthBox.val(),
+							height = heightBox.val(),
+							widthType = widthTypeBox.val(),
+							heightType = heightTypeBox.val(),
+							padding = paddingBox.val(),
+							spacing = spacingBox.val(),
+							align = alignBox.val(),
+							border = borderBox.val(),
+							borderColor = K(colorBox[0]).html() || '',
+							bgColor = K(colorBox[1]).html() || '';
+						if (rows == 0 || !/^\d+$/.test(rows)) {
+							K.options.errorMsgHandler(self.lang('invalidRows'), "error");
+							rowsBox[0].focus();
+							return;
+						}
+						if (cols == 0 || !/^\d+$/.test(cols)) {
+							K.options.errorMsgHandler(self.lang('invalidRows'), "error");
+							colsBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+							heightBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(padding)) {
+							K.options.errorMsgHandler(self.lang('invalidPadding'), "error");
+							paddingBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(spacing)) {
+							K.options.errorMsgHandler(self.lang('invalidSpacing'), "error");
+							spacingBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(border)) {
+							K.options.errorMsgHandler(self.lang('invalidBorder'), "error");
+							borderBox[0].focus();
+							return;
+						}
+						//modify table
+						if (table) {
+							if (width !== '') {
+								table.width(width + widthType);
+							} else {
+								table.css('width', '');
+							}
+							if (table[0].width !== undefined) {
+								table.removeAttr('width');
+							}
+							if (height !== '') {
+								table.height(height + heightType);
+							} else {
+								table.css('height', '');
+							}
+							if (table[0].height !== undefined) {
+								table.removeAttr('height');
+							}
+							table.css('background-color', bgColor);
+							if (table[0].bgColor !== undefined) {
+								table.removeAttr('bgColor');
+							}
+							if (padding !== '') {
+								table[0].cellPadding = padding;
+							} else {
+								table.removeAttr('cellPadding');
+							}
+							if (spacing !== '') {
+								table[0].cellSpacing = spacing;
+							} else {
+								table.removeAttr('cellSpacing');
+							}
+							if (align !== '') {
+								table[0].align = align;
+							} else {
+								table.removeAttr('align');
+							}
+							if (border !== '') {
+								table.attr('border', border);
+							} else {
+								table.removeAttr('border');
+							}
+							if (border === '' || border === '0') {
+								table.addClass(zeroborder);
+							} else {
+								table.removeClass(zeroborder);
+							}
+							if (borderColor !== '') {
+								table.attr('borderColor', borderColor);
+							} else {
+								table.removeAttr('borderColor');
+							}
+							self.hideDialog().focus();
+							self.cmd.range.moveToBookmark(bookmark);
+							self.cmd.select();
+							self.addBookmark();
+							return;
+						}
+						//insert new table
+						var style = '';
+						if (width !== '') {
+							style += 'width:' + width + widthType + ';';
+						}
+						if (height !== '') {
+							style += 'height:' + height + heightType + ';';
+						}
+						if (bgColor !== '') {
+							style += 'background-color:' + bgColor + ';';
+						}
+						var html = '<table class="table"';
+						if (style !== '') {
+							html += ' style="' + style + '"';
+						}
+						if (padding !== '') {
+							html += ' cellpadding="' + padding + '"';
+						}
+						if (spacing !== '') {
+							html += ' cellspacing="' + spacing + '"';
+						}
+						if (align !== '') {
+							html += ' align="' + align + '"';
+						}
+						if (border !== '') {
+							html += ' border="' + border + '"';
+						}
+						if (border === '' || border === '0') {
+							html += ' class="table ' + zeroborder + '"';
+						}
+						if (borderColor !== '') {
+							html += ' bordercolor="' + borderColor + '"';
+						}
+						html += '>';
+						for (var i = 0; i < rows; i++) {
+							html += '<tr>';
+							for (var j = 0; j < cols; j++) {
+								html += '<td>' + (K.IE ? '&nbsp;' : '<br />') + '</td>';
+							}
+							html += '</tr>';
+						}
+						html += '</table>';
+						if (!K.IE) {
+							html += '<br />';
+						}
+						// 取得range的block标签
+						function getAncestorTag(range) {
+							var ancestor = K(range.commonAncestor());
+							while (ancestor) {
+								if (ancestor.type == 1 && !ancestor.isStyle()) {
+									break;
+								}
+								ancestor = ancestor.parent();
+							}
+							return ancestor;
+						}
+						// 如果是在 p 标签中插入表格,则自动删除当前 p 标签
+						var tag = getAncestorTag(self.cmd.range);
+						if (tag.name == 'p') {
+							tag.before(K(html));
+							tag.remove();
+							self.cmd.selection();
+							self.insertHtml('<br />');
+							self.select().hideDialog().focus();
+						} else {
+							self.insertHtml(html);
+							self.select().hideDialog().focus();
+							self.addBookmark();
+						}
+					}
+				}
+			}),
+			div = dialog.div,
+			rowsBox = K('[name="rows"]', div).val(3),
+			colsBox = K('[name="cols"]', div).val(2),
+			widthBox = K('[name="width"]', div).val(100),
+			heightBox = K('[name="height"]', div),
+			widthTypeBox = K('[name="widthType"]', div),
+			heightTypeBox = K('[name="heightType"]', div),
+			paddingBox = K('[name="padding"]', div).val(0),
+			spacingBox = K('[name="spacing"]', div).val(0),
+			alignBox = K('[name="align"]', div),
+			borderBox = K('[name="border"]', div).val(1),
+			colorBox = K('.ke-input-color', div);
+			_initColorPicker(div, colorBox.eq(0));
+			_initColorPicker(div, colorBox.eq(1));
+			//_setColor(colorBox.eq(0), borderColor);
+			_setColor(colorBox.eq(1), '');
+			// foucs and select
+			rowsBox[0].focus();
+			rowsBox[0].select();
+			var table;
+			if (isInsert) {
+				return;
+			}
+			//get selected table node
+			table = self.plugin.getSelectedTable();
+			if (table) {
+				rowsBox.val(table[0].rows.length);
+				colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0);
+				rowsBox.attr('disabled', true);
+				colsBox.attr('disabled', true);
+				var match,
+					tableWidth = table[0].style.width || table[0].width,
+					tableHeight = table[0].style.height || table[0].height;
+				if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) {
+					widthBox.val(match[1]);
+					widthTypeBox.val(match[2]);
+				} else {
+					widthBox.val('');
+				}
+				if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) {
+					heightBox.val(match[1]);
+					heightTypeBox.val(match[2]);
+				}
+				paddingBox.val(table[0].cellPadding || '');
+				spacingBox.val(table[0].cellSpacing || '');
+				alignBox.val(table[0].align || '');
+				borderBox.val(table[0].border === undefined ? '' : table[0].border);
+				_setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || ''));
+				_setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || ''));
+				widthBox[0].focus();
+				widthBox[0].select();
+			}
+		},
+		//modify cell
+		cellprop : function() {
+			var html = [
+				'<div style="padding:20px;">',
+				//width, height
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
+				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+				'<select name="widthType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select> &nbsp; ',
+				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+				'<select name="heightType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select>',
+				'</div>',
+				//align
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
+				lang.textAlign + ' <select id="keAlign" name="textAlign">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="left">' + lang.alignLeft + '</option>',
+				'<option value="center">' + lang.alignCenter + '</option>',
+				'<option value="right">' + lang.alignRight + '</option>',
+				'</select> ',
+				lang.verticalAlign + ' <select name="verticalAlign">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="top">' + lang.alignTop + '</option>',
+				'<option value="middle">' + lang.alignMiddle + '</option>',
+				'<option value="bottom">' + lang.alignBottom + '</option>',
+				'<option value="baseline">' + lang.alignBaseline + '</option>',
+				'</select>',
+				'</div>',
+				//border
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
+				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				//background color
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
+				'<span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>'
+			].join('');
+			var bookmark = self.cmd.range.createBookmark();
+			var dialog = self.createDialog({
+				name : name,
+				width : 500,
+				title : self.lang('tablecell'),
+				body : html,
+				beforeRemove : function() {
+					colorBox.unbind();
+				},
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var width = widthBox.val(),
+							height = heightBox.val(),
+							widthType = widthTypeBox.val(),
+							heightType = heightTypeBox.val(),
+							padding = paddingBox.val(),
+							spacing = spacingBox.val(),
+							textAlign = textAlignBox.val(),
+							verticalAlign = verticalAlignBox.val(),
+							border = borderBox.val(),
+							borderColor = K(colorBox[0]).html() || '',
+							bgColor = K(colorBox[1]).html() || '';
+						if (!/^\d*$/.test(width)) {
+							K.options.errorMsgHandler(self.lang('invalidWidth'), "error");
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							K.options.errorMsgHandler(self.lang('invalidHeight'), "error");
+							heightBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(border)) {
+							K.options.errorMsgHandler(self.lang('invalidBorder'), "error");
+							borderBox[0].focus();
+							return;
+						}
+						cell.css({
+							width : width !== '' ? (width + widthType) : '',
+							height : height !== '' ? (height + heightType) : '',
+							'background-color' : bgColor,
+							'text-align' : textAlign,
+							'vertical-align' : verticalAlign,
+							'border-width' : border,
+							'border-style' : border !== '' ? 'solid' : '',
+							'border-color' : borderColor
+						});
+						self.hideDialog().focus();
+						self.cmd.range.moveToBookmark(bookmark);
+						self.cmd.select();
+						self.addBookmark();
+					}
+				}
+			}),
+			div = dialog.div,
+			widthBox = K('[name="width"]', div).val(100),
+			heightBox = K('[name="height"]', div),
+			widthTypeBox = K('[name="widthType"]', div),
+			heightTypeBox = K('[name="heightType"]', div),
+			paddingBox = K('[name="padding"]', div).val(0),
+			spacingBox = K('[name="spacing"]', div).val(0),
+			textAlignBox = K('[name="textAlign"]', div),
+			verticalAlignBox = K('[name="verticalAlign"]', div),
+			borderBox = K('[name="border"]', div).val(1),
+			colorBox = K('.ke-input-color', div);
+			_initColorPicker(div, colorBox.eq(0));
+			_initColorPicker(div, colorBox.eq(1));
+			//_setColor(colorBox.eq(0), '#000000');
+			_setColor(colorBox.eq(1), '');
+			// foucs and select
+			widthBox[0].focus();
+			widthBox[0].select();
+			// get selected cell
+			var cell = self.plugin.getSelectedCell();
+			var match,
+				cellWidth = cell[0].style.width || cell[0].width || '',
+				cellHeight = cell[0].style.height || cell[0].height || '';
+			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) {
+				widthBox.val(match[1]);
+				widthTypeBox.val(match[2]);
+			} else {
+				widthBox.val('');
+			}
+			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) {
+				heightBox.val(match[1]);
+				heightTypeBox.val(match[2]);
+			}
+			textAlignBox.val(cell[0].style.textAlign || '');
+			verticalAlignBox.val(cell[0].style.verticalAlign || '');
+			var border = cell[0].style.borderWidth || '';
+			if (border) {
+				border = parseInt(border);
+			}
+			borderBox.val(border);
+			_setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || ''));
+			_setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || ''));
+			widthBox[0].focus();
+			widthBox[0].select();
+		},
+		insert : function() {
+			this.prop(true);
+		},
+		'delete' : function() {
+			var table = self.plugin.getSelectedTable();
+			self.cmd.range.setStartBefore(table[0]).collapse(true);
+			self.cmd.select();
+			table.remove();
+			self.addBookmark();
+		},
+		colinsert : function(offset) {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				index = cell.cellIndex + offset;
+			// 取得第一行的index
+			index += table.rows[0].cells.length - row.cells.length;
+
+			for (var i = 0, len = table.rows.length; i < len; i++) {
+				var newRow = table.rows[i],
+					newCell = newRow.insertCell(index);
+				newCell.innerHTML = K.IE ? '' : '<br />';
+				// 调整下一行的单元格index
+				index = _getCellIndex(table, newRow, newCell);
+			}
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colinsertleft : function() {
+			this.colinsert(0);
+		},
+		colinsertright : function() {
+			this.colinsert(1);
+		},
+		rowinsert : function(offset) {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0];
+			var rowIndex = row.rowIndex;
+			if (offset === 1) {
+				rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset;
+			}
+			var newRow = table.insertRow(rowIndex);
+
+			for (var i = 0, len = row.cells.length; i < len; i++) {
+				// 调整cell个数
+				if (row.cells[i].rowSpan > 1) {
+					len -= row.cells[i].rowSpan - 1;
+				}
+				var newCell = newRow.insertCell(i);
+				// copy colspan
+				if (offset === 1 && row.cells[i].colSpan > 1) {
+					newCell.colSpan = row.cells[i].colSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+			}
+			// 调整rowspan
+			for (var j = rowIndex; j >= 0; j--) {
+				var cells = table.rows[j].cells;
+				if (cells.length > i) {
+					for (var k = cell.cellIndex; k >= 0; k--) {
+						if (cells[k].rowSpan > 1) {
+							cells[k].rowSpan += 1;
+						}
+					}
+					break;
+				}
+			}
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		rowinsertabove : function() {
+			this.rowinsert(0);
+		},
+		rowinsertbelow : function() {
+			this.rowinsert(1);
+		},
+		rowmerge : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex, // 当前行的index
+				nextRowIndex = rowIndex + cell.rowSpan, // 下一行的index
+				nextRow = table.rows[nextRowIndex]; // 下一行
+			// 最后一行不能合并
+			if (table.rows.length <= nextRowIndex) {
+				return;
+			}
+			var cellIndex = cell.cellIndex; // 下一行单元格的index
+			if (nextRow.cells.length <= cellIndex) {
+				return;
+			}
+			var nextCell = nextRow.cells[cellIndex]; // 下一行单元格
+			// 上下行的colspan不一致时不能合并
+			if (cell.colSpan !== nextCell.colSpan) {
+				return;
+			}
+			cell.rowSpan += nextCell.rowSpan;
+			nextRow.deleteCell(cellIndex);
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colmerge : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex, // 当前行的index
+				cellIndex = cell.cellIndex,
+				nextCellIndex = cellIndex + 1;
+			// 最后一列不能合并
+			if (row.cells.length <= nextCellIndex) {
+				return;
+			}
+			var nextCell = row.cells[nextCellIndex];
+			// 左右列的rowspan不一致时不能合并
+			if (cell.rowSpan !== nextCell.rowSpan) {
+				return;
+			}
+			cell.colSpan += nextCell.colSpan;
+			row.deleteCell(nextCellIndex);
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		rowsplit : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex;
+			// 不是可分割单元格
+			if (cell.rowSpan === 1) {
+				return;
+			}
+			var cellIndex = _getCellIndex(table, row, cell);
+			for (var i = 1, len = cell.rowSpan; i < len; i++) {
+				var newRow = table.rows[rowIndex + i],
+					newCell = newRow.insertCell(cellIndex);
+				if (cell.colSpan > 1) {
+					newCell.colSpan = cell.colSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+				// 调整下一行的单元格index
+				cellIndex = _getCellIndex(table, newRow, newCell);
+			}
+			K(cell).removeAttr('rowSpan');
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colsplit : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				cellIndex = cell.cellIndex;
+			// 不是可分割单元格
+			if (cell.colSpan === 1) {
+				return;
+			}
+			for (var i = 1, len = cell.colSpan; i < len; i++) {
+				var newCell = row.insertCell(cellIndex + i);
+				if (cell.rowSpan > 1) {
+					newCell.rowSpan = cell.rowSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+			}
+			K(cell).removeAttr('colSpan');
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		coldelete : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				index = cell.cellIndex;
+			for (var i = 0, len = table.rows.length; i < len; i++) {
+				var newRow = table.rows[i],
+					newCell = newRow.cells[index];
+				if (newCell.colSpan > 1) {
+					newCell.colSpan -= 1;
+					if (newCell.colSpan === 1) {
+						K(newCell).removeAttr('colSpan');
+					}
+				} else {
+					newRow.deleteCell(index);
+				}
+				// 跳过不需要删除的行
+				if (newCell.rowSpan > 1) {
+					i += newCell.rowSpan - 1;
+				}
+			}
+			if (row.cells.length === 0) {
+				self.cmd.range.setStartBefore(table).collapse(true);
+				self.cmd.select();
+				K(table).remove();
+			} else {
+				self.cmd.selection(true);
+			}
+			self.addBookmark();
+		},
+		rowdelete : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex;
+			// 从下到上删除
+			for (var i = cell.rowSpan - 1; i >= 0; i--) {
+				table.deleteRow(rowIndex + i);
+			}
+			if (table.rows.length === 0) {
+				self.cmd.range.setStartBefore(table).collapse(true);
+				self.cmd.select();
+				K(table).remove();
+			} else {
+				self.cmd.selection(true);
+			}
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.table.prop);
+});
diff --git a/public/assets/addons/nkeditor/plugins/template/html/1.html b/public/assets/addons/nkeditor/plugins/template/html/1.html
new file mode 100644
index 0000000..034126b
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/template/html/1.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<h3>
+		<img align="left" height="100" style="margin-right: 10px" width="100" />在此处输入标题
+	</h3>
+	<p>
+		在此处输入内容
+	</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/template/html/2.html b/public/assets/addons/nkeditor/plugins/template/html/2.html
new file mode 100644
index 0000000..dc2584a
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/template/html/2.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<h3>
+		标题
+	</h3>
+	<table style="width:100%;" cellpadding="2" cellspacing="0" border="1">
+		<tbody>
+			<tr>
+				<td>
+					<h3>标题1</h3>
+				</td>
+				<td>
+					<h3>标题1</h3>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					内容1
+				</td>
+				<td>
+					内容2
+				</td>
+			</tr>
+			<tr>
+				<td>
+					内容3
+				</td>
+				<td>
+					内容4
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	<p>
+		表格说明
+	</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/template/html/3.html b/public/assets/addons/nkeditor/plugins/template/html/3.html
new file mode 100644
index 0000000..873f0c6
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/template/html/3.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<p>
+		在此处输入内容
+	</p>
+	<ol>
+		<li>
+			描述1
+		</li>
+		<li>
+			描述2
+		</li>
+		<li>
+			描述3
+		</li>
+	</ol>
+	<p>
+		在此处输入内容
+	</p>
+	<ul>
+		<li>
+			描述1
+		</li>
+		<li>
+			描述2
+		</li>
+		<li>
+			描述3
+		</li>
+	</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/plugins/template/template.js b/public/assets/addons/nkeditor/plugins/template/template.js
new file mode 100644
index 0000000..30d0dc3
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/template/template.js
@@ -0,0 +1,58 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('template', function(K) {
+	var self = this, name = 'template', lang = self.lang(name + '.'),
+		htmlPath = self.pluginsPath + name + '/html/';
+	function getFilePath(fileName) {
+		return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION);
+	}
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			arr = ['<div class="ke-dialog-content-inner" style="padding-top:0">',
+				'<div class="ke-dialog-row ke-clearfix">',
+				'<div class="ke-header" style="height: 32px;">',
+				// left start
+				lang. selectTemplate + ' <select class="ke-select">'];
+			K.each(lang.fileList, function(key, val) {
+				arr.push('<option value="' + key + '">' + val + '</option>');
+			});
+			html = [arr.join(''),
+				'</select>',
+				// right start
+				'<input type="checkbox" id="keReplaceFlag" class="checkbox" name="replaceFlag" value="1" /> <label for="keReplaceFlag">' + lang.replaceContent + '</label>',
+				'</div>',
+				'</div>',
+
+				//template iframe
+				'<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',
+				'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 500,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var doc = K.iframeDoc(iframe);
+					self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus();
+				}
+			}
+		});
+		var selectBox = K('select', dialog.div),
+			checkbox = K('[name="replaceFlag"]', dialog.div),
+			iframe = K('iframe', dialog.div);
+		checkbox[0].checked = true;
+		iframe.attr('src', getFilePath(selectBox.val()));
+		selectBox.change(function() {
+			iframe.attr('src', getFilePath(this.value));
+		});
+	});
+});
diff --git a/public/assets/addons/nkeditor/plugins/wordpaste/wordpaste.js b/public/assets/addons/nkeditor/plugins/wordpaste/wordpaste.js
new file mode 100644
index 0000000..9f828e0
--- /dev/null
+++ b/public/assets/addons/nkeditor/plugins/wordpaste/wordpaste.js
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * KindEditor - WYSIWYG HTML Editor for Internet
+ * Copyright (C) 2006-2011 kindsoft.net
+ *
+ * @author Roddy <luolonghao@gmail.com>
+ * @site http://www.kindsoft.net/
+ * @licence http://www.kindsoft.net/license.php
+ *******************************************************************************/
+
+KindEditor.plugin('wordpaste', function (K) {
+    var self = this, name = 'wordpaste';
+    self.clickToolbar(name, function () {
+        var jsonp = function (url, callback) {
+            var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
+            window[callbackName] = function (data) {
+                delete window[callbackName];
+                document.body.removeChild(script);
+                callback(data);
+            };
+
+            var script = document.createElement('script');
+            script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
+            document.body.appendChild(script);
+        };
+        var lang = self.lang(name + '.'),
+            html = '<div style="padding:10px 20px;">' +
+                '<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+                '<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>' +
+                '</div>',
+            dialog = self.createDialog({
+                name: name,
+                width: 450,
+                title: self.lang(name),
+                body: html,
+                yesBtn: {
+                    name: self.lang('yes'),
+                    click: function (e) {
+                        var str = doc.body.innerHTML;
+                        str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags);
+                        if (typeof self.wordImageServer !== 'undefined' && self.wordImageServer) {
+                            var i = 0;
+                            var arr = [];
+                            var replacedStr = str.replace(/file:\/\/+(localhost)?(\S+\.(png|jpg|jpeg|gif|bmp))/ig, function (value) {
+                                arr[i] = value;
+                                var replaced = "##" + i + "##";
+                                i++;
+                                return replaced;
+                            });
+                            for (var j = 0; j < arr.length; j++) {
+                                jsonp("http://" + self.wordImageServer + "/word?index=" + j + "&file=" + encodeURIComponent(arr[j]), function (data) {
+                                    K.uploadwordimage.call(self, data.index, data.info);
+                                });
+                            }
+                            str = replacedStr;
+                        }
+                        self.insertHtml(str).hideDialog().focus();
+                    }
+                }
+            }),
+            div = dialog.div,
+            iframe = K('iframe', div),
+            doc = K.iframeDoc(iframe);
+        if (!K.IE) {
+            doc.designMode = 'on';
+        }
+        doc.open();
+        doc.write('<!doctype html><html><head><title>WordPaste</title></head>');
+        doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');
+        if (!K.IE) {
+            doc.write('<br />');
+        }
+        doc.write('</body></html>');
+        doc.close();
+        if (K.IE) {
+            doc.body.contentEditable = 'true';
+        }
+        iframe[0].contentWindow.focus();
+    });
+});
diff --git a/public/assets/addons/nkeditor/themes/app.css b/public/assets/addons/nkeditor/themes/app.css
new file mode 100644
index 0000000..baba45f
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/app.css
@@ -0,0 +1,96 @@
+/* 引用样式 */
+blockquote {
+    padding: 20px;
+    margin: 20px 0;
+    border: 1px solid #eee;
+    border-left-width: 5px;
+    border-left-color: #ce4844;
+    border-radius: 3px;
+}
+
+blockquote, q {
+    quotes: none;
+}
+
+/* 表格样式 */
+table {
+    border-spacing: 0;
+    border-collapse: collapse;
+}
+
+td,
+th {
+    padding: 0;
+}
+
+.table {
+    border-collapse: collapse !important;
+}
+
+.table td,
+.table th {
+    background-color: #fff !important;
+    border: 1px solid #ddd;
+}
+
+.table-bordered th,
+.table-bordered td {
+    border: 1px solid #ddd !important;
+}
+
+.table {
+    width: 100%;
+    max-width: 100%;
+    margin-bottom: 20px;
+}
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+    padding: 8px;
+    line-height: 1.42857143;
+    vertical-align: top;
+    border-top: 1px solid #ddd;
+}
+
+.table > thead > tr > th {
+    vertical-align: bottom;
+    border-bottom: 2px solid #ddd;
+}
+
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+    border-top: 0;
+}
+
+.table > tbody + tbody {
+    border-top: 2px solid #ddd;
+}
+
+.table .table {
+    background-color: #fff;
+}
+
+table col[class*="col-"] {
+    position: static;
+    display: table-column;
+    float: none;
+}
+
+table td[class*="col-"],
+table th[class*="col-"] {
+    position: static;
+    display: table-cell;
+    float: none;
+}
+
+.ke-content img {
+    max-width: 100%;
+}
diff --git a/public/assets/addons/nkeditor/themes/black/editor.css b/public/assets/addons/nkeditor/themes/black/editor.css
new file mode 100644
index 0000000..a84525c
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/black/editor.css
@@ -0,0 +1,822 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+.ke-container-black .ke-toolbar {
+  border-top: 5px solid #222222;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  background-clip: padding-box;
+  text-rendering: optimizelegibility; }
+  .ke-container-black .ke-toolbar .ke-toolbar-icon {
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-container-black .ke-toolbar .ke-icon-source {
+    background-position: 0 0px; }
+  .ke-container-black .ke-toolbar .ke-icon-preview {
+    background-position: 0 -63px; }
+  .ke-container-black .ke-toolbar .ke-icon-print {
+    background-position: 0 -84px; }
+  .ke-container-black .ke-toolbar .ke-icon-undo {
+    background-position: 0 -21px; }
+  .ke-container-black .ke-toolbar .ke-icon-redo {
+    background-position: 0 -42px; }
+  .ke-container-black .ke-toolbar .ke-icon-template {
+    background-position: 0 -105px; }
+  .ke-container-black .ke-toolbar .ke-icon-cut {
+    background-position: 0 -147px; }
+  .ke-container-black .ke-toolbar .ke-icon-copy {
+    background-position: 0 -168px; }
+  .ke-container-black .ke-toolbar .ke-icon-paste {
+    background-position: 0 -189px; }
+  .ke-container-black .ke-toolbar .ke-icon-selectall {
+    background-position: 0 -483px; }
+  .ke-container-black .ke-toolbar .ke-icon-justifyleft {
+    background-position: 0 -252px; }
+  .ke-container-black .ke-toolbar .ke-icon-justifycenter {
+    background-position: 0 -273px; }
+  .ke-container-black .ke-toolbar .ke-icon-justifyright {
+    background-position: 0 -294px; }
+  .ke-container-black .ke-toolbar .ke-icon-justifyfull {
+    background-position: 0 -315px; }
+  .ke-container-black .ke-toolbar .ke-icon-insertorderedlist {
+    background-position: 0 -336px; }
+  .ke-container-black .ke-toolbar .ke-icon-insertunorderedlist {
+    background-position: 0 -357px; }
+  .ke-container-black .ke-toolbar .ke-icon-indent {
+    background-position: 0 -378px; }
+  .ke-container-black .ke-toolbar .ke-icon-outdent {
+    background-position: 0 -399px; }
+  .ke-container-black .ke-toolbar .ke-icon-subscript {
+    background-position: 0 -420px; }
+  .ke-container-black .ke-toolbar .ke-icon-superscript {
+    background-position: 0 -441px; }
+  .ke-container-black .ke-toolbar .ke-icon-date {
+    background-position: 0px -304px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-time {
+    background-position: 0px -320px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-formatblock {
+    background-position: 0 -546px; }
+  .ke-container-black .ke-toolbar .ke-icon-fontname {
+    background-position: 0 -567px; }
+  .ke-container-black .ke-toolbar .ke-icon-fontsize {
+    background-position: 0 -588px; }
+  .ke-container-black .ke-toolbar .ke-icon-forecolor {
+    background-position: 0 -609px; }
+  .ke-container-black .ke-toolbar .ke-icon-hilitecolor {
+    background-position: 0 -630px; }
+  .ke-container-black .ke-toolbar .ke-icon-bold {
+    background-position: 0 -651px; }
+  .ke-container-black .ke-toolbar .ke-icon-italic {
+    background-position: 0 -672px; }
+  .ke-container-black .ke-toolbar .ke-icon-underline {
+    background-position: 0 -693px; }
+  .ke-container-black .ke-toolbar .ke-icon-strikethrough {
+    background-position: 0 -714px; }
+  .ke-container-black .ke-toolbar .ke-icon-removeformat {
+    background-position: 0 -756px; }
+  .ke-container-black .ke-toolbar .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-container-black .ke-toolbar .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-container-black .ke-toolbar .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-container-black .ke-toolbar .ke-icon-div {
+    background-position: 0px -544px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-formula {
+    background-position: 0px -576px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-hr {
+    background-position: 0 -924px; }
+  .ke-container-black .ke-toolbar .ke-icon-emoticons {
+    background-position: 0 -945px; }
+  .ke-container-black .ke-toolbar .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-container-black .ke-toolbar .ke-icon-unlink {
+    background-position: 0 -1029px; }
+  .ke-container-black .ke-toolbar .ke-icon-fullscreen {
+    background-position: 0 -525px; }
+  .ke-container-black .ke-toolbar .ke-icon-about {
+    background-position: 0 -1092px; }
+  .ke-container-black .ke-toolbar .ke-icon-quote {
+    background-position: 0 -1114px; }
+  .ke-container-black .ke-toolbar .ke-icon-plainpaste {
+    background-position: 0 -210px; }
+  .ke-container-black .ke-toolbar .ke-icon-wordpaste {
+    background-position: 0 -231px; }
+  .ke-container-black .ke-toolbar .ke-icon-table {
+    background-position: 0px -903px;
+    width: 18px !important; }
+  .ke-container-black .ke-toolbar .ke-icon-tablemenu {
+    background-position: 0px -768px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-code {
+    background-position: 0 -126px; }
+  .ke-container-black .ke-toolbar .ke-icon-map {
+    background-position: 0px -976px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-baidumap {
+    background-position: 0 -1050px; }
+  .ke-container-black .ke-toolbar .ke-icon-lineheight {
+    background-position: 0 -735px; }
+  .ke-container-black .ke-toolbar .ke-icon-clearhtml {
+    background-position: 0 -462px; }
+  .ke-container-black .ke-toolbar .ke-icon-pagebreak {
+    background-position: 0 -966px; }
+  .ke-container-black .ke-toolbar .ke-icon-insertfile {
+    background-position: 0 -882px; }
+  .ke-container-black .ke-toolbar .ke-icon-quickformat {
+    background-position: 0 -504px; }
+  .ke-container-black .ke-toolbar .ke-icon-anchor {
+    background-position: 0 -987px; }
+  .ke-container-black .ke-toolbar .ke-icon-search {
+    background-position: 0px -1184px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-new {
+    background-position: 0px -1200px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-specialchar {
+    background-position: 0px -1216px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-black .ke-toolbar .ke-icon-multiimage {
+    background-position: 0 -798px; }
+  .ke-container-black .ke-toolbar .ke-icon-graft {
+    background-position: 0 -819px; }
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-black .ke-menu-item .ke-menu-item-left {
+  width: 27px;
+  text-align: center;
+  overflow: hidden; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert {
+    background-position: 0 -903px;
+    width: 18px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete {
+    background-position: 0 -1428px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft {
+    background-position: 0 -1176px;
+    width: 18px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright {
+    background-position: 0 -1323px;
+    width: 18px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove {
+    background-position: 0 -1302px;
+    width: 22px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow {
+    background-position: 0 -1155px;
+    width: 22px !important; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete {
+    background-position: 0 -1239px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete {
+    background-position: 0 -1260px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop {
+    background-position: 0 -1218px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tableprop {
+    background-position: 0 -1134px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit {
+    background-position: 0px -1088px;
+    width: 16px;
+    height: 16px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge {
+    background-position: -1px -1197px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge {
+    background-position: -4px -1365px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-checked {
+    background-position: 0 -1407px; }
+
+/*# sourceMappingURL=editor.css.map */
diff --git a/public/assets/addons/nkeditor/themes/black/editor.css.map b/public/assets/addons/nkeditor/themes/black/editor.css.map
new file mode 100644
index 0000000..6d1b06d
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/black/editor.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../common/common.scss","editor.scss"],
+"names": [],
+"file": "editor.css"
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/black/editor.min.css b/public/assets/addons/nkeditor/themes/black/editor.min.css
new file mode 100644
index 0000000..f5d26e0
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/black/editor.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ke-clearfix{zoom:1;clear:both}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-dialog-lock{background-color:#fff;opacity:.5;z-index:811213;left:0;top:0;position:absolute}.ke-container{display:block;background-color:#fff;overflow:hidden;margin:0;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16)}.ke-container .ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-container .ke-dialog a,.ke-container .ke-dialog a:hover,.ke-container .ke-menu a,.ke-container .ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-container .ke-toolbar{text-align:left;overflow:hidden;zoom:1;padding:0 5px}.ke-container .ke-toolbar .ke-outline{padding:10px 5px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-container .ke-toolbar .ke-outline .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px}.ke-container .ke-toolbar .ke-on{background:#ebebeb}.ke-container .ke-toolbar .ke-selected{background-color:#ebebeb}.ke-container .ke-toolbar .ke-disabled{cursor:default}.ke-container .ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-container .ke-toolbar .ke-hr{clear:both;height:1px;width:calc(100% - (2 * 2px));background:#ebebeb}.ke-container .ke-edit{padding:0}.ke-container .ke-edit .ke-edit-iframe,.ke-container .ke-edit .ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-container .ke-edit .ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-container .ke-edit .ke-edit-textarea:focus{outline:0}.ke-container .ke-statusbar{position:relative;background-color:#f5f5f5;border-top:1px solid #e1e1e1;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize;display:none}.ke-container .ke-statusbar .ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px}.ke-container .ke-statusbar .ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;width:11px;height:11px}.ke-menu{border:1px solid #ccc;background-color:#f5f5f5;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu .ke-menu-item .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-inline-block .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu .ke-menu-item .ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu .ke-menu-item .ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #e1e1e1;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-menu .ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons{position:relative}.ke-menu .ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img{border:0;margin:0;padding:0}.ke-menu .ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell{margin:0;padding:1px;border:1px solid #f5f5f5;cursor:pointer}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-menu .ke-plugin-emoticons .ke-table .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker .ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f1f1f1;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-dialog{margin:0;padding:0;border:1px solid #ccc;zoom:1;box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden}.ke-dialog .ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom:1px solid #c6c6c6;background:transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.ke-dialog .ke-dialog-header .ke-dialog-icon-close{height:20px;width:20px;cursor:pointer;background:url(../common/icons-all.gif) 0 -59px;position:absolute;right:5px;top:4px}.ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover{background-position:0 -89px}.ke-dialog .ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border:1px solid #ccc}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus{border-color:#66afe9;outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto;border:1px solid #ccc;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number{width:50px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox{position:relative;top:6px}.ke-dialog .ke-dialog-content .ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus{outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text{display:inline-block!important;max-width:400px;height:30px;line-height:30px;border:1px solid #ccc;font-size:14px;margin:0;outline:0;padding:0 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus{border-color:#66afe9}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color{border:1px solid #e1e1e1;background-color:#fff;font-size:12px;width:60px;height:30px;line-height:30px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0;top:-1px;position:relative}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:62px;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common{top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button{padding:8px 15px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner{padding:10px 20px 0 20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row{border:1px solid #fff;margin-bottom:10px;overflow:hidden}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left{float:left;height:30px;line-height:30px;width:60px;text-align:right}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right{float:left;text-align:left}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button{position:relative;top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label{cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header{height:30px;line-height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text{height:22px;line-height:22px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button{padding:3px 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox{margin-left:10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #e1e1e1;margin-bottom:20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul{list-style:none outside none;margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected{background-color:#fff;border:1px solid #e1e1e1;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on{background-color:#fff;color:#000}.ke-dialog .ke-dialog-content .ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat center;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog .ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;height:40px}.ke-dialog .ke-dialog-footer .ke-dialog-yes{margin:5px}.ke-dialog .ke-dialog-footer .ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog .ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-dialog .ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:7px 10px;margin-top:-4px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-dialog .ke-button:hover{border:1px solid #e1e1e1;background-color:#e1e1e1}.ke-dialog .ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog .ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-container-black .ke-toolbar{border-top:5px solid #222;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);background-clip:padding-box;text-rendering:optimizelegibility}.ke-container-black .ke-toolbar .ke-toolbar-icon{background:url(images/nkeditor.svg) no-repeat}.ke-container-black .ke-toolbar .ke-icon-source{background-position:0 0}.ke-container-black .ke-toolbar .ke-icon-preview{background-position:0 -63px}.ke-container-black .ke-toolbar .ke-icon-print{background-position:0 -84px}.ke-container-black .ke-toolbar .ke-icon-undo{background-position:0 -21px}.ke-container-black .ke-toolbar .ke-icon-redo{background-position:0 -42px}.ke-container-black .ke-toolbar .ke-icon-template{background-position:0 -105px}.ke-container-black .ke-toolbar .ke-icon-cut{background-position:0 -147px}.ke-container-black .ke-toolbar .ke-icon-copy{background-position:0 -168px}.ke-container-black .ke-toolbar .ke-icon-paste{background-position:0 -189px}.ke-container-black .ke-toolbar .ke-icon-selectall{background-position:0 -483px}.ke-container-black .ke-toolbar .ke-icon-justifyleft{background-position:0 -252px}.ke-container-black .ke-toolbar .ke-icon-justifycenter{background-position:0 -273px}.ke-container-black .ke-toolbar .ke-icon-justifyright{background-position:0 -294px}.ke-container-black .ke-toolbar .ke-icon-justifyfull{background-position:0 -315px}.ke-container-black .ke-toolbar .ke-icon-insertorderedlist{background-position:0 -336px}.ke-container-black .ke-toolbar .ke-icon-insertunorderedlist{background-position:0 -357px}.ke-container-black .ke-toolbar .ke-icon-indent{background-position:0 -378px}.ke-container-black .ke-toolbar .ke-icon-outdent{background-position:0 -399px}.ke-container-black .ke-toolbar .ke-icon-subscript{background-position:0 -420px}.ke-container-black .ke-toolbar .ke-icon-superscript{background-position:0 -441px}.ke-container-black .ke-toolbar .ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-container-black .ke-toolbar .ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-container-black .ke-toolbar .ke-icon-formatblock{background-position:0 -546px}.ke-container-black .ke-toolbar .ke-icon-fontname{background-position:0 -567px}.ke-container-black .ke-toolbar .ke-icon-fontsize{background-position:0 -588px}.ke-container-black .ke-toolbar .ke-icon-forecolor{background-position:0 -609px}.ke-container-black .ke-toolbar .ke-icon-hilitecolor{background-position:0 -630px}.ke-container-black .ke-toolbar .ke-icon-bold{background-position:0 -651px}.ke-container-black .ke-toolbar .ke-icon-italic{background-position:0 -672px}.ke-container-black .ke-toolbar .ke-icon-underline{background-position:0 -693px}.ke-container-black .ke-toolbar .ke-icon-strikethrough{background-position:0 -714px}.ke-container-black .ke-toolbar .ke-icon-removeformat{background-position:0 -756px}.ke-container-black .ke-toolbar .ke-icon-image{background-position:0 -777px}.ke-container-black .ke-toolbar .ke-icon-flash{background-position:0 -840px}.ke-container-black .ke-toolbar .ke-icon-media{background-position:0 -861px}.ke-container-black .ke-toolbar .ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-hr{background-position:0 -924px}.ke-container-black .ke-toolbar .ke-icon-emoticons{background-position:0 -945px}.ke-container-black .ke-toolbar .ke-icon-link{background-position:0 -1008px}.ke-container-black .ke-toolbar .ke-icon-unlink{background-position:0 -1029px}.ke-container-black .ke-toolbar .ke-icon-fullscreen{background-position:0 -525px}.ke-container-black .ke-toolbar .ke-icon-about{background-position:0 -1092px}.ke-container-black .ke-toolbar .ke-icon-quote{background-position:0 -1114px}.ke-container-black .ke-toolbar .ke-icon-plainpaste{background-position:0 -210px}.ke-container-black .ke-toolbar .ke-icon-wordpaste{background-position:0 -231px}.ke-container-black .ke-toolbar .ke-icon-table{background-position:0 -903px;width:18px!important}.ke-container-black .ke-toolbar .ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-code{background-position:0 -126px}.ke-container-black .ke-toolbar .ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-baidumap{background-position:0 -1050px}.ke-container-black .ke-toolbar .ke-icon-lineheight{background-position:0 -735px}.ke-container-black .ke-toolbar .ke-icon-clearhtml{background-position:0 -462px}.ke-container-black .ke-toolbar .ke-icon-pagebreak{background-position:0 -966px}.ke-container-black .ke-toolbar .ke-icon-insertfile{background-position:0 -882px}.ke-container-black .ke-toolbar .ke-icon-quickformat{background-position:0 -504px}.ke-container-black .ke-toolbar .ke-icon-anchor{background-position:0 -987px}.ke-container-black .ke-toolbar .ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-container-black .ke-toolbar .ke-icon-multiimage{background-position:0 -798px}.ke-container-black .ke-toolbar .ke-icon-graft{background-position:0 -819px}.ke-menu-black .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px;background:url(images/nkeditor.svg) no-repeat}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert{background-position:0 -903px;width:18px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete{background-position:0 -1428px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft{background-position:0 -1176px;width:18px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright{background-position:0 -1323px;width:18px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove{background-position:0 -1302px;width:22px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow{background-position:0 -1155px;width:22px!important}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete{background-position:0 -1239px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete{background-position:0 -1260px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop{background-position:0 -1218px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tableprop{background-position:0 -1134px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge{background-position:-1px -1197px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit{background-position:0 -1344px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge{background-position:-4px -1365px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit{background-position:0 -1344px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-image{background-position:0 -777px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-flash{background-position:0 -840px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-media{background-position:0 -861px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-link{background-position:0 -1008px}.ke-menu-black .ke-menu-item .ke-menu-item-left .ke-icon-checked{background-position:0 -1407px}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/black/editor.scss b/public/assets/addons/nkeditor/themes/black/editor.scss
new file mode 100644
index 0000000..3148e8c
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/black/editor.scss
@@ -0,0 +1,387 @@
+@import "../common/common";
+
+.ke-container-black {
+    .ke-toolbar {
+
+        border-top: 5px solid #222222;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+        background-clip: padding-box;
+        text-rendering: optimizelegibility;
+
+        .ke-toolbar-icon {
+            *background-image: url(images/nkeditor.png);
+            background: url(images/nkeditor.svg) no-repeat;
+        }
+
+        .ke-icon-source {
+            background-position: 0 0px;
+        }
+        .ke-icon-preview {
+            background-position: 0 -63px;
+        }
+        .ke-icon-print {
+            background-position: 0 -84px;
+        }
+        .ke-icon-undo {
+            background-position: 0 -21px;
+        }
+
+        .ke-icon-redo {
+            background-position: 0 -42px;
+        }
+
+        .ke-icon-template {
+            background-position: 0 -105px;
+        }
+
+        .ke-icon-cut {
+            background-position: 0 -147px;
+        }
+
+        .ke-icon-copy {
+            background-position: 0 -168px;
+        }
+
+        .ke-icon-paste {
+            background-position: 0 -189px;
+        }
+
+        .ke-icon-selectall {
+            background-position: 0 -483px;
+        }
+
+        .ke-icon-justifyleft {
+            background-position: 0 -252px;
+        }
+
+        .ke-icon-justifycenter {
+            background-position: 0 -273px;
+        }
+
+        .ke-icon-justifyright {
+            background-position: 0 -294px;
+        }
+
+        .ke-icon-justifyfull {
+            background-position: 0 -315px;
+        }
+
+        .ke-icon-insertorderedlist {
+            background-position: 0 -336px;
+        }
+
+        .ke-icon-insertunorderedlist {
+            background-position: 0 -357px;
+        }
+
+        .ke-icon-indent {
+            background-position: 0 -378px;
+        }
+
+        .ke-icon-outdent {
+            background-position: 0 -399px;
+        }
+
+        .ke-icon-subscript {
+            background-position: 0 -420px;
+        }
+
+        .ke-icon-superscript {
+            background-position: 0 -441px;
+        }
+
+        .ke-icon-date {
+            background-position: 0px -304px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-time {
+            background-position: 0px -320px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-formatblock {
+            background-position: 0 -546px;
+        }
+
+        .ke-icon-fontname {
+            background-position: 0 -567px;
+        }
+
+        .ke-icon-fontsize {
+            background-position: 0 -588px;
+        }
+
+        .ke-icon-forecolor {
+            background-position: 0 -609px;
+        }
+
+        .ke-icon-hilitecolor {
+            background-position: 0 -630px;
+        }
+
+        .ke-icon-bold {
+            background-position: 0 -651px;
+        }
+
+        .ke-icon-italic {
+            background-position: 0 -672px;
+        }
+
+        .ke-icon-underline {
+            background-position: 0 -693px;
+        }
+
+        .ke-icon-strikethrough {
+            background-position: 0 -714px;
+        }
+
+        .ke-icon-removeformat {
+            background-position: 0 -756px;
+        }
+
+        .ke-icon-image {
+            background-position: 0 -777px;
+        }
+
+        .ke-icon-flash {
+            background-position: 0 -840px;
+        }
+
+        .ke-icon-media {
+            background-position: 0 -861px;
+        }
+
+        .ke-icon-div {
+            background-position: 0px -544px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-formula {
+            background-position: 0px -576px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-hr {
+            background-position: 0 -924px;
+        }
+
+        .ke-icon-emoticons {
+            background-position: 0 -945px;
+        }
+
+        .ke-icon-link {
+            background-position: 0 -1008px;
+        }
+
+        .ke-icon-unlink {
+            background-position: 0 -1029px;
+        }
+
+        .ke-icon-fullscreen {
+            background-position: 0 -525px;
+        }
+
+        .ke-icon-about {
+            background-position: 0 -1092px;
+        }
+
+        .ke-icon-quote {
+            background-position: 0 -1114px;
+        }
+
+        .ke-icon-plainpaste {
+            background-position: 0 -210px;
+        }
+
+        .ke-icon-wordpaste {
+            background-position: 0 -231px;
+        }
+
+        .ke-icon-table {
+            background-position: 0px -903px;
+            width: 18px !important;
+        }
+
+        .ke-icon-tablemenu {
+            background-position: 0px -768px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-code {
+            background-position: 0 -126px;
+        }
+
+        .ke-icon-map {
+            background-position: 0px -976px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-baidumap {
+            background-position: 0 -1050px;
+        }
+
+        .ke-icon-lineheight {
+            background-position: 0 -735px;
+        }
+
+        .ke-icon-clearhtml {
+            background-position: 0 -462px;
+        }
+
+        .ke-icon-pagebreak {
+            background-position: 0 -966px;
+        }
+
+        .ke-icon-insertfile {
+            background-position: 0 -882px;
+        }
+
+        .ke-icon-quickformat {
+            background-position: 0 -504px;
+        }
+
+        .ke-icon-anchor {
+            background-position: 0 -987px;
+        }
+
+        .ke-icon-search {
+            background-position: 0px -1184px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-new {
+            background-position: 0px -1200px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-specialchar {
+            background-position: 0px -1216px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-multiimage {
+            background-position: 0 -798px;
+        }
+
+        .ke-icon-graft {
+            background-position: 0 -819px;
+        }
+    }
+}
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-black {
+
+    .ke-menu-item {
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+                *background-image: url(images/nkeditor.png);
+                background: url(images/nkeditor.svg) no-repeat;
+            }
+
+            .ke-icon-tableinsert {
+                background-position: 0 -903px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tabledelete {
+                background-position: 0 -1428px;
+            }
+
+            .ke-icon-tablecolinsertleft {
+                background-position: 0 -1176px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablecolinsertright {
+                background-position: 0 -1323px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablerowinsertabove {
+                background-position: 0 -1302px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablerowinsertbelow {
+                background-position: 0 -1155px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablecoldelete {
+                background-position: 0 -1239px;
+            }
+
+            .ke-icon-tablerowdelete {
+                background-position: 0 -1260px;
+            }
+
+            .ke-icon-tablecellprop {
+                background-position: 0 -1218px;
+            }
+
+            .ke-icon-tableprop {
+                background-position: 0 -1134px;
+            }
+            .ke-icon-tablecellsplit {
+                background-position: 0px -1088px;
+                width: 16px;
+                height: 16px;
+            }
+
+            .ke-icon-tablerowmerge {
+                background-position: -1px -1197px;
+            }
+
+            .ke-icon-tablerowsplit {
+                background-position: 0 -1344px;
+            }
+
+            .ke-icon-tablecolmerge {
+                background-position: -4px -1365px;
+            }
+
+            .ke-icon-tablecolsplit {
+                background-position: 0 -1344px;
+            }
+
+            //图片,视频右键菜单
+            .ke-icon-image {
+                background-position: 0 -777px;
+            }
+            .ke-icon-flash {
+                background-position: 0 -840px;
+            }
+            .ke-icon-media {
+                background-position: 0 -861px;
+            }
+            .ke-icon-link {
+                background-position: 0 -1008px;
+            }
+
+            .ke-icon-checked {
+                background-position: 0 -1407px;
+            }
+
+        }
+    }
+}
+//menu end
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/black/images/nkeditor.png b/public/assets/addons/nkeditor/themes/black/images/nkeditor.png
new file mode 100644
index 0000000..f3fbea2
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/black/images/nkeditor.png differ
diff --git a/public/assets/addons/nkeditor/themes/black/images/nkeditor.svg b/public/assets/addons/nkeditor/themes/black/images/nkeditor.svg
new file mode 100644
index 0000000..56416dd
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/black/images/nkeditor.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="1549" viewBox="0 0 21 1549">
+<svg id="icon-source-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="0">
+<path fill="#333" d="M14.4 16h-12.8c-0.884 0-1.6-0.716-1.6-1.6v-12.8c0-0.884 0.716-1.6 1.6-1.6h12.8c0.884 0 1.6 0.716 1.6 1.6v12.8c0 0.884-0.716 1.6-1.6 1.6zM14.4 2.4h-12.8v12h12.8v-12zM6.4 5.6l-2.4 3.2 2.4 2.4-0.8 0.8-3.2-3.2 3.2-4 0.8 0.8zM9.6 4l-1.6 8.8h-1.6l1.6-8.8h1.6zM10.4 4.8l3.2 4-3.2 3.2-0.8-0.8 2.4-2.4-2.4-3.2 0.8-0.8z"></path>
+</svg>
+<svg id="icon-undo" width="16" height="16" viewBox="0 0 16 16" x="0" y="21">
+<path fill="#333" d="M12.161 16c1.777-3.219 2.076-8.13-4.904-7.966v3.966l-6-6 6-6v3.881c8.359-0.218 9.29 7.378 4.904 12.119z"></path>
+</svg>
+<svg id="icon-redo" width="16" height="16" viewBox="0 0 16 16" x="0" y="42">
+<path fill="#333" d="M9 3.881v-3.881l6 6-6 6v-3.966c-6.981-0.164-6.681 4.747-4.904 7.966-4.386-4.741-3.454-12.337 4.904-12.119z"></path>
+</svg>
+<svg id="icon-preview" width="16" height="16" viewBox="0 0 16 16" x="0" y="63">
+<path fill="#333" d="M11.566 10.552c1.261-1.733 1.095-4.134-0.425-5.645-0.827-0.827-1.922-1.275-3.089-1.275-1.166 0-2.261 0.456-3.089 1.275-0.811 0.827-1.269 1.922-1.269 3.086s0.456 2.259 1.277 3.086c0.827 0.827 1.922 1.275 3.089 1.275 0.922 0 1.805-0.291 2.561-0.85l2.269 2.259c0.127 0.127 0.292 0.197 0.473 0.197s0.347-0.070 0.473-0.197c0.259-0.259 0.259-0.684 0-0.945l-2.27-2.266zM5.916 10.134c-1.181-1.181-1.181-3.094 0-4.275 0.575-0.575 1.331-0.881 2.142-0.881s1.567 0.316 2.142 0.881c1.181 1.181 1.181 3.094 0 4.275-1.141 1.133-3.142 1.133-4.284 0z"></path>
+<path fill="#333" d="M11.431 1h-6.855c-1.969 0-3.577 1.598-3.577 3.575v6.85c0 1.969 1.6 3.575 3.577 3.575h3.719c0.37 0 0.67-0.298 0.67-0.669s-0.3-0.669-0.67-0.669h-3.719c-1.23 0-2.23-1-2.23-2.228v-6.852c0-1.228 1-2.228 2.23-2.228h6.855c1.23 0 2.23 1 2.23 2.228v3.645c0 0.37 0.3 0.669 0.67 0.669s0.67-0.298 0.67-0.669v-3.661c-0.002-1.969-1.602-3.567-3.57-3.567z"></path>
+</svg>
+<svg id="icon-print" width="16" height="16" viewBox="0 0 16 16" x="0" y="84">
+<path fill="#333" d="M4.98 14.938h5.967c0.548 0 0.975-0.461 0.975-1.011v-2.973h-7.922v2.973c0 0.55 0.431 1.011 0.98 1.011zM10.947 1.016h-5.967c-0.548 0-0.98 0.428-0.98 0.978v2.959h7.922v-2.959c0-0.55-0.427-0.978-0.975-0.978z"></path>
+<path fill="#333" d="M12.922 4.953v1.016h-9.922v-1.016h-1.003c-0.55 0-0.981 0.469-0.981 1.019v6.961c0 0.55 0.431 1.005 0.981 1.005h1.003v-3.984h9.922v3.984h1.008c0.548 0 1.008-0.455 1.008-1.005v-6.961c0-0.55-0.458-1.019-1.008-1.019h-1.008zM12.922 7.984h-2.969v-1.016h2.969v1.016z"></path>
+</svg>
+<svg id="icon-template" width="16" height="16" viewBox="0 0 16 16" x="0" y="105">
+<path fill="#333" d="M8.824 4.504h-8.504v8.536h8.504v-8.536zM6.632 10.84h-0.68v-3.056l-1.056 3.056h-0.608l-1.048-3.104v3.104h-0.68v-4.28h0.952l0.992 2.976c0.048 0.144 0.088 0.264 0.12 0.376 0.040-0.12 0.088-0.264 0.144-0.424l1-2.92h0.872v4.272zM14.88 2.84l-2.024-2.032c-0.44-0.44-1.312-0.808-1.936-0.808h-6.8c-0.624 0-1.136 0.512-1.136 1.136v2.296h0.904v-2.296c0-0.12 0.104-0.224 0.224-0.224h6.8c0.064 0 0.144 0.008 0.224 0.024v3.616h3.6c0.016 0.080 0.024 0.528 0.024 0.6v9.712c0 0.12-0.104 0.224-0.224 0.224h-10.432c-0.12 0-0.224-0.104-0.224-0.224v-0.76h-0.904v0.76c0 0.624 0.512 1.136 1.136 1.136h10.432c0.624 0 1.136-0.512 1.136-1.136v-9.712c0-0.624-0.36-1.872-0.8-2.312zM12.056 3.64v-2.328c0.064 0.040 0.112 0.088 0.16 0.136l2.024 2.032c0.048 0.048 0.088 0.096 0.136 0.16h-2.32zM9.864 9.6h3.72v-1.064h-3.72v1.064zM9.864 11.736h3.72v-1.064h-3.72v1.064zM13.584 6.4h-3.72v1.064h3.72v-1.064z"></path>
+</svg>
+<svg id="icon-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="126">
+<path fill="#333" d="M5.015 3.754l-0.708-0.585c-0.215-0.154-0.462-0.123-0.646 0.062l-3.569 4.492c-0.123 0.154-0.123 0.4 0 0.585l3.6 4.462c0.154 0.185 0.431 0.246 0.646 0.062l0.708-0.585c0.215-0.154 0.246-0.462 0.062-0.646l-2.892-3.6 2.923-3.6c0.123-0.185 0.092-0.462-0.123-0.646zM15.908 7.723l-3.6-4.462c-0.154-0.185-0.431-0.246-0.646-0.062l-0.708 0.585c-0.215 0.154-0.246 0.462-0.062 0.646l2.923 3.6-2.923 3.6c-0.154 0.185-0.123 0.492 0.062 0.646l0.708 0.585c0.215 0.154 0.462 0.123 0.646-0.062l3.6-4.492c0.123-0.215 0.123-0.431 0-0.585zM9.723 3.323l-0.923-0.215c-0.246-0.062-0.523 0.092-0.585 0.338l-2.277 8.738c-0.062 0.246 0.092 0.492 0.338 0.554l0.923 0.215c0.246 0.062 0.523-0.092 0.585-0.338l2.277-8.738c0.062-0.277-0.092-0.492-0.338-0.554z"></path>
+</svg>
+<svg id="icon-crop" width="16" height="16" viewBox="0 0 16 16" x="0" y="147">
+<path fill="#333" d="M13.585 0.288c1.548 1.972 0.581 3.752 0.581 3.752l-6.049 7.649s-4.161-4.761-5.855-7.12c-1.693-2.356 0.099-4.569 0.099-4.569l5.757 7.312 5.467-7.023zM8.074 10.223c0.469 0 0.846-0.378 0.846-0.842 0-0.224-0.090-0.439-0.249-0.597s-0.374-0.246-0.598-0.246c-0.467 0-0.848 0.377-0.848 0.842s0.381 0.842 0.848 0.842zM11.641 10.395c0.746-0.002 1.462 0.292 1.989 0.818s0.827 1.24 0.829 1.985c-0.002 0.746-0.3 1.459-0.829 1.985s-1.244 0.819-1.989 0.817c-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.3-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM11.641 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001zM4.575 10.395c0.746-0.002 1.461 0.292 1.989 0.818s0.826 1.24 0.829 1.985c-0.005 1.552-1.266 2.807-2.818 2.802-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.299-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM4.575 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001z"></path>
+</svg>
+<svg id="icon-copy" width="16" height="16" viewBox="0 0 16 16" x="0" y="168">
+<path fill="#333" d="M3 10h7v1h-7v-1z"></path>
+<path fill="#333" d="M3 8h7v1h-7v-1z"></path>
+<path fill="#333" d="M3 12h4v1h-4v-1z"></path>
+<path fill="#333" d="M14 0h-9c-1.1 0-2 0.9-2 2h1c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9c0 0.6-0.4 1-1 1v1c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2z"></path>
+<path fill="#333" d="M3 6h7v1h-7v-1z"></path>
+<path fill="#333" d="M11 3h-9c-1.1 0-2 0.9-2 2v9c0 1.1 0.9 2 2 2h9c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2zM12 14c0 0.6-0.4 1-1 1h-9c-0.6 0-1-0.4-1-1v-9c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9z"></path>
+</svg>
+<svg id="icon-paste" width="16" height="16" viewBox="0 0 16 16" x="0" y="189">
+<path fill="#333" d="M13.644 7h-5.288c-1.298 0-2.356 1.056-2.356 2.356v4.288c0 1.298 1.056 2.356 2.356 2.356h5.289c1.298 0 2.356-1.056 2.356-2.356v-4.289c-0.002-1.298-1.058-2.355-2.358-2.355zM15 13.644c0 0.747-0.608 1.356-1.356 1.356h-5.288c-0.747 0-1.356-0.608-1.356-1.356v-4.289c0-0.747 0.608-1.356 1.356-1.356h5.289c0.747 0 1.356 0.608 1.356 1.356v4.289h-0.002z"></path>
+<path fill="#333" d="M4.453 13h-2.434c-0.561 0-1.019-0.456-1.019-1.019v-9.963c0-0.561 0.456-1.019 1.019-1.019h8.962c0.561 0 1.019 0.456 1.019 1.019v3.497c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-3.497c0-1.112-0.906-2.019-2.019-2.019h-8.963c-1.112 0-2.019 0.905-2.019 2.019v9.962c0 1.113 0.906 2.019 2.019 2.019h2.434c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+<path fill="#333" d="M10.5 3h-8c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h8c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM5.5 6h-3c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h3c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM4.5 9h-2c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h2c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+</svg>
+<svg id="icon-paste-text" width="16" height="16" viewBox="0 0 16 16" x="0" y="210">
+<path fill="#333" d="M10.5 2h-2v-1c0-0.551-0.45-1-1-1h-2c-0.549 0-1 0.45-1 1v1h-2v2.278h7.999v-2.278zM7.5 2h-2v-0.998c0.001 0 0.001-0.001 0.002-0.001h1.996c0.001 0 0.001 0.001 0.002 0.001l-0.001 0.998zM8.17 9.529h1.972v3.834h1.005v-3.834h1.967v-1.005h-4.943z"></path>
+<path fill="#333" d="M12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.816h-0.012v1.928h-8.992v-1.743h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.651c0 0.275 0.225 0.5 0.5 0.5h4.772v1.347l9.727 0.001v-10.118h-3zM6.773 14.999v-8.118h7.726l0.003 8.117-7.729 0.001z"></path>
+</svg>
+<svg id="icon-paste-word" width="16" height="16" viewBox="0 0 16 16" x="0" y="231">
+<path fill="#333" d="M13.628 8.819v0.146c-0.195 0.017-0.34 0.154-0.437 0.413l-1.238 3.691h-0.17l-1.044-2.865h-0.024l-1.141 2.865h-0.17l-1.311-3.691c-0.081-0.259-0.227-0.396-0.437-0.413v-0.146h1.821v0.146c-0.275 0.017-0.405 0.105-0.389 0.267 0 0.081 0.016 0.154 0.049 0.219l0.59 1.788 0.718-1.799-0.046-0.257c-0.097-0.13-0.251-0.202-0.461-0.219v-0.146h1.942v0.146c-0.032 0.017-0.057 0.024-0.073 0.024-0.276 0-0.397 0.073-0.364 0.219 0 0.033 0.008 0.105 0.025 0.219 0.016 0.065 0.032 0.105 0.048 0.121l0.572 1.679 0.534-1.806c0.016-0.032 0.084-0.421-0.062-0.432-0.017-0.001-0.033-0.008-0.049-0.024v-0.146h1.117zM10.5 2h-2v-1c0-0.55-0.45-1-1-1h-2c-0.55 0-1 0.45-1 1v1h-2v2.278h8v-2.278zM7.5 2h-2v-0.998l0.002-0.002h1.997c0 0.001 0.002 0.001 0.002 0.002l-0 0.998zM12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.815h-0.011v1.928h-8.992v-1.744h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.652c0 0.275 0.225 0.5 0.5 0.5h4.773v1.348l9.727 0.001v-10.118h-3zM6.773 14.999v-8.117h7.727l0.003 8.117h-7.729z"></path>
+</svg>
+<svg id="icon-left-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="252">
+<path fill="#333" d="M1.148 0h13.704c0.624 0 1.123 0.499 1.123 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.679c-0.649-0.025-1.148-0.524-1.148-1.148 0-0.649 0.499-1.148 1.148-1.148zM1.148 4.568h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 9.136h13.704c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.704c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 13.704h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.649-0.025-1.148-0.524-1.148-1.173 0-0.624 0.499-1.123 1.148-1.123z"></path>
+</svg>
+<svg id="icon-center-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="273">
+<path fill="#333" d="M1.953 3.11q-0.407 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.281h11.719q0.406 0 0.688 0.281t0.281 0.688-0.281 0.696-0.688 0.289h-11.719zM11.719 5.063q0.406 0 0.688 0.282t0.281 0.688-0.281 0.696-0.688 0.289h-7.813q-0.406 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.282h7.813zM13.672 8.953q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-11.719q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h11.719zM11.719 12.86q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-7.813q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h7.813z"></path>
+</svg>
+<svg id="icon-right-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="294">
+<path fill="#333" d="M3.497 10.966c-0.249-0.002-0.529-0.062-0.737-0.19-0.382-0.234-0.488-0.667-0.349-1.095 0.142-0.437 0.484-0.671 1.071-0.672 3.574-0.006 7.149-0.006 10.723 0.005 0.236 0.001 0.5 0.070 0.701 0.19 0.374 0.222 0.5 0.672 0.371 1.090-0.132 0.428-0.468 0.674-0.974 0.676-1.822 0.006-3.643 0.002-5.465 0.002-1.78 0-3.561 0.008-5.341-0.008zM14.228 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.795-0 3.589-0.002 5.383 0.001zM9.344 6.983c-1.63 0-3.26 0.004-4.89-0.002-0.662-0.002-1.097-0.402-1.095-0.98 0.001-0.58 0.436-0.993 1.093-0.994 3.26-0.006 6.52-0.008 9.78 0.007 0.245 0.001 0.521 0.098 0.727 0.235 0.35 0.232 0.448 0.677 0.309 1.074-0.144 0.412-0.47 0.654-0.951 0.656-1.658 0.007-3.315 0.003-4.973 0.003v0.002zM14.279 13.022c0.627 0.003 1.053 0.418 1.049 0.983-0.004 0.563-0.437 0.98-1.058 0.981-3.287 0.005-5.935 0.007-9.222-0.008-0.231-0.001-0.492-0.098-0.685-0.23-0.343-0.234-0.441-0.681-0.305-1.078 0.137-0.4 0.477-0.646 0.958-0.648 1.657-0.007 2.675-0.003 4.332-0.003 1.644-0 3.287-0.006 4.931 0.002z"></path>
+</svg>
+<svg id="icon-both-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="315">
+<path fill="#333" d="M14.148 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 13.040c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 8.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.002 7.105-0.002 1.794-0 3.589-0.002 5.383 0.001zM14.148 4.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001z"></path>
+</svg>
+<svg id="icon-ol" width="16" height="16" viewBox="0 0 16 16" x="0" y="336">
+<path fill="#333" d="M7.111 1.778h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889z"></path>
+<path fill="#333" d="M15.111 4.711h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M15.111 9.511h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M15.111 14.222h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M2.578 0.533h-0.8l-1.689 0.889 0.267 0.889 1.244-0.711v3.733h-1.333v0.889h3.556v-0.889h-1.244z"></path>
+<path fill="#333" d="M2.222 13.956c0.178-0.178 0.444-0.444 0.622-0.622s0.356-0.356 0.444-0.533c0.089-0.178 0.178-0.356 0.267-0.533s0.089-0.356 0.089-0.622c0-0.267-0.089-0.622-0.178-0.8-0.089-0.267-0.267-0.356-0.356-0.533s-0.444-0.267-0.622-0.356c-0.178-0.089-0.444-0.089-0.711-0.089-0.356 0-0.711 0.089-0.978 0.178-0.267 0.178-0.622 0.356-0.8 0.622l0.444 0.622c0.178-0.178 0.356-0.267 0.533-0.444s0.444-0.178 0.622-0.178c0.178 0 0.356 0 0.444 0s0.267 0.089 0.267 0.267 0.178 0.178 0.178 0.356 0.089 0.267 0.089 0.356c0 0.178 0 0.267 0 0.444s-0.089 0.267-0.178 0.356-0.178 0.267-0.356 0.444-0.356 0.444-0.533 0.711l-1.511 1.244v0.889h3.733v-0.889h-2.4l0.889-0.889z"></path>
+</svg>
+<svg id="icon-ul" width="16" height="16" viewBox="0 0 16 16" x="0" y="357">
+<path fill="#333" d="M15.111 13.333h-8.889c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M6.222 2.667h8.889c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889z"></path>
+<path fill="#333" d="M15.111 7.111h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#333" d="M0 1.778c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#333" d="M0 8c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#333" d="M0 14.222c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+</svg>
+<svg id="icon-right-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="378">
+<path fill="#333" d="M0 1.882h17.488v-1.882h-17.488zM7.511 5.412h9.977v-1.883h-9.977zM7.511 8.941h9.977v-1.883h-9.977zM7.511 12.471h9.977v-1.883h-9.977zM0 16h17.488v-1.882h-17.488zM0 11.572v-6.627l4.418 3.314z"></path>
+</svg>
+<svg id="icon-left-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="399">
+<path fill="#333" d="M0 1.883h17.488v-1.883h-17.488v1.883zM7.511 5.412h9.977v-1.883h-9.977v1.883zM7.511 8.941h9.977v-1.883h-9.977v1.883zM7.511 12.471h9.977v-1.883h-9.977v1.883zM0 16h17.488v-1.883h-17.488v1.883zM4.418 11.572v-6.627l-4.418 3.314 4.418 3.313z"></path>
+</svg>
+<svg id="icon-down-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="420">
+<path fill="#333" d="M13.331 13.511v1.089h2.669v1.4h-4.001v-3.189l2.664-1.309v-1.089h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-up-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="441">
+<path fill="#333" d="M13.331 4.492v1.095h2.669v1.394h-4.001v-3.183l2.664-1.309v-1.095h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-clear-format" width="16" height="16" viewBox="0 0 16 16" x="0" y="462">
+<path fill="#333" d="M11.163 3.197l3.005-1.734 1.43 1.763-2.248 2.491zM8.877 2.251c0.879 0.108 5.156 5.318 5.046 5.904s-2.497 2.206-2.497 2.206l-5.417-6.229c-0 0 1.989-1.988 2.868-1.88zM5.491 4.897l5.23 6.088-3.209 4.173-7.247-9.178s1.436-0.060 2.633-0.374c0.783-0.206 2.593-0.709 2.593-0.709z"></path>
+</svg>
+<svg id="icon-selectall" width="16" height="16" viewBox="0 0 16 16" x="0" y="483">
+<path fill="#333" d="M7.272 8.96c-0.216 0-0.416-0.080-0.568-0.232l-3.136-3.144c-0.112-0.112-0.176-0.264-0.176-0.416 0-0.16 0.064-0.304 0.176-0.416s0.264-0.176 0.416-0.176c0.16 0 0.304 0.064 0.416 0.176l2.872 2.872 6.104-6.104c0.112-0.112 0.264-0.176 0.416-0.176 0.16 0 0.304 0.064 0.416 0.176 0.232 0.232 0.232 0.608 0 0.84l-6.368 6.368c-0.152 0.152-0.352 0.232-0.568 0.232z"></path>
+<path fill="#333" d="M2 12.76c-0.256 0-0.496-0.104-0.68-0.28-0.184-0.184-0.28-0.424-0.28-0.68v-9.776c0-0.256 0.104-0.496 0.28-0.68 0.184-0.184 0.424-0.28 0.68-0.28h6.776c0.328 0 0.592 0.264 0.592 0.592s-0.264 0.592-0.592 0.592h-6.552v9.328h8.92v-4.304c0-0.328 0.272-0.6 0.6-0.6s0.6 0.272 0.6 0.6v4.528c0 0.256-0.104 0.496-0.28 0.68-0.184 0.184-0.424 0.28-0.68 0.28h-9.384z"></path>
+<path fill="#333" d="M5 15.016c-0.328 0-0.592-0.264-0.592-0.592s0.264-0.592 0.592-0.592l8.808-0.008v-7.68c0-0.328 0.264-0.592 0.592-0.592 0.16 0 0.312 0.064 0.424 0.176s0.176 0.264 0.176 0.424l-0.008 8.008c0 0.472-0.384 0.848-0.856 0.848l-9.136 0.008z"></path>
+</svg>
+<svg id="icon-paiban" width="16" height="16" viewBox="0 0 16 16" x="0" y="504">
+<path fill="#333" d="M15.176 12.792l-5.48-4.8c-0.304-0.264-0.76-0.232-1.024 0.072l-1.552 1.776c-0.264 0.304-0.232 0.76 0.064 1.024l2.16 1.888 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.776 0.68 0.36-0.416 0.424-0.48c0.088-0.104 0.24-0.112 0.344-0.024l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.424 0.48-0.36 0.416 0.776 0.68 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.616 0.544c0.304 0.264 0.76 0.232 1.024-0.072l1.56-1.776c0.264-0.32 0.232-0.776-0.072-1.040zM9.76 9.944c-0.176 0.2-0.488 0.208-0.704 0.024s-0.248-0.496-0.072-0.696c0.176-0.2 0.488-0.208 0.704-0.024s0.248 0.496 0.072 0.696z"></path>
+<path fill="#333" d="M5.784 10.824h-2.928c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.552 0.552-0.552h3.096l0.944-1.112h-4.040c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.56 0.552-0.56h4.984l0.472-0.56c0.344-0.4 0.952-0.456 1.352-0.112l2.632 2.232v-6.016l-0.072-0.072v-0.008l-2.88-2.88h-7.784c-0.816 0-1.48 0.664-1.48 1.48v10.744c0 0.816 0.664 1.48 1.48 1.48h7.6l-3.144-2.664c-0.096-0.080-0.176-0.184-0.232-0.296zM2.856 3.040h3.704c0.304 0 0.552 0.248 0.552 0.552s-0.248 0.552-0.552 0.552h-3.704c-0.304 0-0.552-0.248-0.552-0.552 0-0.296 0.248-0.552 0.552-0.552zM2.856 5.264h6.664c0.304 0 0.552 0.248 0.552 0.56 0 0.304-0.248 0.552-0.552 0.552h-6.664c-0.304 0-0.552-0.248-0.552-0.552 0-0.312 0.248-0.56 0.552-0.56z"></path>
+</svg>
+<svg id="icon-full-screen" width="16" height="16" viewBox="0 0 16 16" x="0" y="525">
+<path fill="#333" d="M14.872 1.258c-0.094-0.094-0.219-0.145-0.352-0.145h-0.002l-4.502 0.017c-0.275 0.002-0.497 0.223-0.497 0.5 0.002 0.273 0.223 0.497 0.498 0.497h0.002l3.175-0.013-3.423 3.45c-0.194 0.194-0.192 0.511 0.003 0.705 0.097 0.097 0.223 0.145 0.35 0.145 0.128 0 0.256-0.050 0.353-0.148l3.545-3.572v3.22c0 0.275 0.222 0.498 0.498 0.498 0.275 0 0.498-0.222 0.498-0.498v-4.303c-0.002-0.133-0.055-0.259-0.148-0.353zM1.239 1.238c0.094-0.094 0.219-0.145 0.352-0.145h0.002l4.502 0.019c0.275 0.002 0.497 0.225 0.497 0.5-0.002 0.273-0.223 0.497-0.498 0.497h-0.002l-3.177-0.014 3.425 3.45c0.194 0.194 0.192 0.511-0.003 0.705-0.097 0.097-0.223 0.145-0.35 0.145-0.128 0-0.256-0.050-0.353-0.148l-3.545-3.572v3.22c0 0.275-0.222 0.498-0.498 0.498s-0.498-0.222-0.498-0.498v-4.303c0.002-0.131 0.055-0.259 0.148-0.353zM14.872 14.881c-0.094 0.094-0.219 0.145-0.352 0.145h-0.002l-4.502-0.017c-0.275-0.002-0.497-0.225-0.497-0.5 0.002-0.273 0.223-0.497 0.498-0.497h0.002l3.175 0.012-3.423-3.448c-0.194-0.194-0.192-0.511 0.003-0.705 0.097-0.097 0.223-0.145 0.35-0.145 0.128 0 0.256 0.050 0.353 0.148l3.545 3.57v-3.22c0-0.275 0.222-0.498 0.498-0.498 0.275 0 0.498 0.222 0.498 0.498v4.303c-0.002 0.133-0.055 0.259-0.148 0.353zM1.223 14.886c0.094 0.094 0.219 0.145 0.352 0.145h0.002l4.502-0.017c0.275-0.002 0.497-0.225 0.497-0.5-0.002-0.273-0.223-0.497-0.498-0.497h-0.002l-3.175 0.012 3.425-3.45c0.194-0.194 0.192-0.511-0.003-0.705-0.097-0.097-0.223-0.145-0.35-0.145-0.128 0-0.256 0.050-0.353 0.148l-3.547 3.572v-3.22c0-0.275-0.222-0.498-0.498-0.498s-0.498 0.222-0.498 0.498v4.303c0.002 0.133 0.055 0.259 0.148 0.353z"></path>
+</svg>
+<svg id="icon-title" width="16" height="16" viewBox="0 0 16 16" x="0" y="546">
+<path fill="#333" d="M1.815 2.089v4.803h1.332v-4.803h1.815v-1.089h-4.962v1.089h1.815zM6.443 1.966v-0.966h-1.205v0.966h1.205zM5.239 2.626v4.267h1.205v-4.267h-1.205zM8.594 2.626v-1.279h-1.205v1.279h-0.73v0.784h0.73v2.517c0 0.215 0.037 0.388 0.11 0.52s0.174 0.234 0.301 0.305c0.127 0.072 0.274 0.12 0.441 0.144s0.344 0.037 0.53 0.037c0.119 0 0.24-0.003 0.365-0.008s0.238-0.016 0.339-0.033v-0.908c-0.057 0.011-0.116 0.019-0.178 0.025s-0.127 0.008-0.195 0.008c-0.204 0-0.339-0.033-0.407-0.099s-0.102-0.198-0.102-0.396v-2.113h0.882v-0.784h-0.882zM9.761 1v5.893h1.205v-5.893h-1.205zM14.541 4.301h-1.96c0.006-0.083 0.024-0.176 0.055-0.281s0.085-0.204 0.161-0.297c0.076-0.094 0.178-0.172 0.305-0.235s0.287-0.095 0.479-0.095c0.294 0 0.513 0.077 0.657 0.231s0.245 0.38 0.301 0.677v0zM12.581 5.044h3.164c0.023-0.33-0.006-0.646-0.085-0.949s-0.208-0.572-0.386-0.809c-0.178-0.237-0.406-0.425-0.683-0.565s-0.602-0.21-0.976-0.21c-0.334 0-0.638 0.058-0.912 0.173s-0.51 0.274-0.708 0.475c-0.198 0.201-0.351 0.439-0.458 0.714s-0.161 0.572-0.161 0.891c0 0.33 0.052 0.633 0.157 0.908s0.253 0.512 0.445 0.71c0.192 0.198 0.427 0.351 0.704 0.458s0.588 0.161 0.933 0.161c0.498 0 0.922-0.11 1.272-0.33s0.611-0.586 0.78-1.098h-1.060c-0.040 0.132-0.147 0.257-0.322 0.376s-0.385 0.177-0.628 0.177c-0.339 0-0.599-0.085-0.78-0.256s-0.28-0.446-0.297-0.825zM0 9h16v1h-16v-1zM0 12h16v1h-16v-1zM0 15h12v1h-12v-1z"></path>
+</svg>
+<svg id="icon-font" width="16" height="16" viewBox="0 0 16 16" x="0" y="567">
+<path fill="#333" d="M0.32 1.436v3.661h0.448c0.149-0.971 0.523-1.793 1.195-2.316 0.374-0.374 1.046-0.598 2.017-0.598h1.046v10.386c0 0.672-0.075 1.121-0.149 1.27-0.075 0.224-0.224 0.374-0.448 0.448-0.224 0.149-0.598 0.224-0.971 0.224h-0.448v0.374h7.472v-0.374h-0.448c-0.448 0-0.747-0.075-0.971-0.224s-0.374-0.299-0.448-0.448-0.149-0.598-0.149-1.27v-10.386h1.046c0.672 0 1.121 0.075 1.42 0.149 0.448 0.224 0.822 0.523 1.121 0.897s0.523 0.971 0.747 1.793h0.374v-3.586h-12.851z"></path>
+<path fill="#333" d="M8.533 6.286v2.341h0.254c0.085-0.621 0.296-1.146 0.676-1.481 0.211-0.239 0.592-0.382 1.141-0.382h0.592v6.64c0 0.43-0.042 0.716-0.085 0.812-0.042 0.143-0.127 0.239-0.254 0.287-0.127 0.095-0.338 0.143-0.549 0.143h-0.254v0.239h4.225v-0.239h-0.253c-0.254 0-0.423-0.048-0.549-0.143s-0.211-0.191-0.254-0.287c-0.042-0.095-0.084-0.382-0.084-0.812v-6.64h0.592c0.38 0 0.634 0.048 0.803 0.096 0.255 0.145 0.467 0.338 0.63 0.567l0.004 0.006c0.169 0.239 0.296 0.621 0.423 1.146h0.211v-2.293h-7.268z"></path>
+</svg>
+<svg id="icon-fontsize" width="16" height="16" viewBox="0 0 16 16" x="0" y="588">
+<path fill="#333" d="M10.75 12.432l2.663 3.141 2.674-3.141z"></path>
+<path fill="#333" d="M2.979 7.234l1.53-4.933 1.534 4.933h-3.064zM5.888 0.408h-2.332l-3.489 11.051h1.617l0.825-2.63h4.042l0.839 2.63h2.025l-3.527-11.051z"></path>
+<path fill="#333" d="M9.553 8.899l0.888-2.357 0.888 2.357h-1.776zM11.238 5.444h-1.351l-1.085 2.927 0.47 1.475 0.007-0.021h2.342l0.487 1.522h1.171l-2.041-5.903z"></path>
+</svg>
+<svg id="icon-fontcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="609">
+<path fill="#333" d="M1.051 12.486v2.105h9.121l2.105-2.105h-11.226zM11.575 14.591h3.508v-3.508l-3.508 3.508z"></path>
+<path fill="#333" d="M12.338 12.135h-1.766l-1.437-3.369h-4.42l-1.423 3.369h-1.802l4.631-10.705h1.66l4.558 10.705zM8.565 7.275l-1.625-3.615-1.639 3.615h3.264z"></path>
+</svg>
+<svg id="icon-font-bgcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="630">
+<path fill="#333" d="M4.068 9.652c-0.151 0.146-0.226 0.351-0.226 0.614 0 0.231 0.082 0.42 0.246 0.566s0.38 0.219 0.649 0.219c0.374 0 0.683-0.132 0.926-0.395s0.364-0.594 0.364-0.991v-0.465l-1.136 0.154c-0.398 0.053-0.672 0.152-0.823 0.298zM12.953 1.452h-9.984c-1.103 0-1.997 0.894-1.997 1.997v8.985c0 1.103 0.894 1.997 1.997 1.997h9.984c1.103 0 1.997-0.894 1.997-1.997v-8.985c0-1.103-0.894-1.997-1.997-1.997zM6.879 11.635h-0.851v-0.75h-0.022c-0.336 0.576-0.832 0.864-1.487 0.864-0.471 0-0.845-0.127-1.123-0.382s-0.417-0.598-0.417-1.031c0-0.907 0.537-1.435 1.61-1.584l1.439-0.202c0-0.793-0.328-1.189-0.983-1.189-0.582 0-1.113 0.196-1.593 0.588v-0.829c0.483-0.301 1.040-0.452 1.672-0.452 1.17 0 1.755 0.614 1.755 1.843v3.124zM12.26 11.023c-0.402 0.484-0.938 0.726-1.608 0.726-0.632 0-1.113-0.266-1.443-0.799h-0.018v0.684h-0.86v-7.182h0.86v3.168h0.018c0.38-0.635 0.936-0.952 1.667-0.952 0.608 0 1.092 0.214 1.45 0.643s0.538 1.014 0.538 1.757c0 0.819-0.201 1.47-0.603 1.955zM10.638 7.38c-0.421 0-0.769 0.151-1.042 0.452s-0.41 0.684-0.41 1.15v0.658c0 0.392 0.127 0.723 0.382 0.994s0.573 0.406 0.956 0.406c0.456 0 0.813-0.175 1.071-0.526s0.386-0.836 0.386-1.457c0-0.512-0.12-0.919-0.36-1.222s-0.567-0.454-0.983-0.454z"></path>
+</svg>
+<svg id="icon-b" width="16" height="16" viewBox="0 0 16 16" x="0" y="651">
+<path fill="#333" d="M12.615 5.846c0-1.846-1.477-3.385-3.231-3.385h-5.077c-0.338 0-0.615 0.277-0.615 0.615v10.154c0 0.338 0.277 0.615 0.615 0.615h5.077c1.754 0 3.231-1.538 3.231-3.385 0-0.892-0.338-1.692-0.892-2.308 0.554-0.615 0.892-1.415 0.892-2.308zM9.385 11.692h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231zM9.385 7.077h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231z"></path>
+</svg>
+<svg id="icon-italic" width="16" height="16" viewBox="0 0 16 16" x="0" y="672">
+<path fill="#333" d="M11.692 3.785v-0.4c0-0.338-0.277-0.615-0.615-0.615h-4.308c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615 0.523 0 0.923 0.492 0.8 0.985l-1.108 5.415c-0.092 0.4-0.431 0.677-0.8 0.677h-0.738c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615h4.308c0.338 0 0.615-0.277 0.615-0.615v-0.615c0-0.338-0.277-0.615-0.615-0.615-0.523 0-0.923-0.492-0.8-0.985l1.108-5.415c0.092-0.4 0.431-0.677 0.8-0.677h0.523c0.462 0 0.831-0.369 0.831-0.831z"></path>
+</svg>
+<svg id="icon-underline" width="16" height="16" viewBox="0 0 16 16" x="0" y="693">
+<path fill="#333" d="M13.692 12.923h-11.385c-0.246 0-0.462 0.215-0.462 0.462v0.923c0 0.246 0.215 0.462 0.462 0.462h11.385c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462zM7.785 11.692c-2.308-0.123-4.092-2.123-4.092-4.431v-4.185c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.215c0 1.323 0.985 2.462 2.308 2.554 1.446 0.092 2.615-1.046 2.615-2.462v-4.308c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.308c0 2.462-2.062 4.431-4.523 4.308z"></path>
+</svg>
+<svg id="icon-strickout" width="16" height="16" viewBox="0 0 16 16" x="0" y="714">
+<path fill="#333" d="M3.723 5.569c-0.062-0.308-0.092-0.677-0.092-1.046 0-0.4 0.092-0.862 0.277-1.292 0.185-0.462 0.462-0.892 0.862-1.262 0.369-0.369 0.892-0.708 1.477-0.954 0.615-0.246 1.323-0.4 2.185-0.4 0.769 0 1.508 0.092 2.215 0.308 0.554 0.185 1.077 0.492 1.538 0.923 0.185 0.185 0.185 0.492-0.031 0.677l-0.831 0.769c-0.185 0.154-0.462 0.185-0.646 0-0.215-0.215-0.462-0.4-0.738-0.554-0.431-0.215-0.923-0.338-1.508-0.338-0.523 0-0.985 0.062-1.323 0.215s-0.646 0.308-0.862 0.554-0.369 0.462-0.462 0.708-0.123 0.492-0.123 0.677c0 0.338 0.062 0.615 0.154 0.862 0.092 0.215-0.062 0.431-0.277 0.431h-1.508c-0.154 0-0.277-0.154-0.308-0.277zM12.277 10.154h-1.538c-0.215 0-0.369 0.215-0.277 0.4s0.123 0.431 0.123 0.677c0 0.369-0.092 0.708-0.246 1.015-0.185 0.308-0.4 0.523-0.677 0.738-0.277 0.185-0.585 0.338-0.923 0.431s-0.646 0.154-0.985 0.154c-0.585 0-1.138-0.123-1.662-0.369-0.4-0.185-0.738-0.431-1.046-0.769-0.154-0.185-0.462-0.215-0.646-0.062l-0.862 0.738c-0.185 0.154-0.215 0.462-0.031 0.646 0.431 0.492 0.985 0.862 1.631 1.108 0.8 0.308 1.662 0.462 2.585 0.462 0.677 0 1.323-0.092 1.908-0.308 0.585-0.185 1.108-0.492 1.569-0.862 0.431-0.369 0.8-0.831 1.046-1.385s0.4-1.138 0.4-1.815c0-0.246 0-0.4-0.031-0.615-0.062-0.062-0.185-0.185-0.338-0.185zM15.354 7.354c-0.062-0.185-0.246-0.277-0.431-0.277h-13.846c-0.215 0-0.369 0.092-0.431 0.277-0.031 0.062-0.031 0.092-0.031 0.154v0.923c0 0.246 0.215 0.492 0.462 0.492h13.846c0.246 0 0.462-0.246 0.462-0.492v-0.923c0-0.062 0-0.092-0.031-0.154z"></path>
+</svg>
+<svg id="icon-line-height" width="16" height="16" viewBox="0 0 16 16" x="0" y="735">
+<path fill="#333" d="M2.499 11.902v-7.682c-0.166 0-0.326 0.009-0.485-0.002-0.265-0.019-0.339-0.2-0.178-0.467 0.254-0.423 0.52-0.837 0.79-1.245 0.145-0.219 0.377-0.212 0.522 0.009 0.262 0.398 0.521 0.801 0.767 1.214 0.055 0.093 0.087 0.254 0.063 0.359-0.016 0.067-0.153 0.115-0.239 0.126-0.153 0.020-0.308 0.006-0.469 0.006v7.672c0.15 0 0.298-0.017 0.444 0.006 0.097 0.015 0.246 0.062 0.266 0.138 0.027 0.104-0.021 0.274-0.080 0.375-0.236 0.397-0.486 0.781-0.737 1.164-0.17 0.26-0.396 0.258-0.566-0.005-0.25-0.384-0.492-0.775-0.737-1.163-0.022-0.035-0.044-0.075-0.061-0.118l-0.002-0.005c-0.088-0.217-0.034-0.357 0.161-0.375 0.176-0.016 0.353-0.003 0.543-0.003z"></path>
+<path fill="#333" d="M14.841 0v1.166h-13.69v-1.166zM14.849 14.834v1.166h-13.69v-1.166zM10.056 2.956l4.172 10.602h-1.321l-1.129-2.97h-4.871l-1.128 2.97h-1.307l4.173-10.602zM11.392 9.563l-2.004-5.3h-0.059l-2.034 5.3z"></path>
+</svg>
+<svg id="icon-clear-html" width="16" height="16" viewBox="0 0 16 16" x="0" y="756">
+<path fill="#333" d="M10.175 3.11c-0.106-0.106-0.279-0.106-0.385 0l-8.625 8.625c-0.106 0.106-0.106 0.279 0 0.385l1.678 1.678c0.106 0.106 0.315 0.192 0.464 0.192h5.374c0.15 0 0.358-0.087 0.464-0.192l5.666-5.666c0.106-0.106 0.106-0.279 0-0.385l-4.636-4.636zM8.612 12.774c-0.106 0.106-0.315 0.192-0.464 0.192h-4.161c-0.15 0-0.358-0.087-0.464-0.192l-0.791-0.791c-0.106-0.106-0.106-0.279 0-0.385l3.162-3.162c0.106-0.106 0.279-0.106 0.385 0l3.143 3.143c0.106 0.106 0.106 0.279 0 0.385l-0.81 0.81z"></path>
+</svg>
+<svg id="icon-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="777">
+<path fill="#333" d="M15.385 3.077c0-0.677-0.554-1.231-1.231-1.231h-12.308c-0.677 0-1.231 0.554-1.231 1.231v9.846c0 0.677 0.554 1.231 1.231 1.231h12.308c0.677 0 1.231-0.554 1.231-1.231v-9.846zM12.185 11.692h-8.923c-0.369 0-0.585-0.4-0.4-0.708l2.708-4.708c0.123-0.215 0.4-0.215 0.523 0l1.631 2.8c0.123 0.185 0.4 0.215 0.523 0.031l1.323-1.908c0.123-0.185 0.4-0.185 0.523 0l2.431 3.877c0.185 0.277 0 0.615-0.338 0.615zM11.385 6.154c-0.677 0-1.231-0.554-1.231-1.231s0.554-1.231 1.231-1.231 1.231 0.554 1.231 1.231-0.554 1.231-1.231 1.231z"></path>
+</svg>
+<svg id="icon-multiple-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="798">
+<path fill="#333" d="M13 1v12.033h-12v-12.033h12zM13 0h-12c-0.567 0-1 0.433-1 1v12.033c0 0.567 0.433 1 1 1h12.033c0.567 0 1-0.433 1-1v-12.033c-0.033-0.567-0.467-1-1.033-1z"></path>
+<path fill="#333" d="M13 12.267c0.567-0.6 0.8-2.3 0.8-3.1 0-2.033-1.6-3.7-3.633-3.7-1.433 0-2.633 0.8-3.233 1.967-0.667 1.033-1.8 1.7-3.1 1.7-1.367 0-2.533-0.733-3.2-1.833-0.333 0.567-0.5 1.2-0.5 1.867 0 0.733 0.2 2.333 0.567 2.9v1.133h1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h2.1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h0.7v-0.933z"></path>
+<path fill="#333" d="M2.767 4.233c0 0 0 0 0 0 0 0.7 0.567 1.267 1.267 1.267s1.267-0.567 1.267-1.267c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.7-0.567-1.267-1.267-1.267s-1.267 0.567-1.267 1.267c0 0 0 0 0 0v0z"></path>
+<path fill="#333" d="M15.633 16h-9c-0.267 0-0.5-0.233-0.5-0.5s0.233-0.5 0.5-0.5h8.5v-8.5c0-0.267 0.233-0.5 0.5-0.5s0.5 0.233 0.5 0.5v9c0 0.267-0.233 0.5-0.5 0.5z"></path>
+</svg>
+<svg id="icon-graft" width="17" height="16" viewBox="0 0 17 16" x="0" y="819">
+<path fill="#333" d="M16.407 3.584c0.106-0.333 0.388-1.214-0.194-1.628-0.171-0.118-0.382-0.188-0.61-0.188-0.013 0-0.026 0-0.039 0.001l0.002-0c-0.449 0-1.133 0.267-1.914 0.713-0.030-0.060-0.067-0.112-0.111-0.157l0 0c-1.435-1.432-3.417-2.318-5.605-2.318-4.379 0-7.93 3.548-7.935 7.926v0c-0 0.009-0 0.020-0 0.031 0 2.264 0.957 4.305 2.489 5.739l0.004 0.004c0.107 0.101 0.251 0.163 0.41 0.163 0.001 0 0.001 0 0.002 0h0.044c-0.291 0.29-0.604 0.557-0.938 0.8l-0.023 0.016c-0.155 0.11-0.255 0.289-0.255 0.491 0 0.279 0.19 0.513 0.448 0.581l0.004 0.001c0.631 0.152 1.356 0.239 2.102 0.239 0.004 0 0.008 0 0.011 0h-0.001c1.236 0 2.256-0.259 3.042-0.777v0.047c0 0.332 0.269 0.601 0.601 0.601v0c4.38-0.005 7.929-3.555 7.935-7.934v-0c0-0.008 0.001-0.018 0.001-0.028 0-0.332-0.269-0.601-0.601-0.601s-0.601 0.269-0.601 0.601c0 0.010 0 0.020 0.001 0.029l-0-0.001c-0.005 3.687-2.969 6.679-6.644 6.731l-0.005 0c0.617-0.614 0.933-1.306 0.906-1.993-0.017-0.336-0.114-0.646-0.272-0.916l0.005 0.009c0.166 0.056 0.358 0.088 0.557 0.088 0.004 0 0.007-0 0.011-0h-0.001c2.749-0.001 6.495-6.143 7.175-8.27zM4.521 13.81c0.268-0.47 1.21-1.992 2.168-1.992 0.209 0.006 0.402 0.071 0.563 0.18l-0.004-0.002c0.265 0.15 0.447 0.419 0.476 0.732l0 0.004c0.021 0.427-0.3 0.928-0.881 1.375s-1.457 0.695-2.549 0.695c-0.181 0-0.369-0.006-0.56-0.021 0.298-0.283 0.558-0.602 0.774-0.952l0.012-0.020zM8.754 9.025c1.072-2.589 5.206-5.632 6.574-6.016-0.129 0.493-0.567 1.583-1.553 3.158-1.643 2.599-3.549 4.486-4.55 4.486-0.003 0-0.007 0-0.010 0-0.167 0-0.317-0.071-0.422-0.185l-0-0c-0.299-0.299-0.312-0.786-0.039-1.443zM1.2 7.933c0-0.002 0-0.004 0-0.006 0-3.717 3.014-6.731 6.731-6.731 1.835 0 3.499 0.734 4.713 1.925l-0.001-0.001c-1.977 1.364-4.207 3.536-4.998 5.444-0.422 1.019-0.327 1.744-0.071 2.246-0.26-0.121-0.564-0.192-0.885-0.193h-0c-1.486 0-2.63 1.588-3.193 2.559-0.021-0.136-0.086-0.254-0.18-0.343l-0-0c-1.303-1.221-2.115-2.952-2.115-4.874 0-0.009 0-0.019 0-0.028v0.001z"></path>
+<path fill="#333" d="M8.931 4.704c0.858 0 1.553-0.695 1.553-1.553s-0.695-1.553-1.553-1.553c-0.858 0-1.553 0.695-1.553 1.553v0c0 0.858 0.695 1.553 1.553 1.553v0zM8.931 3.504c-0.194 0-0.352-0.158-0.352-0.352s0.158-0.352 0.352-0.352c0.194 0 0.352 0.158 0.352 0.352v0c0 0.194-0.158 0.352-0.352 0.352v0zM5.394 9.012c0-0.858-0.695-1.553-1.553-1.553s-1.553 0.695-1.553 1.553c0 0.858 0.695 1.553 1.553 1.553v0c0.858 0 1.553-0.695 1.553-1.553v0zM3.841 8.659c0.002-0 0.004-0 0.006-0 0.194 0 0.352 0.158 0.352 0.352s-0.158 0.352-0.352 0.352c-0.194 0-0.352-0.158-0.352-0.352v0c0-0 0-0 0-0 0-0.193 0.155-0.349 0.347-0.352h0zM4.977 7.069c1.144 0 2.071-0.927 2.071-2.071s-0.927-2.071-2.071-2.071c-1.144 0-2.071 0.927-2.071 2.071v0c0 1.144 0.927 2.071 2.071 2.071v0zM4.977 4.123c0.482 0 0.872 0.391 0.872 0.872s-0.391 0.872-0.872 0.872c-0.482 0-0.872-0.391-0.872-0.872v0c0.001-0.481 0.391-0.87 0.872-0.871h0z"></path>
+</svg>
+<svg id="icon-flash" width="16" height="16" viewBox="0 0 16 16" x="0" y="840">
+<path fill="#333" d="M8 0.889c-3.911 0-7.111 3.2-7.111 7.111s3.2 7.111 7.111 7.111 7.111-3.2 7.111-7.111-3.2-7.111-7.111-7.111zM11.556 5.956c-1.244-0.089-1.956 1.244-1.956 1.244l1.422 0.089v1.6h-2.044c-1.067 3.911-3.644 3.2-3.644 3.2v-1.333s1.511 0 2.311-2.756c1.156-4.356 3.911-3.467 3.911-3.467v1.422z"></path>
+</svg>
+<svg id="icon-vedio" width="16" height="16" viewBox="0 0 16 16" x="0" y="861">
+<path fill="#333" d="M15.385 0.615h-0.615v1.231h-1.846v-1.231h-9.846v1.231h-1.846v-1.231h-0.615c-0.339 0-0.615 0.276-0.615 0.615v13.538c0 0.339 0.276 0.615 0.615 0.615h0.615v-0.615h1.846v0.615h9.846v-0.615h1.846v0.615h0.615c0.339 0 0.615-0.276 0.615-0.615v-13.538c0-0.339-0.276-0.615-0.615-0.615zM3.077 12.923h-1.846v-1.846h1.846v1.846zM3.077 9.231h-1.846v-1.846h1.846v1.846zM3.077 5.538h-1.846v-1.846h1.846v1.846zM10.823 8.404l-4.002 2.334c-0.065 0.033-0.137 0.048-0.207 0.048-0.085 0-0.167-0.023-0.242-0.067-0.135-0.082-0.218-0.228-0.218-0.385v-4.668c0-0.157 0.082-0.303 0.218-0.385 0.137-0.082 0.307-0.090 0.449-0.018l4.002 2.334c0.156 0.077 0.254 0.233 0.254 0.404s-0.098 0.327-0.254 0.404zM14.769 12.923h-1.846v-1.846h1.846v1.846zM14.769 9.231h-1.846v-1.846h1.846v1.846zM14.769 5.538h-1.846v-1.846h1.846v1.846z"></path>
+</svg>
+<svg id="icon-attach" width="16" height="16" viewBox="0 0 16 16" x="0" y="882">
+<path fill="#333" d="M5.415 11.292c0.185 0.185 0.462 0.154 0.646 0l3.077-3.077c0.215-0.215 0.585-0.246 0.862 0s0.246 0.677 0 0.923l-3.785 3.723c-0.831 0.831-2.215 0.831-3.046 0l-0.031-0.031c-0.831-0.831-0.831-2.215 0-3.046l6.677-6.677c0.831-0.831 2.215-0.831 3.046 0l0.031 0.031c0.831 0.831 0.831 2.215 0 3.046l-0.031 0.031c-0.154 0.154-0.185 0.369-0.062 0.554 0.185 0.338 0.338 0.708 0.431 1.077 0.062 0.246 0.338 0.308 0.523 0.154 0.246-0.246 0.462-0.492 0.462-0.492 1.569-1.569 1.569-4.123 0-5.692h-0.062c-1.569-1.569-4.123-1.569-5.692 0l-6.677 6.646c-1.569 1.569-1.569 4.123 0 5.692l0.062 0.062c1.569 1.569 4.092 1.569 5.662 0l3.815-3.785c0.985-0.985 0.954-2.585-0.062-3.569-0.985-0.954-2.585-0.892-3.538 0.092l-3.015 3.015c-0.185 0.185-0.185 0.492 0 0.677l0.708 0.646z"></path>
+</svg>
+<svg id="icon-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="903">
+<path fill="#333" d="M17.846 0h-17.231c-0.49 0-0.615 0.129-0.615 0.615v14.769c0 0.486 0.125 0.615 0.615 0.615h17.231c0.49 0 0.615-0.129 0.615-0.615v-14.769c0-0.486-0.125-0.615-0.615-0.615zM5.538 14.769l-4.328 0.051v-3.108l4.328-0.020v3.077zM5.538 10.462h-4.308v-3.077h4.308v3.077zM5.538 6.154h-4.308v-2.462h4.308v2.462zM11.692 14.769h-4.923v-3.077h4.923v3.077zM11.692 10.462h-4.923v-3.077h4.923v3.077zM11.692 6.154h-4.923v-2.462h4.923v2.462zM17.231 14.769h-4.308v-3.077h4.308v3.077zM17.231 10.462h-4.308v-3.077h4.308v3.077zM17.231 6.154h-4.308v-2.462h4.308v2.462z"></path>
+</svg>
+<svg id="icon-split" width="16" height="16" viewBox="0 0 16 16" x="0" y="924">
+<path fill="#333" d="M14.222 12.412l-1.811 1.811h-1.022l2.833-2.833v1.022zM14.222 13.742v0.48h-0.48l0.48-0.48zM14.222 10.059l-4.164 4.164h-1.022l4.444-4.444h0.741v0.281zM12.15 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM9.796 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM7.444 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM5.091 9.778l-3.313 3.313v-1.012l2.3-2.3h1.013zM2.748 9.778l-0.97 0.97v-0.97h0.97zM14.222 3.078l-2.255 2.255h-1.022l3.277-3.277v1.022zM14.222 4.409v0.924h-0.924l0.924-0.924zM13.17 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM10.817 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM8.462 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM6.11 1.778l-3.556 3.556h-0.777v-0.244l3.311-3.311h1.022zM3.757 1.778l-1.98 1.98v-1.012l0.967-0.967h1.013zM0 7.111h16v0.889h-16v-0.889z"></path>
+</svg>
+<svg id="icon-face" width="16" height="16" viewBox="0 0 16 16" x="0" y="945">
+<path fill="#333" d="M8 16c-4.417 0-8-3.58-8-7.993s3.583-8.007 8-8.007 8 3.594 8 8.007c0 4.413-3.583 7.993-8 7.993zM8 1c-3.865 0-7 3.145-7 7.006s3.135 6.994 7 6.994 7-3.132 7-6.994c0-3.861-3.135-7.006-7-7.006zM8 13c-2.419 0-4.436-1.718-4.899-4h1.041c0.446 1.722 1.997 3 3.859 3s3.412-1.278 3.858-3h1.041c-0.463 2.282-2.48 4-4.899 4zM11 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1zM5 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1z"></path>
+</svg>
+<svg id="icon-split-page" width="16" height="16" viewBox="0 0 16 16" x="0" y="966">
+<path fill="#333" d="M14.25 1v4h-12.5v-4h1.042v3h10.417v-3zM1.75 15v-4h12.5v4h-1.041v-3h-10.417v3zM1 7h14v2h-14z"></path>
+</svg>
+<svg id="icon-anchor" width="16" height="16" viewBox="0 0 16 16" x="0" y="987">
+<path fill="#333" d="M15.297 9.614l-1.117-1.117c-0.075-0.075-0.174-0.116-0.28-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l0.442-0.442c-0.107 1.281-0.667 2.486-1.579 3.399-0.925 0.925-2.149 1.487-3.45 1.583l-0-7.611 3.106-0c0.218 0 0.396-0.178 0.396-0.396s-0.178-0.396-0.396-0.396h-3.106v-4.407l2.781 2.781c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-3.434-3.434c-0.083-0.083-0.198-0.125-0.316-0.114-0.109-0.003-0.214 0.038-0.291 0.116l-3.434 3.434c-0.154 0.154-0.154 0.406 0 0.56 0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l2.781-2.781v4.405h-3.106c-0.218 0-0.396 0.178-0.396 0.396s0.178 0.396 0.396 0.396l3.106-0v7.613c-1.311-0.091-2.546-0.653-3.478-1.585-0.92-0.92-1.481-2.137-1.582-3.43l0.444 0.444c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-1.117-1.117c-0.075-0.075-0.174-0.116-0.279-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28 0.174 0.116 0.28 0.116c0.106 0 0.205-0.041 0.28-0.116l0.475-0.475c0.047 0.697 0.208 1.376 0.48 2.018 0.316 0.748 0.769 1.42 1.346 1.997s1.249 1.030 1.997 1.346c0.775 0.328 1.598 0.494 2.446 0.494s1.671-0.166 2.446-0.494c0.748-0.316 1.42-0.769 1.997-1.346s1.030-1.249 1.346-1.997c0.275-0.651 0.437-1.338 0.481-2.045l0.474 0.474c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116 0.116-0.174 0.116-0.28c0-0.106-0.041-0.205-0.116-0.28z"></path>
+</svg>
+<svg id="icon-link" width="16" height="16" viewBox="0 0 16 16" x="0" y="1008">
+<path fill="#333" d="M8.369 12.831l-0.646-0.092s-0.431-0.092-0.646-0.185c-0.123-0.031-0.277 0-0.369 0.092l-0.154 0.154c-0.892 0.892-2.338 0.985-3.262 0.185-1.046-0.892-1.077-2.492-0.123-3.446l2.338-2.338c0.308-0.308 0.677-0.492 1.046-0.615 0.492-0.123 1.015-0.092 1.477 0.092 0.277 0.123 0.554 0.277 0.8 0.523 0.123 0.123 0.215 0.246 0.308 0.4 0.123 0.215 0.4 0.246 0.554 0.062l0.862-0.862c0.123-0.123 0.123-0.308 0.031-0.462-0.123-0.185-0.277-0.338-0.431-0.492-0.215-0.215-0.462-0.431-0.738-0.585-0.431-0.277-0.923-0.462-1.446-0.554-0.954-0.185-2-0.031-2.862 0.431-0.338 0.185-0.677 0.431-0.954 0.708l-2.246 2.246c-1.631 1.631-1.754 4.277-0.185 5.938 1.631 1.785 4.4 1.815 6.092 0.123l0.769-0.769c0.215-0.154 0.062-0.523-0.215-0.554zM14.031 1.785c-1.692-1.569-4.338-1.446-5.938 0.185l-0.708 0.677c-0.215 0.215-0.062 0.585 0.215 0.615 0.431 0.031 0.862 0.123 1.292 0.246 0.123 0.031 0.277 0 0.369-0.092l0.154-0.154c0.892-0.892 2.338-0.985 3.262-0.185 1.046 0.892 1.077 2.492 0.123 3.446l-2.338 2.338c-0.308 0.308-0.677 0.492-1.046 0.615-0.492 0.123-1.015 0.092-1.477-0.092-0.277-0.123-0.554-0.277-0.8-0.523-0.123-0.123-0.215-0.246-0.308-0.4-0.123-0.215-0.4-0.246-0.554-0.062l-0.862 0.862c-0.123 0.123-0.123 0.308-0.031 0.462 0.123 0.185 0.277 0.338 0.431 0.492 0.215 0.215 0.492 0.431 0.738 0.585 0.431 0.277 0.923 0.462 1.415 0.554 0.954 0.185 2 0.031 2.862-0.431 0.338-0.185 0.677-0.431 0.954-0.708l2.338-2.338c1.723-1.692 1.662-4.462-0.092-6.092z"></path>
+</svg>
+<svg id="icon-unlink" width="16" height="16" viewBox="0 0 16 16" x="0" y="1029">
+<path fill="#333" d="M7.385 11.262c-0.185 0-0.369-0.031-0.554-0.092-0.185-0.031-0.4-0.092-0.585-0.154-0.123-0.031-0.246 0-0.308 0.062l-0.123 0.123c-0.769 0.769-2.031 0.862-2.862 0.154-0.892-0.8-0.954-2.185-0.092-3.015l2.031-2.031c0.277-0.277 0.585-0.431 0.923-0.523 0.431-0.123 0.892-0.092 1.292 0.092 0.246 0.092 0.492 0.246 0.677 0.462 0.092 0.092 0.185 0.215 0.277 0.369 0.092 0.185 0.338 0.215 0.492 0.062l0.769-0.769c0.123-0.123 0.123-0.277 0.031-0.4-0.123-0.154-0.246-0.277-0.369-0.431-0.185-0.185-0.431-0.369-0.646-0.523-0.4-0.246-0.8-0.4-1.262-0.492-0.831-0.154-1.723-0.031-2.523 0.4-0.308 0.154-0.585 0.369-0.831 0.615l-1.969 1.969c-1.415 1.415-1.538 3.723-0.154 5.2 1.446 1.538 3.877 1.6 5.354 0.092l0.677-0.677c0.154-0.154 0.031-0.462-0.246-0.492zM12.462 6.923c1.477-1.477 1.446-3.908-0.092-5.354-1.477-1.354-3.785-1.262-5.2 0.154l-0.615 0.615c-0.185 0.185-0.062 0.492 0.185 0.523 0.369 0.031 0.769 0.092 1.138 0.215 0.123 0.031 0.246 0 0.308-0.062l0.123-0.123c0.769-0.769 2.031-0.862 2.862-0.154 0.892 0.8 0.954 2.185 0.092 3.015l-2.031 2.031c-0.277 0.277-0.585 0.431-0.923 0.523-0.431 0.123-0.892 0.092-1.292-0.092-0.246-0.092-0.492-0.246-0.677-0.462-0.092-0.092-0.185-0.215-0.246-0.338-0.092-0.185-0.338-0.215-0.492-0.062l-0.738 0.738c-0.123 0.123-0.123 0.277-0.031 0.4 0.123 0.154 0.215 0.277 0.369 0.431 0.215 0.215 0.431 0.369 0.646 0.523 0.4 0.246 0.8 0.4 1.262 0.492 0.831 0.154 1.723 0.031 2.523-0.4 0.308-0.154 0.585-0.369 0.831-0.615l2-2zM13.877 12.615l1.415-1.415c0.123-0.123 0.123-0.308 0-0.431l-0.862-0.862c-0.123-0.123-0.308-0.123-0.431 0l-1.385 1.446-1.323-1.323c-0.123-0.123-0.308-0.123-0.431 0l-0.862 0.862c-0.123 0.123-0.123 0.308 0 0.431l1.323 1.323-1.292 1.292c-0.123 0.123-0.123 0.308 0 0.431l0.862 0.862c0.123 0.123 0.308 0.123 0.431 0l1.292-1.292 1.385 1.385c0.123 0.123 0.308 0.123 0.431 0l0.862-0.862c0.123-0.123 0.123-0.308 0-0.431l-1.415-1.415z"></path>
+</svg>
+<svg id="icon-baidu-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1050">
+<path fill="#333" d="M9.473 10.846c0.725-0.156 0.626-1.022 0.605-1.211-0.035-0.292-0.379-0.802-0.845-0.762-0.587 0.053-0.672 0.9-0.672 0.9-0.080 0.392 0.189 1.229 0.913 1.073zM10.243 12.353c-0.021 0.061-0.069 0.217-0.027 0.352 0.081 0.305 0.345 0.318 0.345 0.318h0.379v-0.928h-0.407c-0.183 0.055-0.271 0.197-0.291 0.258zM10.819 9.393c0.401 0 0.724-0.461 0.724-1.031s-0.323-1.030-0.724-1.030c-0.399 0-0.724 0.461-0.724 1.030s0.324 1.031 0.724 1.031zM12.543 9.461c0.535 0.069 0.879-0.501 0.947-0.935 0.070-0.432-0.275-0.935-0.654-1.021-0.379-0.087-0.853 0.521-0.897 0.917-0.052 0.485 0.069 0.969 0.603 1.038zM13.854 12.006s-0.828-0.641-1.311-1.333c-0.655-1.021-1.586-0.605-1.897-0.086-0.31 0.519-0.793 0.847-0.861 0.935-0.069 0.085-1 0.588-0.793 1.505s0.932 0.899 0.932 0.899 0.535 0.053 1.155-0.086c0.621-0.137 1.155 0.035 1.155 0.035s1.449 0.485 1.846-0.449c0.396-0.935-0.224-1.42-0.224-1.42zM11.374 13.397h-0.942c-0.407-0.081-0.569-0.359-0.589-0.406s-0.135-0.271-0.075-0.651c0.176-0.569 0.677-0.61 0.677-0.61h0.501v-0.617l0.427 0.007v2.277zM13.129 13.39h-1.084c-0.42-0.108-0.44-0.407-0.44-0.407v-1.199l0.44-0.007v1.078c0.027 0.115 0.169 0.136 0.169 0.136h0.447v-1.206h0.468v1.605zM14.664 10.189c0-0.207-0.172-0.831-0.81-0.831s-0.725 0.589-0.725 1.005c0 0.397 0.033 0.951 0.827 0.933s0.707-0.899 0.707-1.107zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l0.052-0.111c-0.201-0.083-0.385-0.213-0.533-0.393-0.345-0.423-0.433-0.979-0.368-1.358 0.062-0.522 0.394-1.388 1.275-1.467 0.032-0.003 0.069-0.005 0.106-0.005 0.001 0 0.002 0 0.003 0h-0c0.051 0 0.1 0.003 0.149 0.009 0.061-0.878 0.647-1.546 1.386-1.546 0.072 0 0.14 0.015 0.208 0.027l0.092-0.195c0.143-0.304 0.215-0.692 0.215-1.165 0-0.92-0.325-1.706-0.977-2.357s-1.437-0.977-2.357-0.977-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM8.734 14h-7.401l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h5.811c0.083 0.274 0.202 0.494 0.344 0.667z"></path>
+</svg>
+<svg id="icon-google-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1071">
+<path fill="#333" d="M10.813 8.519c0 0.622 0.208 1.071 0.618 1.335 0.335 0.216 0.725 0.249 0.927 0.249 0.049 0 0.089-0.002 0.116-0.004 0 0-0.064 0.418 0.246 0.832h-0.014c-0.537 0-2.289 0.112-2.289 1.553 0 1.465 1.609 1.54 1.932 1.54 0.025 0 0.040-0.001 0.040-0.001 0.003 0 0.027 0.001 0.066 0.001 0.207 0 0.743-0.026 1.24-0.268 0.645-0.313 0.972-0.858 0.972-1.619 0-0.735-0.499-1.173-0.863-1.493-0.222-0.195-0.414-0.363-0.414-0.527 0-0.167 0.14-0.292 0.317-0.451 0.287-0.257 0.557-0.622 0.557-1.313 0-0.607-0.079-1.015-0.564-1.273 0.051-0.026 0.229-0.045 0.318-0.057 0.263-0.036 0.647-0.077 0.647-0.291v-0.041h-1.916c-0.019-0.001-1.937 0.071-1.937 1.827zM13.906 12.274c0.037 0.586-0.465 1.019-1.217 1.073-0.765 0.056-1.394-0.288-1.431-0.873-0.018-0.281 0.106-0.557 0.348-0.777 0.245-0.223 0.583-0.359 0.949-0.387 0.043-0.003 0.086-0.005 0.129-0.005 0.707 0 1.187 0.416 1.221 0.968zM13.405 8.118c0.188 0.661-0.096 1.353-0.548 1.48-0.048 0.014-0.103 0.022-0.16 0.022-0 0-0 0-0 0h0c-0.415 0-0.825-0.419-0.977-0.997-0.085-0.325-0.078-0.608 0.019-0.881 0.096-0.268 0.268-0.449 0.485-0.511 0.048-0.014 0.103-0.022 0.16-0.022 0 0 0 0 0 0h-0c0.501 0 0.823 0.207 1.021 0.908zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l1.275-2.711c-0.009-0.099-0.017-0.199-0.017-0.308 0-1.052 0.509-1.742 1.153-2.151 0.109-0.284 0.174-0.621 0.174-1.034 0-0.92-0.325-1.706-0.977-2.357-0.651-0.652-1.437-0.977-2.357-0.977s-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM9.895 10.667l0.313-0.667h0.225c0.137 0.189 0.299 0.35 0.483 0.48l0.006 0.004c-0.115 0.055-0.221 0.116-0.322 0.182h-0.705zM10.184 14h-8.851l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h7.195c0.099 0.255 0.235 0.479 0.411 0.667z"></path>
+</svg>
+<svg id="icon-about" width="16" height="16" viewBox="0 0 16 16" x="0" y="1092">
+<path fill="#333" d="M8.011 0.991c-3.868 0-7.003 3.135-7.003 7.003s3.135 7.003 7.003 7.003 7.003-3.136 7.003-7.003c0-3.868-3.135-7.003-7.003-7.003zM7.984 11.487c-0.399 0-0.723-0.333-0.723-0.743s0.324-0.743 0.723-0.743c0.399 0 0.723 0.333 0.723 0.743s-0.324 0.743-0.723 0.743zM10.003 6.816c-0.1 0.192-0.218 0.357-0.355 0.496s-0.384 0.374-0.739 0.704c-0.098 0.093-0.177 0.174-0.236 0.245s-0.103 0.134-0.132 0.193c-0.026 0.050-0.049 0.108-0.066 0.168l-0.002 0.007c-0.016 0.059-0.040 0.161-0.072 0.308-0.055 0.312-0.227 0.467-0.516 0.467-0.15 0-0.277-0.051-0.379-0.153s-0.154-0.253-0.154-0.454c0-0.251 0.037-0.47 0.113-0.654s0.175-0.347 0.299-0.486c0.124-0.139 0.292-0.305 0.503-0.497 0.185-0.168 0.319-0.294 0.401-0.38 0.080-0.083 0.149-0.176 0.205-0.279l0.003-0.007c0.056-0.105 0.085-0.219 0.085-0.341 0-0.24-0.086-0.442-0.258-0.607s-0.394-0.247-0.666-0.247c-0.318 0-0.552 0.083-0.702 0.25s-0.277 0.411-0.382 0.735c-0.098 0.339-0.285 0.508-0.559 0.508-0.162 0-0.298-0.059-0.41-0.178s-0.167-0.247-0.167-0.384c0-0.285 0.088-0.573 0.264-0.866s0.434-0.534 0.772-0.726c0.338-0.192 0.733-0.288 1.183-0.288 0.419 0 0.789 0.080 1.11 0.24s0.569 0.378 0.743 0.654c0.175 0.276 0.262 0.576 0.262 0.899 0 0.255-0.050 0.478-0.15 0.67z"></path>
+</svg>
+<svg id="icon-blockquote" width="16" height="16" viewBox="0 0 16 16" x="0" y="1113">
+<path fill="#333" d="M13.631 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8zM6 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8z"></path>
+</svg>
+<svg id="icon-table-attr" width="16" height="16" viewBox="0 0 16 16" x="0" y="1134">
+<path fill="#333" d="M15.204 1.055h-14.364c-0.41 0-0.743 0.333-0.743 0.743v12.383c0 0.41 0.333 0.743 0.743 0.743h14.364c0.41 0 0.743-0.333 0.743-0.743v-12.383c0-0.41-0.333-0.743-0.743-0.743l-0-0zM15.204 4.027v2.903h-4.293v-2.903h4.293zM5.875 10.563v-2.889h4.293v2.889h-4.293zM10.168 11.306v2.875h-4.293v-2.875h4.293zM5.132 10.563h-4.293v-2.889h4.293v2.889zM10.168 4.027v2.903h-4.293v-2.903h4.293zM10.911 7.674h4.293v2.889h-4.293v-2.889zM6.040 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM3.811 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 4.027h3.55v2.903h-4.293l0-2.903h0.743zM0.839 11.306h4.293v2.875h-4.293v-2.875zM10.911 14.181v-2.875h4.293v2.875h-4.293z"></path>
+</svg>
+<svg id="icon-insert-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1155">
+<path fill="#333" d="M14 0h-2s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h2c0.552 0 1-0.448 1-1v-10c0-0.552-0.448-1-1-1zM14 11h-2v-3h2v3zM14 7h-2v-2h2v2zM14 4h-2v-3h2v3zM9 13l-2 3h5l-2-3h-1zM8 11v-10c0-0.552-0.448-1-1-1h-5s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h5c0.552 0 1-0.448 1-1zM7 7h-2v-2h2v2zM7 1v3h-2v-3h2zM4 11h-2v-3h2v3zM4 7h-2v-2h2v2zM4 4h-2v-3h2v3zM5 8h2v3h-2v-3z"></path>
+</svg>
+<svg id="icon-insert-row" width="18" height="16" viewBox="0 0 18 16" x="0" y="1176">
+<path fill="#333" d="M17.143 16h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143zM9.143 9.143h-3.429v2.286h3.429v-2.286zM9.143 12.571h-3.429v2.286h3.429v-2.286zM12.571 9.143h-2.286v2.286h2.286v-2.286zM12.571 12.571h-2.286v2.286h2.286v-2.286zM17.143 9.143h-3.429v2.286h3.429v-2.286zM13.714 12.571v2.286h3.429v-2.286h-3.429zM17.143 4.571h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143zM9.143 1.143h-3.429v2.286h3.429v-2.286zM12.571 1.143h-2.286v2.286h2.286v-2.286zM17.143 1.143h-3.429v2.286h3.429v-2.286zM0 3.429l3.429 2.286v1.143l-3.429 2.286v-5.714z"></path>
+</svg>
+<svg id="icon-merge-table" width="21" height="16" viewBox="0 0 21 16" x="0" y="1197">
+<path fill="#333" d="M1.484 2.296c0-0.615 0.242-1.198 0.682-1.63 0.43-0.432 1.005-0.666 1.62-0.666h0.016l10.845 0.059c0.615 0 1.198 0.242 1.63 0.682s0.666 1.021 0.666 1.637l-0.059 10.845c0 0.615-0.242 1.198-0.682 1.63-0.432 0.432-1.007 0.666-1.622 0.666h-0.016l-10.845-0.059c-0.615 0-1.198-0.242-1.63-0.682s-0.666-1.023-0.666-1.639l0.061-10.843zM6.199 1.048l-2.412-0.016c-0.333 0-0.65 0.134-0.897 0.374-0.242 0.242-0.374 0.556-0.374 0.897l-0.016 2.461h3.7v-3.716zM10.98 1.072l-3.742-0.024v3.718h3.742v-3.693zM12.020 14.463l2.552 0.016c0.341 0 0.658-0.124 0.897-0.365 0.242-0.242 0.374-0.556 0.374-0.897l0.016-2.579h-3.842v3.825zM12.020 9.598h3.844l0.016-3.793h-3.868v3.793h0.008zM12.020 4.765h3.868l0.016-2.396c0-0.333-0.124-0.658-0.365-0.897-0.242-0.242-0.556-0.374-0.897-0.374l-2.619-0.016v3.683z"></path>
+<path fill="#333" d="M5.005 1.478c0.008 0 0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-merge-td" width="16" height="16" viewBox="0 0 16 16" x="0" y="1218">
+<path fill="#333" d="M11.371 9.493h2.837v-2.987h-12.416v2.987h9.579zM0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333z"></path>
+</svg>
+<svg id="icon-remove-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1239">
+<path fill="#333" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM7 12h1v1h-1s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h5c0.552 0 1 0.448 1 1v7h-1v-3h-2v3h-1v-3h-2v3h1v1h-1v3zM10 4h2v-3h-2v3zM9 4v-3h-2v3h2zM1 13s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h2c0.552 0 1 0.448 1 1v12h-3zM3 1h-2v3h2v-3zM3 5h-2v3h2v-3zM3 9h-2v3h2v-3z"></path>
+</svg>
+<svg id="icon-remove-row" width="16" height="16" viewBox="0 0 16 16" x="0" y="1260">
+<path fill="#333" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM9 8h-4v2h1.667l0.333 1h-2v2h2.667l0.333 1h-7c-0.552 0-1-0.448-1-1v-5s0.448-1 1-1h12v1h-4zM4 8h-3v2h3v-2zM4 11h-3v2h3v-2zM1 4c-0.552 0-1-0.448-1-1v-2s0.448-1 1-1h11c0.552 0 1 0.448 1 1v3h-12zM4 1h-3v2h3v-2zM8 1h-3v2h3v-2zM12 1h-3v2h3v-2z"></path>
+</svg>
+<svg id="icon-remove-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="1281">
+<path fill="#333" d="M14.857 16v-3.429l3.429-2.286v3.429l-3.429 2.286zM8 11.429l4.571-3.429h5.714l-4.571 3.429h-5.714zM13.714 4.571h-3.429v3.429h-4.571v2.286h1.143v1.143h-5.714c-0.631 0-1.143-0.512-1.143-1.143v-9.143c0-0.631 0.512-1.143 1.143-1.143h12.571c0.631 0 1.143 0.512 1.143 1.143v5.714h-1.143v-2.286zM4.571 1.143h-3.429v2.286h3.429v-2.286zM4.571 4.571h-3.429v2.286h3.429v-2.286zM4.571 8h-3.429v2.286h3.429v-2.286zM9.143 1.143h-3.429v2.286h3.429v-2.286zM9.143 4.571h-3.429v2.286h3.429v-2.286zM13.714 1.143h-3.429v2.286h3.429v-2.286zM13.714 16h-5.714v-3.429h5.714v3.429z"></path>
+</svg>
+<svg id="icon-insert-col2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1302">
+<path fill="#333" d="M2 16h2s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v10c0 0.552 0.448 1 1 1zM2 5h2v3h-2v-3zM2 9h2v2h-2v-2zM2 12h2v3h-2v-3zM7 3l2-3h-5l2 3h1zM8 5v10c0 0.552 0.448 1 1 1h5s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-5c-0.552 0-1 0.448-1 1zM9 9h2v2h-2v-2zM9 15v-3h2v3h-2zM12 5h2v3h-2v-3zM12 9h2v2h-2v-2zM12 12h2v3h-2v-3zM11 8h-2v-3h2v3z"></path>
+</svg>
+<svg id="icon-insert-row2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1323">
+<path fill="#333" d="M1.154 0h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143zM9.154 6.857h3.429v-2.286h-3.429v2.286zM9.154 3.429h3.429v-2.286h-3.429v2.286zM5.725 6.857h2.286v-2.286h-2.286v2.286zM5.725 3.429h2.286v-2.286h-2.286v2.286zM1.154 6.857h3.429v-2.286h-3.429v2.286zM4.583 3.429v-2.286h-3.429v2.286h3.429zM1.154 11.429h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143zM9.154 14.857h3.429v-2.286h-3.429v2.286zM5.725 14.857h2.286v-2.286h-2.286v2.286zM1.154 14.857h3.429v-2.286h-3.429v2.286zM18.297 12.571l-3.429-2.286v-1.143l3.429-2.286v5.714z"></path>
+</svg>
+<svg id="icon-split-table" width="16" height="16" viewBox="0 0 16 16" x="0" y="1344">
+<path fill="#333" d="M0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333zM10.667 9.493v-2.987h-1.792v2.987h1.792zM14.208 9.493v-2.987h-1.792v2.987h1.792zM3.584 9.493v-2.987h-1.792v2.987h1.792zM7.125 9.493v-2.987h-1.792v2.987h1.792z"></path>
+</svg>
+<svg id="icon-merge-table2" width="21" height="16" viewBox="0 0 21 16" x="0" y="1365">
+<path fill="#333" d="M19.297 2.296c0-0.615-0.242-1.198-0.682-1.63-0.43-0.432-1.005-0.666-1.62-0.666h-0.016l-10.845 0.059c-0.615 0-1.198 0.242-1.63 0.682s-0.666 1.021-0.666 1.637l0.059 10.845c0 0.615 0.242 1.198 0.682 1.63 0.432 0.432 1.007 0.666 1.622 0.666h0.016l10.845-0.059c0.615 0 1.198-0.242 1.63-0.682s0.666-1.023 0.666-1.639l-0.061-10.843zM14.583 1.048l2.412-0.016c0.333 0 0.65 0.134 0.897 0.374 0.242 0.242 0.374 0.556 0.374 0.897l0.016 2.461h-3.7v-3.716zM9.801 1.072l3.742-0.024v3.718h-3.742v-3.693zM8.761 14.463l-2.552 0.016c-0.341 0-0.658-0.124-0.897-0.365-0.242-0.242-0.374-0.556-0.374-0.897l-0.016-2.579h3.842v3.825zM8.761 9.598h-3.844l-0.016-3.793h3.868v3.793h-0.008zM8.761 4.765h-3.868l-0.016-2.396c0-0.333 0.124-0.658 0.365-0.897 0.242-0.242 0.556-0.374 0.897-0.374l2.619-0.016v3.683z"></path>
+<path fill="#333" d="M15.777 1.478c-0.008 0-0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-remove2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1386">
+<path fill="#333" d="M6.214 13.804c0.401 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726zM15.299 1.464h-6.178v-0.726c0-0.401-0.325-0.726-0.727-0.726h-0.727c-0.401 0-0.727 0.325-0.727 0.726v0.726h-6.177c-0.008-0-0.017-0-0.026-0-0.401 0-0.726 0.325-0.726 0.726s0.325 0.726 0.726 0.726c0.009 0 0.018-0 0.027-0.001l-0.001 0h1.090v11.615c0.001 0.802 0.651 1.452 1.453 1.452 0 0 0.001 0 0.001 0h9.448c0 0 0.001 0 0.001 0 0.802 0 1.452-0.65 1.453-1.452v-11.615h1.090c0.008 0 0.017 0 0.026 0 0.401 0 0.726-0.325 0.726-0.726s-0.325-0.726-0.726-0.726c-0.009 0-0.018 0-0.027 0l0.001-0zM12.755 13.804c0 0.401-0.325 0.726-0.727 0.726h-7.994c-0.401 0-0.727-0.325-0.727-0.726v-10.889h9.448v10.889zM9.847 13.804c0.402 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726z"></path>
+</svg>
+<svg id="icon-ok" width="16" height="16" viewBox="0 0 16 16" x="0" y="1407">
+<path fill="#333" d="M8 16c-4.418 0-8-3.582-8-8s3.582-8 8-8c4.418 0 8 3.582 8 8s-3.582 8-8 8zM12.177 4.986l-4.894 4.894-3.364-3.365-0.918 0.918 4.282 4.283 5.811-5.812-0.917-0.918z"></path>
+</svg>
+<svg id="icon-remove" width="16" height="16" viewBox="0 0 16 16" x="0" y="1428">
+<path fill="#333" d="M8 1c-3.867 0-7 3.133-7 7s3.133 7 7 7 7-3.133 7-7c0-3.867-3.133-7-7-7zM11.167 10.7c0.133 0.133 0.133 0.333 0 0.467s-0.333 0.133-0.467 0l-2.7-2.7-2.7 2.7c-0.133 0.133-0.333 0.133-0.467 0s-0.133-0.333 0-0.467l2.7-2.7-2.7-2.7c-0.133-0.133-0.133-0.333 0-0.467s0.333-0.133 0.467 0l2.7 2.7 2.7-2.7c0.133-0.133 0.333-0.133 0.467 0s0.133 0.333 0 0.467l-2.7 2.7 2.7 2.7z"></path>
+</svg>
+<svg id="icon-graft2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1449">
+<path fill="#333" d="M11.658 0.504c0.216-0.218 0.516-0.354 0.848-0.354s0.631 0.135 0.847 0.354l1.664 1.664c0.217 0.217 0.351 0.517 0.351 0.848s-0.134 0.631-0.351 0.848l-9.336 9.336c-0.468 0.468-1.365 0.954-2.024 1.089l-3.048 0.625 0.625-3.048c0.133-0.65 0.62-1.557 1.088-2.025l9.336-9.336zM9.96 2.202l-0.848 0.849 3.358 3.359 0.849-0.849-3.359-3.359zM12.184 12.804c0.905-0.457 1.054-0.865 0.639-1.526-0.338-0.537-1.675-0.285-1.797 0.805-0.044 0.398 0.117 0.753 0.421 1.026 0.28-0.096 0.525-0.197 0.737-0.305zM13.063 13.682c-0.092 0.059-0.206 0.124-0.322 0.183l-0.025 0.012c-0.396 0.201-0.877 0.38-1.442 0.54-1.27 0.36-2.968 0.617-5.104 0.781-0.013 0.001-0.028 0.002-0.043 0.002-0.314 0-0.572-0.243-0.594-0.552l-0-0.002c-0.001-0.014-0.002-0.031-0.002-0.048 0-0.313 0.24-0.57 0.547-0.596l0.002-0c1.652-0.127 3.021-0.311 4.101-0.548 0.479-0.104 0.901-0.22 1.266-0.345 0.367 0.331 0.943 0.544 1.616 0.573 0.981 0.043 2.17-0.303 3.22-1.242 0.104-0.093 0.242-0.15 0.393-0.15 0.177 0 0.336 0.078 0.444 0.202l0.001 0.001c0.093 0.106 0.149 0.245 0.149 0.398 0 0.178-0.077 0.338-0.2 0.449l-0.001 0c-1.888 1.687-4.29 1.855-5.796 1.079-0.462-0.238-0.84-0.565-1.093-0.964-0.221-0.346-0.353-0.767-0.353-1.219 0-0.101 0.007-0.2 0.019-0.297l-0.001 0.011c0.25-2.25 3.058-2.78 3.979-1.315 0.752 1.197 0.45 2.291-0.762 3.048z"></path>
+</svg>
+<svg id="icon-func" width="17" height="16" viewBox="0 0 17 16" x="0" y="1470">
+<path fill="#333" d="M0.531 15.51v-2.065h4.213c-1.236-0.919-2.162-1.924-2.78-3.018-0.582-1.007-0.926-2.215-0.926-3.503 0-0.014 0-0.029 0-0.043l-0 0.002c0-1.992 0.695-3.612 2.086-4.861 1.39-1.25 3.193-1.874 5.406-1.874 2.215 0 4.017 0.625 5.408 1.874s2.086 2.869 2.086 4.86c0 1.263-0.309 2.441-0.927 3.535s-1.544 2.103-2.78 3.028h4.213v2.065h-6.854v-2.065c1.012-0.756 1.772-1.663 2.278-2.72 0.506-1.056 0.76-2.263 0.76-3.62 0-1.519-0.373-2.715-1.12-3.59-0.745-0.874-1.767-1.31-3.063-1.31s-2.317 0.438-3.063 1.316c-0.746 0.877-1.119 2.076-1.119 3.595 0 1.356 0.253 2.562 0.76 3.615s1.265 1.958 2.278 2.714v2.065h-6.857z"></path>
+</svg>
+<svg id="icon-find" width="16" height="16" viewBox="0 0 16 16" x="0" y="1491">
+<path fill="#333" d="M1 0h6v1h-6zM9 0h6v1h-6zM14.875 5h-0.875v-4h-4v4h-4v-4h-4v4h-0.875c-0.619 0-1.125 0.506-1.125 1.125v8.75c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-5.875h2v5.875c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-8.75c0-0.619-0.506-1.125-1.125-1.125zM5.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5zM8.5 8h-1c-0.275 0-0.5-0.225-0.5-0.5s0.225-0.5 0.5-0.5h1c0.275 0 0.5 0.225 0.5 0.5s-0.225 0.5-0.5 0.5zM14.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5z"></path>
+</svg>
+<svg id="icon-date" width="16" height="16" viewBox="0 0 16 16" x="0" y="1512">
+<path fill="#333" d="M13.597 2.081h-0.584v2.837c0 0.603-0.489 1.093-1.093 1.093s-1.092-0.49-1.092-1.093v-2.837h-5.64v2.83c0 0.604-0.49 1.094-1.094 1.094-0.603 0-1.092-0.49-1.092-1.094v-2.83h-0.6c-0.775 0-1.402 0.628-1.402 1.402v3.070h14v-3.070c0-0.774-0.627-1.402-1.403-1.402zM4.927 4.612c0 0.463-0.376 0.837-0.837 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.375-0.837 0.837-0.837v0c0.461 0 0.837 0.374 0.837 0.837v2.76zM12.78 4.612c0 0.463-0.374 0.837-0.838 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.374-0.837 0.837-0.837v0c0.464 0 0.838 0.374 0.838 0.837v2.76zM14.182 7.133v5.608c0 0.774-0.627 1.401-1.401 1.401h-9.573c-0.774 0-1.401-0.627-1.401-1.401v-5.608h-0.807v6.45c0 0.774 0.627 1.403 1.403 1.403h11.193c0.776 0 1.403-0.629 1.403-1.403v-6.45h-0.817zM8.393 11.198h1.101c0.109 0.504 0.389 0.649 0.662 0.649 0.405 0 0.651-0.262 0.651-0.723 0-0.26-0.097-0.626-0.651-0.64h-0.351v-0.69h0.159c0.554-0.014 0.687-0.241 0.687-0.66 0-0.271-0.201-0.468-0.526-0.477-0.426-0.011-0.491 0.185-0.598 0.443l-1.031 0.002c0.239-0.793 0.793-1.196 1.661-1.21 1.052 0.028 1.597 0.453 1.635 1.274 0 0.403-0.232 0.708-0.692 0.909 0.589 0.202 0.885 0.563 0.885 1.080-0.037 0.865-0.646 1.319-1.827 1.362-0.998 0.001-1.599-0.483-1.765-1.319zM7.633 11.479v0.975h-3.543v-0.629c0.386-0.605 0.771-1.059 1.492-1.52 0.663-0.433 0.894-0.763 0.894-1.080 0-0.070 0.003-0.433-0.531-0.433-0.372 0.014-0.645 0.182-0.645 0.565l-1.128 0.007c0.065-1.087 0.95-1.473 1.856-1.473 1.032 0.043 1.586 0.482 1.66 1.317 0.037 0.563-0.28 1.101-1.148 1.634-0.48 0.287-0.523 0.319-0.817 0.636h1.91z"></path>
+</svg>
+<svg id="icon-clock" width="16" height="16" viewBox="0 0 16 16" x="0" y="1533">
+<path fill="#333" d="M11.331 7.805h-2.732v-2.199c0-0.333-0.267-0.6-0.6-0.6s-0.6 0.267-0.6 0.6v2.932c0.067 0.267 0.267 0.466 0.533 0.466h3.398c0.333 0 0.6-0.267 0.6-0.6s-0.267-0.6-0.6-0.6zM13.53 3.074c-1.399-1.399-3.331-2.199-5.53-2.199-2.132 0-4.131 0.866-5.53 2.199-1.399 1.399-2.265 3.265-2.265 5.33s0.866 3.998 2.265 5.33c1.399 1.399 3.331 2.199 5.53 2.199 2.132 0 4.131-0.866 5.53-2.199 1.399-1.399 2.265-3.265 2.265-5.33s-0.866-3.998-2.265-5.33zM12.664 12.935c-1.199 1.133-2.865 1.866-4.664 1.866s-3.465-0.733-4.664-1.866c-1.199-1.133-1.932-2.732-1.932-4.531s0.733-3.398 1.932-4.531c1.199-1.133 2.865-1.866 4.664-1.866s3.465 0.733 4.664 1.866c1.199 1.133 1.932 2.798 1.932 4.531 0 1.799-0.733 3.398-1.932 4.531zM1.271 2.874l2.332-1.866c0.267-0.2 0.267-0.6 0.067-0.8-0.2-0.267-0.6-0.267-0.866-0.067l-2.332 1.866c-0.267 0.2-0.333 0.6-0.067 0.8 0.2 0.267 0.6 0.267 0.866 0.067zM14.729 2.874c0.267 0.2 0.666 0.133 0.866-0.067 0.2-0.267 0.133-0.6-0.067-0.8l-2.332-1.866c-0.267-0.2-0.666-0.133-0.866 0.067-0.2 0.267-0.2 0.6 0.067 0.8l2.332 1.866z"></path>
+</svg>
+</svg>
diff --git a/public/assets/addons/nkeditor/themes/blue/editor.css b/public/assets/addons/nkeditor/themes/blue/editor.css
new file mode 100644
index 0000000..7a14292
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/blue/editor.css
@@ -0,0 +1,822 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+.ke-container-blue .ke-toolbar {
+  border-top: 5px solid #1296db;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  background-clip: padding-box;
+  text-rendering: optimizelegibility; }
+  .ke-container-blue .ke-toolbar .ke-toolbar-icon {
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-container-blue .ke-toolbar .ke-icon-source {
+    background-position: 0 0px; }
+  .ke-container-blue .ke-toolbar .ke-icon-preview {
+    background-position: 0 -63px; }
+  .ke-container-blue .ke-toolbar .ke-icon-print {
+    background-position: 0 -84px; }
+  .ke-container-blue .ke-toolbar .ke-icon-undo {
+    background-position: 0 -21px; }
+  .ke-container-blue .ke-toolbar .ke-icon-redo {
+    background-position: 0 -42px; }
+  .ke-container-blue .ke-toolbar .ke-icon-template {
+    background-position: 0 -105px; }
+  .ke-container-blue .ke-toolbar .ke-icon-cut {
+    background-position: 0 -147px; }
+  .ke-container-blue .ke-toolbar .ke-icon-copy {
+    background-position: 0 -168px; }
+  .ke-container-blue .ke-toolbar .ke-icon-paste {
+    background-position: 0 -189px; }
+  .ke-container-blue .ke-toolbar .ke-icon-selectall {
+    background-position: 0 -483px; }
+  .ke-container-blue .ke-toolbar .ke-icon-justifyleft {
+    background-position: 0 -252px; }
+  .ke-container-blue .ke-toolbar .ke-icon-justifycenter {
+    background-position: 0 -273px; }
+  .ke-container-blue .ke-toolbar .ke-icon-justifyright {
+    background-position: 0 -294px; }
+  .ke-container-blue .ke-toolbar .ke-icon-justifyfull {
+    background-position: 0 -315px; }
+  .ke-container-blue .ke-toolbar .ke-icon-insertorderedlist {
+    background-position: 0 -336px; }
+  .ke-container-blue .ke-toolbar .ke-icon-insertunorderedlist {
+    background-position: 0 -357px; }
+  .ke-container-blue .ke-toolbar .ke-icon-indent {
+    background-position: 0 -378px; }
+  .ke-container-blue .ke-toolbar .ke-icon-outdent {
+    background-position: 0 -399px; }
+  .ke-container-blue .ke-toolbar .ke-icon-subscript {
+    background-position: 0 -420px; }
+  .ke-container-blue .ke-toolbar .ke-icon-superscript {
+    background-position: 0 -441px; }
+  .ke-container-blue .ke-toolbar .ke-icon-date {
+    background-position: 0px -304px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-time {
+    background-position: 0px -320px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-formatblock {
+    background-position: 0 -546px; }
+  .ke-container-blue .ke-toolbar .ke-icon-fontname {
+    background-position: 0 -567px; }
+  .ke-container-blue .ke-toolbar .ke-icon-fontsize {
+    background-position: 0 -588px; }
+  .ke-container-blue .ke-toolbar .ke-icon-forecolor {
+    background-position: 0 -609px; }
+  .ke-container-blue .ke-toolbar .ke-icon-hilitecolor {
+    background-position: 0 -630px; }
+  .ke-container-blue .ke-toolbar .ke-icon-bold {
+    background-position: 0 -651px; }
+  .ke-container-blue .ke-toolbar .ke-icon-italic {
+    background-position: 0 -672px; }
+  .ke-container-blue .ke-toolbar .ke-icon-underline {
+    background-position: 0 -693px; }
+  .ke-container-blue .ke-toolbar .ke-icon-strikethrough {
+    background-position: 0 -714px; }
+  .ke-container-blue .ke-toolbar .ke-icon-removeformat {
+    background-position: 0 -756px; }
+  .ke-container-blue .ke-toolbar .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-container-blue .ke-toolbar .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-container-blue .ke-toolbar .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-container-blue .ke-toolbar .ke-icon-div {
+    background-position: 0px -544px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-formula {
+    background-position: 0px -576px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-hr {
+    background-position: 0 -924px; }
+  .ke-container-blue .ke-toolbar .ke-icon-emoticons {
+    background-position: 0 -945px; }
+  .ke-container-blue .ke-toolbar .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-container-blue .ke-toolbar .ke-icon-unlink {
+    background-position: 0 -1029px; }
+  .ke-container-blue .ke-toolbar .ke-icon-fullscreen {
+    background-position: 0 -525px; }
+  .ke-container-blue .ke-toolbar .ke-icon-about {
+    background-position: 0 -1092px; }
+  .ke-container-blue .ke-toolbar .ke-icon-quote {
+    background-position: 0 -1114px; }
+  .ke-container-blue .ke-toolbar .ke-icon-plainpaste {
+    background-position: 0 -210px; }
+  .ke-container-blue .ke-toolbar .ke-icon-wordpaste {
+    background-position: 0 -231px; }
+  .ke-container-blue .ke-toolbar .ke-icon-table {
+    background-position: 0px -903px;
+    width: 18px !important; }
+  .ke-container-blue .ke-toolbar .ke-icon-tablemenu {
+    background-position: 0px -768px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-code {
+    background-position: 0 -126px; }
+  .ke-container-blue .ke-toolbar .ke-icon-map {
+    background-position: 0px -976px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-baidumap {
+    background-position: 0 -1050px; }
+  .ke-container-blue .ke-toolbar .ke-icon-lineheight {
+    background-position: 0 -735px; }
+  .ke-container-blue .ke-toolbar .ke-icon-clearhtml {
+    background-position: 0 -462px; }
+  .ke-container-blue .ke-toolbar .ke-icon-pagebreak {
+    background-position: 0 -966px; }
+  .ke-container-blue .ke-toolbar .ke-icon-insertfile {
+    background-position: 0 -882px; }
+  .ke-container-blue .ke-toolbar .ke-icon-quickformat {
+    background-position: 0 -504px; }
+  .ke-container-blue .ke-toolbar .ke-icon-anchor {
+    background-position: 0 -987px; }
+  .ke-container-blue .ke-toolbar .ke-icon-search {
+    background-position: 0px -1184px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-new {
+    background-position: 0px -1200px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-specialchar {
+    background-position: 0px -1216px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-blue .ke-toolbar .ke-icon-multiimage {
+    background-position: 0 -798px; }
+  .ke-container-blue .ke-toolbar .ke-icon-graft {
+    background-position: 0 -819px; }
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-blue .ke-menu-item .ke-menu-item-left {
+  width: 27px;
+  text-align: center;
+  overflow: hidden; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert {
+    background-position: 0 -903px;
+    width: 18px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete {
+    background-position: 0 -1428px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft {
+    background-position: 0 -1176px;
+    width: 18px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright {
+    background-position: 0 -1323px;
+    width: 18px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove {
+    background-position: 0 -1302px;
+    width: 22px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow {
+    background-position: 0 -1155px;
+    width: 22px !important; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete {
+    background-position: 0 -1239px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete {
+    background-position: 0 -1260px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop {
+    background-position: 0 -1218px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tableprop {
+    background-position: 0 -1134px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit {
+    background-position: 0px -1088px;
+    width: 16px;
+    height: 16px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge {
+    background-position: -1px -1197px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge {
+    background-position: -4px -1365px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-checked {
+    background-position: 0 -1407px; }
+
+/*# sourceMappingURL=editor.css.map */
diff --git a/public/assets/addons/nkeditor/themes/blue/editor.css.map b/public/assets/addons/nkeditor/themes/blue/editor.css.map
new file mode 100644
index 0000000..01a6d6f
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/blue/editor.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../common/common.scss","editor.scss"],
+"names": [],
+"file": "editor.css"
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/blue/editor.min.css b/public/assets/addons/nkeditor/themes/blue/editor.min.css
new file mode 100644
index 0000000..5297fab
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/blue/editor.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ke-clearfix{zoom:1;clear:both}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-dialog-lock{background-color:#fff;opacity:.5;z-index:811213;left:0;top:0;position:absolute}.ke-container{display:block;background-color:#fff;overflow:hidden;margin:0;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16)}.ke-container .ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-container .ke-dialog a,.ke-container .ke-dialog a:hover,.ke-container .ke-menu a,.ke-container .ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-container .ke-toolbar{text-align:left;overflow:hidden;zoom:1;padding:0 5px}.ke-container .ke-toolbar .ke-outline{padding:10px 5px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-container .ke-toolbar .ke-outline .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px}.ke-container .ke-toolbar .ke-on{background:#ebebeb}.ke-container .ke-toolbar .ke-selected{background-color:#ebebeb}.ke-container .ke-toolbar .ke-disabled{cursor:default}.ke-container .ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-container .ke-toolbar .ke-hr{clear:both;height:1px;width:calc(100% - (2 * 2px));background:#ebebeb}.ke-container .ke-edit{padding:0}.ke-container .ke-edit .ke-edit-iframe,.ke-container .ke-edit .ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-container .ke-edit .ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-container .ke-edit .ke-edit-textarea:focus{outline:0}.ke-container .ke-statusbar{position:relative;background-color:#f5f5f5;border-top:1px solid #e1e1e1;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize;display:none}.ke-container .ke-statusbar .ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px}.ke-container .ke-statusbar .ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;width:11px;height:11px}.ke-menu{border:1px solid #ccc;background-color:#f5f5f5;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu .ke-menu-item .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-inline-block .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu .ke-menu-item .ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu .ke-menu-item .ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #e1e1e1;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-menu .ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons{position:relative}.ke-menu .ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img{border:0;margin:0;padding:0}.ke-menu .ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell{margin:0;padding:1px;border:1px solid #f5f5f5;cursor:pointer}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-menu .ke-plugin-emoticons .ke-table .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker .ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f1f1f1;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-dialog{margin:0;padding:0;border:1px solid #ccc;zoom:1;box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden}.ke-dialog .ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom:1px solid #c6c6c6;background:transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.ke-dialog .ke-dialog-header .ke-dialog-icon-close{height:20px;width:20px;cursor:pointer;background:url(../common/icons-all.gif) 0 -59px;position:absolute;right:5px;top:4px}.ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover{background-position:0 -89px}.ke-dialog .ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border:1px solid #ccc}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus{border-color:#66afe9;outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto;border:1px solid #ccc;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number{width:50px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox{position:relative;top:6px}.ke-dialog .ke-dialog-content .ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus{outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text{display:inline-block!important;max-width:400px;height:30px;line-height:30px;border:1px solid #ccc;font-size:14px;margin:0;outline:0;padding:0 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus{border-color:#66afe9}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color{border:1px solid #e1e1e1;background-color:#fff;font-size:12px;width:60px;height:30px;line-height:30px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0;top:-1px;position:relative}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:62px;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common{top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button{padding:8px 15px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner{padding:10px 20px 0 20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row{border:1px solid #fff;margin-bottom:10px;overflow:hidden}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left{float:left;height:30px;line-height:30px;width:60px;text-align:right}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right{float:left;text-align:left}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button{position:relative;top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label{cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header{height:30px;line-height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text{height:22px;line-height:22px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button{padding:3px 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox{margin-left:10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #e1e1e1;margin-bottom:20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul{list-style:none outside none;margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected{background-color:#fff;border:1px solid #e1e1e1;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on{background-color:#fff;color:#000}.ke-dialog .ke-dialog-content .ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat center;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog .ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;height:40px}.ke-dialog .ke-dialog-footer .ke-dialog-yes{margin:5px}.ke-dialog .ke-dialog-footer .ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog .ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-dialog .ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:7px 10px;margin-top:-4px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-dialog .ke-button:hover{border:1px solid #e1e1e1;background-color:#e1e1e1}.ke-dialog .ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog .ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-container-blue .ke-toolbar{border-top:5px solid #1296db;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);background-clip:padding-box;text-rendering:optimizelegibility}.ke-container-blue .ke-toolbar .ke-toolbar-icon{background:url(images/nkeditor.svg) no-repeat}.ke-container-blue .ke-toolbar .ke-icon-source{background-position:0 0}.ke-container-blue .ke-toolbar .ke-icon-preview{background-position:0 -63px}.ke-container-blue .ke-toolbar .ke-icon-print{background-position:0 -84px}.ke-container-blue .ke-toolbar .ke-icon-undo{background-position:0 -21px}.ke-container-blue .ke-toolbar .ke-icon-redo{background-position:0 -42px}.ke-container-blue .ke-toolbar .ke-icon-template{background-position:0 -105px}.ke-container-blue .ke-toolbar .ke-icon-cut{background-position:0 -147px}.ke-container-blue .ke-toolbar .ke-icon-copy{background-position:0 -168px}.ke-container-blue .ke-toolbar .ke-icon-paste{background-position:0 -189px}.ke-container-blue .ke-toolbar .ke-icon-selectall{background-position:0 -483px}.ke-container-blue .ke-toolbar .ke-icon-justifyleft{background-position:0 -252px}.ke-container-blue .ke-toolbar .ke-icon-justifycenter{background-position:0 -273px}.ke-container-blue .ke-toolbar .ke-icon-justifyright{background-position:0 -294px}.ke-container-blue .ke-toolbar .ke-icon-justifyfull{background-position:0 -315px}.ke-container-blue .ke-toolbar .ke-icon-insertorderedlist{background-position:0 -336px}.ke-container-blue .ke-toolbar .ke-icon-insertunorderedlist{background-position:0 -357px}.ke-container-blue .ke-toolbar .ke-icon-indent{background-position:0 -378px}.ke-container-blue .ke-toolbar .ke-icon-outdent{background-position:0 -399px}.ke-container-blue .ke-toolbar .ke-icon-subscript{background-position:0 -420px}.ke-container-blue .ke-toolbar .ke-icon-superscript{background-position:0 -441px}.ke-container-blue .ke-toolbar .ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-formatblock{background-position:0 -546px}.ke-container-blue .ke-toolbar .ke-icon-fontname{background-position:0 -567px}.ke-container-blue .ke-toolbar .ke-icon-fontsize{background-position:0 -588px}.ke-container-blue .ke-toolbar .ke-icon-forecolor{background-position:0 -609px}.ke-container-blue .ke-toolbar .ke-icon-hilitecolor{background-position:0 -630px}.ke-container-blue .ke-toolbar .ke-icon-bold{background-position:0 -651px}.ke-container-blue .ke-toolbar .ke-icon-italic{background-position:0 -672px}.ke-container-blue .ke-toolbar .ke-icon-underline{background-position:0 -693px}.ke-container-blue .ke-toolbar .ke-icon-strikethrough{background-position:0 -714px}.ke-container-blue .ke-toolbar .ke-icon-removeformat{background-position:0 -756px}.ke-container-blue .ke-toolbar .ke-icon-image{background-position:0 -777px}.ke-container-blue .ke-toolbar .ke-icon-flash{background-position:0 -840px}.ke-container-blue .ke-toolbar .ke-icon-media{background-position:0 -861px}.ke-container-blue .ke-toolbar .ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-hr{background-position:0 -924px}.ke-container-blue .ke-toolbar .ke-icon-emoticons{background-position:0 -945px}.ke-container-blue .ke-toolbar .ke-icon-link{background-position:0 -1008px}.ke-container-blue .ke-toolbar .ke-icon-unlink{background-position:0 -1029px}.ke-container-blue .ke-toolbar .ke-icon-fullscreen{background-position:0 -525px}.ke-container-blue .ke-toolbar .ke-icon-about{background-position:0 -1092px}.ke-container-blue .ke-toolbar .ke-icon-quote{background-position:0 -1114px}.ke-container-blue .ke-toolbar .ke-icon-plainpaste{background-position:0 -210px}.ke-container-blue .ke-toolbar .ke-icon-wordpaste{background-position:0 -231px}.ke-container-blue .ke-toolbar .ke-icon-table{background-position:0 -903px;width:18px!important}.ke-container-blue .ke-toolbar .ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-code{background-position:0 -126px}.ke-container-blue .ke-toolbar .ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-baidumap{background-position:0 -1050px}.ke-container-blue .ke-toolbar .ke-icon-lineheight{background-position:0 -735px}.ke-container-blue .ke-toolbar .ke-icon-clearhtml{background-position:0 -462px}.ke-container-blue .ke-toolbar .ke-icon-pagebreak{background-position:0 -966px}.ke-container-blue .ke-toolbar .ke-icon-insertfile{background-position:0 -882px}.ke-container-blue .ke-toolbar .ke-icon-quickformat{background-position:0 -504px}.ke-container-blue .ke-toolbar .ke-icon-anchor{background-position:0 -987px}.ke-container-blue .ke-toolbar .ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-container-blue .ke-toolbar .ke-icon-multiimage{background-position:0 -798px}.ke-container-blue .ke-toolbar .ke-icon-graft{background-position:0 -819px}.ke-menu-blue .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px;background:url(images/nkeditor.svg) no-repeat}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert{background-position:0 -903px;width:18px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete{background-position:0 -1428px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft{background-position:0 -1176px;width:18px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright{background-position:0 -1323px;width:18px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove{background-position:0 -1302px;width:22px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow{background-position:0 -1155px;width:22px!important}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete{background-position:0 -1239px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete{background-position:0 -1260px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop{background-position:0 -1218px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tableprop{background-position:0 -1134px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge{background-position:-1px -1197px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit{background-position:0 -1344px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge{background-position:-4px -1365px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit{background-position:0 -1344px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-image{background-position:0 -777px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-flash{background-position:0 -840px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-media{background-position:0 -861px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-link{background-position:0 -1008px}.ke-menu-blue .ke-menu-item .ke-menu-item-left .ke-icon-checked{background-position:0 -1407px}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/blue/editor.scss b/public/assets/addons/nkeditor/themes/blue/editor.scss
new file mode 100644
index 0000000..56739c1
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/blue/editor.scss
@@ -0,0 +1,387 @@
+@import "../common/common";
+
+.ke-container-blue {
+    .ke-toolbar {
+
+        border-top: 5px solid #1296db;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+        background-clip: padding-box;
+        text-rendering: optimizelegibility;
+
+        .ke-toolbar-icon {
+            *background-image: url(images/nkeditor.png);
+            background: url(images/nkeditor.svg) no-repeat;
+        }
+
+        .ke-icon-source {
+            background-position: 0 0px;
+        }
+        .ke-icon-preview {
+            background-position: 0 -63px;
+        }
+        .ke-icon-print {
+            background-position: 0 -84px;
+        }
+        .ke-icon-undo {
+            background-position: 0 -21px;
+        }
+
+        .ke-icon-redo {
+            background-position: 0 -42px;
+        }
+
+        .ke-icon-template {
+            background-position: 0 -105px;
+        }
+
+        .ke-icon-cut {
+            background-position: 0 -147px;
+        }
+
+        .ke-icon-copy {
+            background-position: 0 -168px;
+        }
+
+        .ke-icon-paste {
+            background-position: 0 -189px;
+        }
+
+        .ke-icon-selectall {
+            background-position: 0 -483px;
+        }
+
+        .ke-icon-justifyleft {
+            background-position: 0 -252px;
+        }
+
+        .ke-icon-justifycenter {
+            background-position: 0 -273px;
+        }
+
+        .ke-icon-justifyright {
+            background-position: 0 -294px;
+        }
+
+        .ke-icon-justifyfull {
+            background-position: 0 -315px;
+        }
+
+        .ke-icon-insertorderedlist {
+            background-position: 0 -336px;
+        }
+
+        .ke-icon-insertunorderedlist {
+            background-position: 0 -357px;
+        }
+
+        .ke-icon-indent {
+            background-position: 0 -378px;
+        }
+
+        .ke-icon-outdent {
+            background-position: 0 -399px;
+        }
+
+        .ke-icon-subscript {
+            background-position: 0 -420px;
+        }
+
+        .ke-icon-superscript {
+            background-position: 0 -441px;
+        }
+
+        .ke-icon-date {
+            background-position: 0px -304px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-time {
+            background-position: 0px -320px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-formatblock {
+            background-position: 0 -546px;
+        }
+
+        .ke-icon-fontname {
+            background-position: 0 -567px;
+        }
+
+        .ke-icon-fontsize {
+            background-position: 0 -588px;
+        }
+
+        .ke-icon-forecolor {
+            background-position: 0 -609px;
+        }
+
+        .ke-icon-hilitecolor {
+            background-position: 0 -630px;
+        }
+
+        .ke-icon-bold {
+            background-position: 0 -651px;
+        }
+
+        .ke-icon-italic {
+            background-position: 0 -672px;
+        }
+
+        .ke-icon-underline {
+            background-position: 0 -693px;
+        }
+
+        .ke-icon-strikethrough {
+            background-position: 0 -714px;
+        }
+
+        .ke-icon-removeformat {
+            background-position: 0 -756px;
+        }
+
+        .ke-icon-image {
+            background-position: 0 -777px;
+        }
+
+        .ke-icon-flash {
+            background-position: 0 -840px;
+        }
+
+        .ke-icon-media {
+            background-position: 0 -861px;
+        }
+
+        .ke-icon-div {
+            background-position: 0px -544px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-formula {
+            background-position: 0px -576px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-hr {
+            background-position: 0 -924px;
+        }
+
+        .ke-icon-emoticons {
+            background-position: 0 -945px;
+        }
+
+        .ke-icon-link {
+            background-position: 0 -1008px;
+        }
+
+        .ke-icon-unlink {
+            background-position: 0 -1029px;
+        }
+
+        .ke-icon-fullscreen {
+            background-position: 0 -525px;
+        }
+
+        .ke-icon-about {
+            background-position: 0 -1092px;
+        }
+
+        .ke-icon-quote {
+            background-position: 0 -1114px;
+        }
+
+        .ke-icon-plainpaste {
+            background-position: 0 -210px;
+        }
+
+        .ke-icon-wordpaste {
+            background-position: 0 -231px;
+        }
+
+        .ke-icon-table {
+            background-position: 0px -903px;
+            width: 18px !important;
+        }
+
+        .ke-icon-tablemenu {
+            background-position: 0px -768px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-code {
+            background-position: 0 -126px;
+        }
+
+        .ke-icon-map {
+            background-position: 0px -976px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-baidumap {
+            background-position: 0 -1050px;
+        }
+
+        .ke-icon-lineheight {
+            background-position: 0 -735px;
+        }
+
+        .ke-icon-clearhtml {
+            background-position: 0 -462px;
+        }
+
+        .ke-icon-pagebreak {
+            background-position: 0 -966px;
+        }
+
+        .ke-icon-insertfile {
+            background-position: 0 -882px;
+        }
+
+        .ke-icon-quickformat {
+            background-position: 0 -504px;
+        }
+
+        .ke-icon-anchor {
+            background-position: 0 -987px;
+        }
+
+        .ke-icon-search {
+            background-position: 0px -1184px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-new {
+            background-position: 0px -1200px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-specialchar {
+            background-position: 0px -1216px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-multiimage {
+            background-position: 0 -798px;
+        }
+
+        .ke-icon-graft {
+            background-position: 0 -819px;
+        }
+    }
+}
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-blue {
+
+    .ke-menu-item {
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+                *background-image: url(images/nkeditor.png);
+                background: url(images/nkeditor.svg) no-repeat;
+            }
+
+            .ke-icon-tableinsert {
+                background-position: 0 -903px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tabledelete {
+                background-position: 0 -1428px;
+            }
+
+            .ke-icon-tablecolinsertleft {
+                background-position: 0 -1176px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablecolinsertright {
+                background-position: 0 -1323px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablerowinsertabove {
+                background-position: 0 -1302px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablerowinsertbelow {
+                background-position: 0 -1155px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablecoldelete {
+                background-position: 0 -1239px;
+            }
+
+            .ke-icon-tablerowdelete {
+                background-position: 0 -1260px;
+            }
+
+            .ke-icon-tablecellprop {
+                background-position: 0 -1218px;
+            }
+
+            .ke-icon-tableprop {
+                background-position: 0 -1134px;
+            }
+            .ke-icon-tablecellsplit {
+                background-position: 0px -1088px;
+                width: 16px;
+                height: 16px;
+            }
+
+            .ke-icon-tablerowmerge {
+                background-position: -1px -1197px;
+            }
+
+            .ke-icon-tablerowsplit {
+                background-position: 0 -1344px;
+            }
+
+            .ke-icon-tablecolmerge {
+                background-position: -4px -1365px;
+            }
+
+            .ke-icon-tablecolsplit {
+                background-position: 0 -1344px;
+            }
+
+            //图片,视频右键菜单
+            .ke-icon-image {
+                background-position: 0 -777px;
+            }
+            .ke-icon-flash {
+                background-position: 0 -840px;
+            }
+            .ke-icon-media {
+                background-position: 0 -861px;
+            }
+            .ke-icon-link {
+                background-position: 0 -1008px;
+            }
+
+            .ke-icon-checked {
+                background-position: 0 -1407px;
+            }
+
+        }
+    }
+}
+//menu end
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/blue/images/nkeditor.png b/public/assets/addons/nkeditor/themes/blue/images/nkeditor.png
new file mode 100644
index 0000000..6cf968a
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/blue/images/nkeditor.png differ
diff --git a/public/assets/addons/nkeditor/themes/blue/images/nkeditor.svg b/public/assets/addons/nkeditor/themes/blue/images/nkeditor.svg
new file mode 100644
index 0000000..5f12453
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/blue/images/nkeditor.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="1549" viewBox="0 0 21 1549">
+<svg id="icon-source-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="0">
+<path fill="#1296db" d="M14.4 16h-12.8c-0.884 0-1.6-0.716-1.6-1.6v-12.8c0-0.884 0.716-1.6 1.6-1.6h12.8c0.884 0 1.6 0.716 1.6 1.6v12.8c0 0.884-0.716 1.6-1.6 1.6zM14.4 2.4h-12.8v12h12.8v-12zM6.4 5.6l-2.4 3.2 2.4 2.4-0.8 0.8-3.2-3.2 3.2-4 0.8 0.8zM9.6 4l-1.6 8.8h-1.6l1.6-8.8h1.6zM10.4 4.8l3.2 4-3.2 3.2-0.8-0.8 2.4-2.4-2.4-3.2 0.8-0.8z"></path>
+</svg>
+<svg id="icon-undo" width="16" height="16" viewBox="0 0 16 16" x="0" y="21">
+<path fill="#1296db" d="M12.161 16c1.777-3.219 2.076-8.13-4.904-7.966v3.966l-6-6 6-6v3.881c8.359-0.218 9.29 7.378 4.904 12.119z"></path>
+</svg>
+<svg id="icon-redo" width="16" height="16" viewBox="0 0 16 16" x="0" y="42">
+<path fill="#1296db" d="M9 3.881v-3.881l6 6-6 6v-3.966c-6.981-0.164-6.681 4.747-4.904 7.966-4.386-4.741-3.454-12.337 4.904-12.119z"></path>
+</svg>
+<svg id="icon-preview" width="16" height="16" viewBox="0 0 16 16" x="0" y="63">
+<path fill="#1296db" d="M11.566 10.552c1.261-1.733 1.095-4.134-0.425-5.645-0.827-0.827-1.922-1.275-3.089-1.275-1.166 0-2.261 0.456-3.089 1.275-0.811 0.827-1.269 1.922-1.269 3.086s0.456 2.259 1.277 3.086c0.827 0.827 1.922 1.275 3.089 1.275 0.922 0 1.805-0.291 2.561-0.85l2.269 2.259c0.127 0.127 0.292 0.197 0.473 0.197s0.347-0.070 0.473-0.197c0.259-0.259 0.259-0.684 0-0.945l-2.27-2.266zM5.916 10.134c-1.181-1.181-1.181-3.094 0-4.275 0.575-0.575 1.331-0.881 2.142-0.881s1.567 0.316 2.142 0.881c1.181 1.181 1.181 3.094 0 4.275-1.141 1.133-3.142 1.133-4.284 0z"></path>
+<path fill="#1296db" d="M11.431 1h-6.855c-1.969 0-3.577 1.598-3.577 3.575v6.85c0 1.969 1.6 3.575 3.577 3.575h3.719c0.37 0 0.67-0.298 0.67-0.669s-0.3-0.669-0.67-0.669h-3.719c-1.23 0-2.23-1-2.23-2.228v-6.852c0-1.228 1-2.228 2.23-2.228h6.855c1.23 0 2.23 1 2.23 2.228v3.645c0 0.37 0.3 0.669 0.67 0.669s0.67-0.298 0.67-0.669v-3.661c-0.002-1.969-1.602-3.567-3.57-3.567z"></path>
+</svg>
+<svg id="icon-print" width="16" height="16" viewBox="0 0 16 16" x="0" y="84">
+<path fill="#1296db" d="M4.98 14.938h5.967c0.548 0 0.975-0.461 0.975-1.011v-2.973h-7.922v2.973c0 0.55 0.431 1.011 0.98 1.011zM10.947 1.016h-5.967c-0.548 0-0.98 0.428-0.98 0.978v2.959h7.922v-2.959c0-0.55-0.427-0.978-0.975-0.978z"></path>
+<path fill="#1296db" d="M12.922 4.953v1.016h-9.922v-1.016h-1.003c-0.55 0-0.981 0.469-0.981 1.019v6.961c0 0.55 0.431 1.005 0.981 1.005h1.003v-3.984h9.922v3.984h1.008c0.548 0 1.008-0.455 1.008-1.005v-6.961c0-0.55-0.458-1.019-1.008-1.019h-1.008zM12.922 7.984h-2.969v-1.016h2.969v1.016z"></path>
+</svg>
+<svg id="icon-template" width="16" height="16" viewBox="0 0 16 16" x="0" y="105">
+<path fill="#1296db" d="M8.824 4.504h-8.504v8.536h8.504v-8.536zM6.632 10.84h-0.68v-3.056l-1.056 3.056h-0.608l-1.048-3.104v3.104h-0.68v-4.28h0.952l0.992 2.976c0.048 0.144 0.088 0.264 0.12 0.376 0.040-0.12 0.088-0.264 0.144-0.424l1-2.92h0.872v4.272zM14.88 2.84l-2.024-2.032c-0.44-0.44-1.312-0.808-1.936-0.808h-6.8c-0.624 0-1.136 0.512-1.136 1.136v2.296h0.904v-2.296c0-0.12 0.104-0.224 0.224-0.224h6.8c0.064 0 0.144 0.008 0.224 0.024v3.616h3.6c0.016 0.080 0.024 0.528 0.024 0.6v9.712c0 0.12-0.104 0.224-0.224 0.224h-10.432c-0.12 0-0.224-0.104-0.224-0.224v-0.76h-0.904v0.76c0 0.624 0.512 1.136 1.136 1.136h10.432c0.624 0 1.136-0.512 1.136-1.136v-9.712c0-0.624-0.36-1.872-0.8-2.312zM12.056 3.64v-2.328c0.064 0.040 0.112 0.088 0.16 0.136l2.024 2.032c0.048 0.048 0.088 0.096 0.136 0.16h-2.32zM9.864 9.6h3.72v-1.064h-3.72v1.064zM9.864 11.736h3.72v-1.064h-3.72v1.064zM13.584 6.4h-3.72v1.064h3.72v-1.064z"></path>
+</svg>
+<svg id="icon-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="126">
+<path fill="#1296db" d="M5.015 3.754l-0.708-0.585c-0.215-0.154-0.462-0.123-0.646 0.062l-3.569 4.492c-0.123 0.154-0.123 0.4 0 0.585l3.6 4.462c0.154 0.185 0.431 0.246 0.646 0.062l0.708-0.585c0.215-0.154 0.246-0.462 0.062-0.646l-2.892-3.6 2.923-3.6c0.123-0.185 0.092-0.462-0.123-0.646zM15.908 7.723l-3.6-4.462c-0.154-0.185-0.431-0.246-0.646-0.062l-0.708 0.585c-0.215 0.154-0.246 0.462-0.062 0.646l2.923 3.6-2.923 3.6c-0.154 0.185-0.123 0.492 0.062 0.646l0.708 0.585c0.215 0.154 0.462 0.123 0.646-0.062l3.6-4.492c0.123-0.215 0.123-0.431 0-0.585zM9.723 3.323l-0.923-0.215c-0.246-0.062-0.523 0.092-0.585 0.338l-2.277 8.738c-0.062 0.246 0.092 0.492 0.338 0.554l0.923 0.215c0.246 0.062 0.523-0.092 0.585-0.338l2.277-8.738c0.062-0.277-0.092-0.492-0.338-0.554z"></path>
+</svg>
+<svg id="icon-crop" width="16" height="16" viewBox="0 0 16 16" x="0" y="147">
+<path fill="#1296db" d="M13.585 0.288c1.548 1.972 0.581 3.752 0.581 3.752l-6.049 7.649s-4.161-4.761-5.855-7.12c-1.693-2.356 0.099-4.569 0.099-4.569l5.757 7.312 5.467-7.023zM8.074 10.223c0.469 0 0.846-0.378 0.846-0.842 0-0.224-0.090-0.439-0.249-0.597s-0.374-0.246-0.598-0.246c-0.467 0-0.848 0.377-0.848 0.842s0.381 0.842 0.848 0.842zM11.641 10.395c0.746-0.002 1.462 0.292 1.989 0.818s0.827 1.24 0.829 1.985c-0.002 0.746-0.3 1.459-0.829 1.985s-1.244 0.819-1.989 0.817c-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.3-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM11.641 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001zM4.575 10.395c0.746-0.002 1.461 0.292 1.989 0.818s0.826 1.24 0.829 1.985c-0.005 1.552-1.266 2.807-2.818 2.802-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.299-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM4.575 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001z"></path>
+</svg>
+<svg id="icon-copy" width="16" height="16" viewBox="0 0 16 16" x="0" y="168">
+<path fill="#1296db" d="M3 10h7v1h-7v-1z"></path>
+<path fill="#1296db" d="M3 8h7v1h-7v-1z"></path>
+<path fill="#1296db" d="M3 12h4v1h-4v-1z"></path>
+<path fill="#1296db" d="M14 0h-9c-1.1 0-2 0.9-2 2h1c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9c0 0.6-0.4 1-1 1v1c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2z"></path>
+<path fill="#1296db" d="M3 6h7v1h-7v-1z"></path>
+<path fill="#1296db" d="M11 3h-9c-1.1 0-2 0.9-2 2v9c0 1.1 0.9 2 2 2h9c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2zM12 14c0 0.6-0.4 1-1 1h-9c-0.6 0-1-0.4-1-1v-9c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9z"></path>
+</svg>
+<svg id="icon-paste" width="16" height="16" viewBox="0 0 16 16" x="0" y="189">
+<path fill="#1296db" d="M13.644 7h-5.288c-1.298 0-2.356 1.056-2.356 2.356v4.288c0 1.298 1.056 2.356 2.356 2.356h5.289c1.298 0 2.356-1.056 2.356-2.356v-4.289c-0.002-1.298-1.058-2.355-2.358-2.355zM15 13.644c0 0.747-0.608 1.356-1.356 1.356h-5.288c-0.747 0-1.356-0.608-1.356-1.356v-4.289c0-0.747 0.608-1.356 1.356-1.356h5.289c0.747 0 1.356 0.608 1.356 1.356v4.289h-0.002z"></path>
+<path fill="#1296db" d="M4.453 13h-2.434c-0.561 0-1.019-0.456-1.019-1.019v-9.963c0-0.561 0.456-1.019 1.019-1.019h8.962c0.561 0 1.019 0.456 1.019 1.019v3.497c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-3.497c0-1.112-0.906-2.019-2.019-2.019h-8.963c-1.112 0-2.019 0.905-2.019 2.019v9.962c0 1.113 0.906 2.019 2.019 2.019h2.434c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+<path fill="#1296db" d="M10.5 3h-8c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h8c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM5.5 6h-3c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h3c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM4.5 9h-2c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h2c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+</svg>
+<svg id="icon-paste-text" width="16" height="16" viewBox="0 0 16 16" x="0" y="210">
+<path fill="#1296db" d="M10.5 2h-2v-1c0-0.551-0.45-1-1-1h-2c-0.549 0-1 0.45-1 1v1h-2v2.278h7.999v-2.278zM7.5 2h-2v-0.998c0.001 0 0.001-0.001 0.002-0.001h1.996c0.001 0 0.001 0.001 0.002 0.001l-0.001 0.998zM8.17 9.529h1.972v3.834h1.005v-3.834h1.967v-1.005h-4.943z"></path>
+<path fill="#1296db" d="M12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.816h-0.012v1.928h-8.992v-1.743h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.651c0 0.275 0.225 0.5 0.5 0.5h4.772v1.347l9.727 0.001v-10.118h-3zM6.773 14.999v-8.118h7.726l0.003 8.117-7.729 0.001z"></path>
+</svg>
+<svg id="icon-paste-word" width="16" height="16" viewBox="0 0 16 16" x="0" y="231">
+<path fill="#1296db" d="M13.628 8.819v0.146c-0.195 0.017-0.34 0.154-0.437 0.413l-1.238 3.691h-0.17l-1.044-2.865h-0.024l-1.141 2.865h-0.17l-1.311-3.691c-0.081-0.259-0.227-0.396-0.437-0.413v-0.146h1.821v0.146c-0.275 0.017-0.405 0.105-0.389 0.267 0 0.081 0.016 0.154 0.049 0.219l0.59 1.788 0.718-1.799-0.046-0.257c-0.097-0.13-0.251-0.202-0.461-0.219v-0.146h1.942v0.146c-0.032 0.017-0.057 0.024-0.073 0.024-0.276 0-0.397 0.073-0.364 0.219 0 0.033 0.008 0.105 0.025 0.219 0.016 0.065 0.032 0.105 0.048 0.121l0.572 1.679 0.534-1.806c0.016-0.032 0.084-0.421-0.062-0.432-0.017-0.001-0.033-0.008-0.049-0.024v-0.146h1.117zM10.5 2h-2v-1c0-0.55-0.45-1-1-1h-2c-0.55 0-1 0.45-1 1v1h-2v2.278h8v-2.278zM7.5 2h-2v-0.998l0.002-0.002h1.997c0 0.001 0.002 0.001 0.002 0.002l-0 0.998zM12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.815h-0.011v1.928h-8.992v-1.744h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.652c0 0.275 0.225 0.5 0.5 0.5h4.773v1.348l9.727 0.001v-10.118h-3zM6.773 14.999v-8.117h7.727l0.003 8.117h-7.729z"></path>
+</svg>
+<svg id="icon-left-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="252">
+<path fill="#1296db" d="M1.148 0h13.704c0.624 0 1.123 0.499 1.123 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.679c-0.649-0.025-1.148-0.524-1.148-1.148 0-0.649 0.499-1.148 1.148-1.148zM1.148 4.568h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 9.136h13.704c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.704c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 13.704h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.649-0.025-1.148-0.524-1.148-1.173 0-0.624 0.499-1.123 1.148-1.123z"></path>
+</svg>
+<svg id="icon-center-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="273">
+<path fill="#1296db" d="M1.953 3.11q-0.407 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.281h11.719q0.406 0 0.688 0.281t0.281 0.688-0.281 0.696-0.688 0.289h-11.719zM11.719 5.063q0.406 0 0.688 0.282t0.281 0.688-0.281 0.696-0.688 0.289h-7.813q-0.406 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.282h7.813zM13.672 8.953q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-11.719q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h11.719zM11.719 12.86q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-7.813q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h7.813z"></path>
+</svg>
+<svg id="icon-right-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="294">
+<path fill="#1296db" d="M3.497 10.966c-0.249-0.002-0.529-0.062-0.737-0.19-0.382-0.234-0.488-0.667-0.349-1.095 0.142-0.437 0.484-0.671 1.071-0.672 3.574-0.006 7.149-0.006 10.723 0.005 0.236 0.001 0.5 0.070 0.701 0.19 0.374 0.222 0.5 0.672 0.371 1.090-0.132 0.428-0.468 0.674-0.974 0.676-1.822 0.006-3.643 0.002-5.465 0.002-1.78 0-3.561 0.008-5.341-0.008zM14.228 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.795-0 3.589-0.002 5.383 0.001zM9.344 6.983c-1.63 0-3.26 0.004-4.89-0.002-0.662-0.002-1.097-0.402-1.095-0.98 0.001-0.58 0.436-0.993 1.093-0.994 3.26-0.006 6.52-0.008 9.78 0.007 0.245 0.001 0.521 0.098 0.727 0.235 0.35 0.232 0.448 0.677 0.309 1.074-0.144 0.412-0.47 0.654-0.951 0.656-1.658 0.007-3.315 0.003-4.973 0.003v0.002zM14.279 13.022c0.627 0.003 1.053 0.418 1.049 0.983-0.004 0.563-0.437 0.98-1.058 0.981-3.287 0.005-5.935 0.007-9.222-0.008-0.231-0.001-0.492-0.098-0.685-0.23-0.343-0.234-0.441-0.681-0.305-1.078 0.137-0.4 0.477-0.646 0.958-0.648 1.657-0.007 2.675-0.003 4.332-0.003 1.644-0 3.287-0.006 4.931 0.002z"></path>
+</svg>
+<svg id="icon-both-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="315">
+<path fill="#1296db" d="M14.148 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 13.040c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 8.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.002 7.105-0.002 1.794-0 3.589-0.002 5.383 0.001zM14.148 4.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001z"></path>
+</svg>
+<svg id="icon-ol" width="16" height="16" viewBox="0 0 16 16" x="0" y="336">
+<path fill="#1296db" d="M7.111 1.778h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889z"></path>
+<path fill="#1296db" d="M15.111 4.711h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M15.111 9.511h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M15.111 14.222h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M2.578 0.533h-0.8l-1.689 0.889 0.267 0.889 1.244-0.711v3.733h-1.333v0.889h3.556v-0.889h-1.244z"></path>
+<path fill="#1296db" d="M2.222 13.956c0.178-0.178 0.444-0.444 0.622-0.622s0.356-0.356 0.444-0.533c0.089-0.178 0.178-0.356 0.267-0.533s0.089-0.356 0.089-0.622c0-0.267-0.089-0.622-0.178-0.8-0.089-0.267-0.267-0.356-0.356-0.533s-0.444-0.267-0.622-0.356c-0.178-0.089-0.444-0.089-0.711-0.089-0.356 0-0.711 0.089-0.978 0.178-0.267 0.178-0.622 0.356-0.8 0.622l0.444 0.622c0.178-0.178 0.356-0.267 0.533-0.444s0.444-0.178 0.622-0.178c0.178 0 0.356 0 0.444 0s0.267 0.089 0.267 0.267 0.178 0.178 0.178 0.356 0.089 0.267 0.089 0.356c0 0.178 0 0.267 0 0.444s-0.089 0.267-0.178 0.356-0.178 0.267-0.356 0.444-0.356 0.444-0.533 0.711l-1.511 1.244v0.889h3.733v-0.889h-2.4l0.889-0.889z"></path>
+</svg>
+<svg id="icon-ul" width="16" height="16" viewBox="0 0 16 16" x="0" y="357">
+<path fill="#1296db" d="M15.111 13.333h-8.889c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M6.222 2.667h8.889c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889z"></path>
+<path fill="#1296db" d="M15.111 7.111h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#1296db" d="M0 1.778c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#1296db" d="M0 8c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#1296db" d="M0 14.222c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+</svg>
+<svg id="icon-right-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="378">
+<path fill="#1296db" d="M0 1.882h17.488v-1.882h-17.488zM7.511 5.412h9.977v-1.883h-9.977zM7.511 8.941h9.977v-1.883h-9.977zM7.511 12.471h9.977v-1.883h-9.977zM0 16h17.488v-1.882h-17.488zM0 11.572v-6.627l4.418 3.314z"></path>
+</svg>
+<svg id="icon-left-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="399">
+<path fill="#1296db" d="M0 1.883h17.488v-1.883h-17.488v1.883zM7.511 5.412h9.977v-1.883h-9.977v1.883zM7.511 8.941h9.977v-1.883h-9.977v1.883zM7.511 12.471h9.977v-1.883h-9.977v1.883zM0 16h17.488v-1.883h-17.488v1.883zM4.418 11.572v-6.627l-4.418 3.314 4.418 3.313z"></path>
+</svg>
+<svg id="icon-down-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="420">
+<path fill="#1296db" d="M13.331 13.511v1.089h2.669v1.4h-4.001v-3.189l2.664-1.309v-1.089h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-up-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="441">
+<path fill="#1296db" d="M13.331 4.492v1.095h2.669v1.394h-4.001v-3.183l2.664-1.309v-1.095h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-clear-format" width="16" height="16" viewBox="0 0 16 16" x="0" y="462">
+<path fill="#1296db" d="M11.163 3.197l3.005-1.734 1.43 1.763-2.248 2.491zM8.877 2.251c0.879 0.108 5.156 5.318 5.046 5.904s-2.497 2.206-2.497 2.206l-5.417-6.229c-0 0 1.989-1.988 2.868-1.88zM5.491 4.897l5.23 6.088-3.209 4.173-7.247-9.178s1.436-0.060 2.633-0.374c0.783-0.206 2.593-0.709 2.593-0.709z"></path>
+</svg>
+<svg id="icon-selectall" width="16" height="16" viewBox="0 0 16 16" x="0" y="483">
+<path fill="#1296db" d="M7.272 8.96c-0.216 0-0.416-0.080-0.568-0.232l-3.136-3.144c-0.112-0.112-0.176-0.264-0.176-0.416 0-0.16 0.064-0.304 0.176-0.416s0.264-0.176 0.416-0.176c0.16 0 0.304 0.064 0.416 0.176l2.872 2.872 6.104-6.104c0.112-0.112 0.264-0.176 0.416-0.176 0.16 0 0.304 0.064 0.416 0.176 0.232 0.232 0.232 0.608 0 0.84l-6.368 6.368c-0.152 0.152-0.352 0.232-0.568 0.232z"></path>
+<path fill="#1296db" d="M2 12.76c-0.256 0-0.496-0.104-0.68-0.28-0.184-0.184-0.28-0.424-0.28-0.68v-9.776c0-0.256 0.104-0.496 0.28-0.68 0.184-0.184 0.424-0.28 0.68-0.28h6.776c0.328 0 0.592 0.264 0.592 0.592s-0.264 0.592-0.592 0.592h-6.552v9.328h8.92v-4.304c0-0.328 0.272-0.6 0.6-0.6s0.6 0.272 0.6 0.6v4.528c0 0.256-0.104 0.496-0.28 0.68-0.184 0.184-0.424 0.28-0.68 0.28h-9.384z"></path>
+<path fill="#1296db" d="M5 15.016c-0.328 0-0.592-0.264-0.592-0.592s0.264-0.592 0.592-0.592l8.808-0.008v-7.68c0-0.328 0.264-0.592 0.592-0.592 0.16 0 0.312 0.064 0.424 0.176s0.176 0.264 0.176 0.424l-0.008 8.008c0 0.472-0.384 0.848-0.856 0.848l-9.136 0.008z"></path>
+</svg>
+<svg id="icon-paiban" width="16" height="16" viewBox="0 0 16 16" x="0" y="504">
+<path fill="#1296db" d="M15.176 12.792l-5.48-4.8c-0.304-0.264-0.76-0.232-1.024 0.072l-1.552 1.776c-0.264 0.304-0.232 0.76 0.064 1.024l2.16 1.888 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.776 0.68 0.36-0.416 0.424-0.48c0.088-0.104 0.24-0.112 0.344-0.024l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.424 0.48-0.36 0.416 0.776 0.68 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.616 0.544c0.304 0.264 0.76 0.232 1.024-0.072l1.56-1.776c0.264-0.32 0.232-0.776-0.072-1.040zM9.76 9.944c-0.176 0.2-0.488 0.208-0.704 0.024s-0.248-0.496-0.072-0.696c0.176-0.2 0.488-0.208 0.704-0.024s0.248 0.496 0.072 0.696z"></path>
+<path fill="#1296db" d="M5.784 10.824h-2.928c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.552 0.552-0.552h3.096l0.944-1.112h-4.040c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.56 0.552-0.56h4.984l0.472-0.56c0.344-0.4 0.952-0.456 1.352-0.112l2.632 2.232v-6.016l-0.072-0.072v-0.008l-2.88-2.88h-7.784c-0.816 0-1.48 0.664-1.48 1.48v10.744c0 0.816 0.664 1.48 1.48 1.48h7.6l-3.144-2.664c-0.096-0.080-0.176-0.184-0.232-0.296zM2.856 3.040h3.704c0.304 0 0.552 0.248 0.552 0.552s-0.248 0.552-0.552 0.552h-3.704c-0.304 0-0.552-0.248-0.552-0.552 0-0.296 0.248-0.552 0.552-0.552zM2.856 5.264h6.664c0.304 0 0.552 0.248 0.552 0.56 0 0.304-0.248 0.552-0.552 0.552h-6.664c-0.304 0-0.552-0.248-0.552-0.552 0-0.312 0.248-0.56 0.552-0.56z"></path>
+</svg>
+<svg id="icon-full-screen" width="16" height="16" viewBox="0 0 16 16" x="0" y="525">
+<path fill="#1296db" d="M14.872 1.258c-0.094-0.094-0.219-0.145-0.352-0.145h-0.002l-4.502 0.017c-0.275 0.002-0.497 0.223-0.497 0.5 0.002 0.273 0.223 0.497 0.498 0.497h0.002l3.175-0.013-3.423 3.45c-0.194 0.194-0.192 0.511 0.003 0.705 0.097 0.097 0.223 0.145 0.35 0.145 0.128 0 0.256-0.050 0.353-0.148l3.545-3.572v3.22c0 0.275 0.222 0.498 0.498 0.498 0.275 0 0.498-0.222 0.498-0.498v-4.303c-0.002-0.133-0.055-0.259-0.148-0.353zM1.239 1.238c0.094-0.094 0.219-0.145 0.352-0.145h0.002l4.502 0.019c0.275 0.002 0.497 0.225 0.497 0.5-0.002 0.273-0.223 0.497-0.498 0.497h-0.002l-3.177-0.014 3.425 3.45c0.194 0.194 0.192 0.511-0.003 0.705-0.097 0.097-0.223 0.145-0.35 0.145-0.128 0-0.256-0.050-0.353-0.148l-3.545-3.572v3.22c0 0.275-0.222 0.498-0.498 0.498s-0.498-0.222-0.498-0.498v-4.303c0.002-0.131 0.055-0.259 0.148-0.353zM14.872 14.881c-0.094 0.094-0.219 0.145-0.352 0.145h-0.002l-4.502-0.017c-0.275-0.002-0.497-0.225-0.497-0.5 0.002-0.273 0.223-0.497 0.498-0.497h0.002l3.175 0.012-3.423-3.448c-0.194-0.194-0.192-0.511 0.003-0.705 0.097-0.097 0.223-0.145 0.35-0.145 0.128 0 0.256 0.050 0.353 0.148l3.545 3.57v-3.22c0-0.275 0.222-0.498 0.498-0.498 0.275 0 0.498 0.222 0.498 0.498v4.303c-0.002 0.133-0.055 0.259-0.148 0.353zM1.223 14.886c0.094 0.094 0.219 0.145 0.352 0.145h0.002l4.502-0.017c0.275-0.002 0.497-0.225 0.497-0.5-0.002-0.273-0.223-0.497-0.498-0.497h-0.002l-3.175 0.012 3.425-3.45c0.194-0.194 0.192-0.511-0.003-0.705-0.097-0.097-0.223-0.145-0.35-0.145-0.128 0-0.256 0.050-0.353 0.148l-3.547 3.572v-3.22c0-0.275-0.222-0.498-0.498-0.498s-0.498 0.222-0.498 0.498v4.303c0.002 0.133 0.055 0.259 0.148 0.353z"></path>
+</svg>
+<svg id="icon-title" width="16" height="16" viewBox="0 0 16 16" x="0" y="546">
+<path fill="#1296db" d="M1.815 2.089v4.803h1.332v-4.803h1.815v-1.089h-4.962v1.089h1.815zM6.443 1.966v-0.966h-1.205v0.966h1.205zM5.239 2.626v4.267h1.205v-4.267h-1.205zM8.594 2.626v-1.279h-1.205v1.279h-0.73v0.784h0.73v2.517c0 0.215 0.037 0.388 0.11 0.52s0.174 0.234 0.301 0.305c0.127 0.072 0.274 0.12 0.441 0.144s0.344 0.037 0.53 0.037c0.119 0 0.24-0.003 0.365-0.008s0.238-0.016 0.339-0.033v-0.908c-0.057 0.011-0.116 0.019-0.178 0.025s-0.127 0.008-0.195 0.008c-0.204 0-0.339-0.033-0.407-0.099s-0.102-0.198-0.102-0.396v-2.113h0.882v-0.784h-0.882zM9.761 1v5.893h1.205v-5.893h-1.205zM14.541 4.301h-1.96c0.006-0.083 0.024-0.176 0.055-0.281s0.085-0.204 0.161-0.297c0.076-0.094 0.178-0.172 0.305-0.235s0.287-0.095 0.479-0.095c0.294 0 0.513 0.077 0.657 0.231s0.245 0.38 0.301 0.677v0zM12.581 5.044h3.164c0.023-0.33-0.006-0.646-0.085-0.949s-0.208-0.572-0.386-0.809c-0.178-0.237-0.406-0.425-0.683-0.565s-0.602-0.21-0.976-0.21c-0.334 0-0.638 0.058-0.912 0.173s-0.51 0.274-0.708 0.475c-0.198 0.201-0.351 0.439-0.458 0.714s-0.161 0.572-0.161 0.891c0 0.33 0.052 0.633 0.157 0.908s0.253 0.512 0.445 0.71c0.192 0.198 0.427 0.351 0.704 0.458s0.588 0.161 0.933 0.161c0.498 0 0.922-0.11 1.272-0.33s0.611-0.586 0.78-1.098h-1.060c-0.040 0.132-0.147 0.257-0.322 0.376s-0.385 0.177-0.628 0.177c-0.339 0-0.599-0.085-0.78-0.256s-0.28-0.446-0.297-0.825zM0 9h16v1h-16v-1zM0 12h16v1h-16v-1zM0 15h12v1h-12v-1z"></path>
+</svg>
+<svg id="icon-font" width="16" height="16" viewBox="0 0 16 16" x="0" y="567">
+<path fill="#1296db" d="M0.32 1.436v3.661h0.448c0.149-0.971 0.523-1.793 1.195-2.316 0.374-0.374 1.046-0.598 2.017-0.598h1.046v10.386c0 0.672-0.075 1.121-0.149 1.27-0.075 0.224-0.224 0.374-0.448 0.448-0.224 0.149-0.598 0.224-0.971 0.224h-0.448v0.374h7.472v-0.374h-0.448c-0.448 0-0.747-0.075-0.971-0.224s-0.374-0.299-0.448-0.448-0.149-0.598-0.149-1.27v-10.386h1.046c0.672 0 1.121 0.075 1.42 0.149 0.448 0.224 0.822 0.523 1.121 0.897s0.523 0.971 0.747 1.793h0.374v-3.586h-12.851z"></path>
+<path fill="#1296db" d="M8.533 6.286v2.341h0.254c0.085-0.621 0.296-1.146 0.676-1.481 0.211-0.239 0.592-0.382 1.141-0.382h0.592v6.64c0 0.43-0.042 0.716-0.085 0.812-0.042 0.143-0.127 0.239-0.254 0.287-0.127 0.095-0.338 0.143-0.549 0.143h-0.254v0.239h4.225v-0.239h-0.253c-0.254 0-0.423-0.048-0.549-0.143s-0.211-0.191-0.254-0.287c-0.042-0.095-0.084-0.382-0.084-0.812v-6.64h0.592c0.38 0 0.634 0.048 0.803 0.096 0.255 0.145 0.467 0.338 0.63 0.567l0.004 0.006c0.169 0.239 0.296 0.621 0.423 1.146h0.211v-2.293h-7.268z"></path>
+</svg>
+<svg id="icon-fontsize" width="16" height="16" viewBox="0 0 16 16" x="0" y="588">
+<path fill="#1296db" d="M10.75 12.432l2.663 3.141 2.674-3.141z"></path>
+<path fill="#1296db" d="M2.979 7.234l1.53-4.933 1.534 4.933h-3.064zM5.888 0.408h-2.332l-3.489 11.051h1.617l0.825-2.63h4.042l0.839 2.63h2.025l-3.527-11.051z"></path>
+<path fill="#1296db" d="M9.553 8.899l0.888-2.357 0.888 2.357h-1.776zM11.238 5.444h-1.351l-1.085 2.927 0.47 1.475 0.007-0.021h2.342l0.487 1.522h1.171l-2.041-5.903z"></path>
+</svg>
+<svg id="icon-fontcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="609">
+<path fill="#1296db" d="M1.051 12.486v2.105h9.121l2.105-2.105h-11.226zM11.575 14.591h3.508v-3.508l-3.508 3.508z"></path>
+<path fill="#1296db" d="M12.338 12.135h-1.766l-1.437-3.369h-4.42l-1.423 3.369h-1.802l4.631-10.705h1.66l4.558 10.705zM8.565 7.275l-1.625-3.615-1.639 3.615h3.264z"></path>
+</svg>
+<svg id="icon-font-bgcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="630">
+<path fill="#1296db" d="M4.068 9.652c-0.151 0.146-0.226 0.351-0.226 0.614 0 0.231 0.082 0.42 0.246 0.566s0.38 0.219 0.649 0.219c0.374 0 0.683-0.132 0.926-0.395s0.364-0.594 0.364-0.991v-0.465l-1.136 0.154c-0.398 0.053-0.672 0.152-0.823 0.298zM12.953 1.452h-9.984c-1.103 0-1.997 0.894-1.997 1.997v8.985c0 1.103 0.894 1.997 1.997 1.997h9.984c1.103 0 1.997-0.894 1.997-1.997v-8.985c0-1.103-0.894-1.997-1.997-1.997zM6.879 11.635h-0.851v-0.75h-0.022c-0.336 0.576-0.832 0.864-1.487 0.864-0.471 0-0.845-0.127-1.123-0.382s-0.417-0.598-0.417-1.031c0-0.907 0.537-1.435 1.61-1.584l1.439-0.202c0-0.793-0.328-1.189-0.983-1.189-0.582 0-1.113 0.196-1.593 0.588v-0.829c0.483-0.301 1.040-0.452 1.672-0.452 1.17 0 1.755 0.614 1.755 1.843v3.124zM12.26 11.023c-0.402 0.484-0.938 0.726-1.608 0.726-0.632 0-1.113-0.266-1.443-0.799h-0.018v0.684h-0.86v-7.182h0.86v3.168h0.018c0.38-0.635 0.936-0.952 1.667-0.952 0.608 0 1.092 0.214 1.45 0.643s0.538 1.014 0.538 1.757c0 0.819-0.201 1.47-0.603 1.955zM10.638 7.38c-0.421 0-0.769 0.151-1.042 0.452s-0.41 0.684-0.41 1.15v0.658c0 0.392 0.127 0.723 0.382 0.994s0.573 0.406 0.956 0.406c0.456 0 0.813-0.175 1.071-0.526s0.386-0.836 0.386-1.457c0-0.512-0.12-0.919-0.36-1.222s-0.567-0.454-0.983-0.454z"></path>
+</svg>
+<svg id="icon-b" width="16" height="16" viewBox="0 0 16 16" x="0" y="651">
+<path fill="#1296db" d="M12.615 5.846c0-1.846-1.477-3.385-3.231-3.385h-5.077c-0.338 0-0.615 0.277-0.615 0.615v10.154c0 0.338 0.277 0.615 0.615 0.615h5.077c1.754 0 3.231-1.538 3.231-3.385 0-0.892-0.338-1.692-0.892-2.308 0.554-0.615 0.892-1.415 0.892-2.308zM9.385 11.692h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231zM9.385 7.077h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231z"></path>
+</svg>
+<svg id="icon-italic" width="16" height="16" viewBox="0 0 16 16" x="0" y="672">
+<path fill="#1296db" d="M11.692 3.785v-0.4c0-0.338-0.277-0.615-0.615-0.615h-4.308c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615 0.523 0 0.923 0.492 0.8 0.985l-1.108 5.415c-0.092 0.4-0.431 0.677-0.8 0.677h-0.738c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615h4.308c0.338 0 0.615-0.277 0.615-0.615v-0.615c0-0.338-0.277-0.615-0.615-0.615-0.523 0-0.923-0.492-0.8-0.985l1.108-5.415c0.092-0.4 0.431-0.677 0.8-0.677h0.523c0.462 0 0.831-0.369 0.831-0.831z"></path>
+</svg>
+<svg id="icon-underline" width="16" height="16" viewBox="0 0 16 16" x="0" y="693">
+<path fill="#1296db" d="M13.692 12.923h-11.385c-0.246 0-0.462 0.215-0.462 0.462v0.923c0 0.246 0.215 0.462 0.462 0.462h11.385c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462zM7.785 11.692c-2.308-0.123-4.092-2.123-4.092-4.431v-4.185c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.215c0 1.323 0.985 2.462 2.308 2.554 1.446 0.092 2.615-1.046 2.615-2.462v-4.308c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.308c0 2.462-2.062 4.431-4.523 4.308z"></path>
+</svg>
+<svg id="icon-strickout" width="16" height="16" viewBox="0 0 16 16" x="0" y="714">
+<path fill="#1296db" d="M3.723 5.569c-0.062-0.308-0.092-0.677-0.092-1.046 0-0.4 0.092-0.862 0.277-1.292 0.185-0.462 0.462-0.892 0.862-1.262 0.369-0.369 0.892-0.708 1.477-0.954 0.615-0.246 1.323-0.4 2.185-0.4 0.769 0 1.508 0.092 2.215 0.308 0.554 0.185 1.077 0.492 1.538 0.923 0.185 0.185 0.185 0.492-0.031 0.677l-0.831 0.769c-0.185 0.154-0.462 0.185-0.646 0-0.215-0.215-0.462-0.4-0.738-0.554-0.431-0.215-0.923-0.338-1.508-0.338-0.523 0-0.985 0.062-1.323 0.215s-0.646 0.308-0.862 0.554-0.369 0.462-0.462 0.708-0.123 0.492-0.123 0.677c0 0.338 0.062 0.615 0.154 0.862 0.092 0.215-0.062 0.431-0.277 0.431h-1.508c-0.154 0-0.277-0.154-0.308-0.277zM12.277 10.154h-1.538c-0.215 0-0.369 0.215-0.277 0.4s0.123 0.431 0.123 0.677c0 0.369-0.092 0.708-0.246 1.015-0.185 0.308-0.4 0.523-0.677 0.738-0.277 0.185-0.585 0.338-0.923 0.431s-0.646 0.154-0.985 0.154c-0.585 0-1.138-0.123-1.662-0.369-0.4-0.185-0.738-0.431-1.046-0.769-0.154-0.185-0.462-0.215-0.646-0.062l-0.862 0.738c-0.185 0.154-0.215 0.462-0.031 0.646 0.431 0.492 0.985 0.862 1.631 1.108 0.8 0.308 1.662 0.462 2.585 0.462 0.677 0 1.323-0.092 1.908-0.308 0.585-0.185 1.108-0.492 1.569-0.862 0.431-0.369 0.8-0.831 1.046-1.385s0.4-1.138 0.4-1.815c0-0.246 0-0.4-0.031-0.615-0.062-0.062-0.185-0.185-0.338-0.185zM15.354 7.354c-0.062-0.185-0.246-0.277-0.431-0.277h-13.846c-0.215 0-0.369 0.092-0.431 0.277-0.031 0.062-0.031 0.092-0.031 0.154v0.923c0 0.246 0.215 0.492 0.462 0.492h13.846c0.246 0 0.462-0.246 0.462-0.492v-0.923c0-0.062 0-0.092-0.031-0.154z"></path>
+</svg>
+<svg id="icon-line-height" width="16" height="16" viewBox="0 0 16 16" x="0" y="735">
+<path fill="#1296db" d="M2.499 11.902v-7.682c-0.166 0-0.326 0.009-0.485-0.002-0.265-0.019-0.339-0.2-0.178-0.467 0.254-0.423 0.52-0.837 0.79-1.245 0.145-0.219 0.377-0.212 0.522 0.009 0.262 0.398 0.521 0.801 0.767 1.214 0.055 0.093 0.087 0.254 0.063 0.359-0.016 0.067-0.153 0.115-0.239 0.126-0.153 0.020-0.308 0.006-0.469 0.006v7.672c0.15 0 0.298-0.017 0.444 0.006 0.097 0.015 0.246 0.062 0.266 0.138 0.027 0.104-0.021 0.274-0.080 0.375-0.236 0.397-0.486 0.781-0.737 1.164-0.17 0.26-0.396 0.258-0.566-0.005-0.25-0.384-0.492-0.775-0.737-1.163-0.022-0.035-0.044-0.075-0.061-0.118l-0.002-0.005c-0.088-0.217-0.034-0.357 0.161-0.375 0.176-0.016 0.353-0.003 0.543-0.003z"></path>
+<path fill="#1296db" d="M14.841 0v1.166h-13.69v-1.166zM14.849 14.834v1.166h-13.69v-1.166zM10.056 2.956l4.172 10.602h-1.321l-1.129-2.97h-4.871l-1.128 2.97h-1.307l4.173-10.602zM11.392 9.563l-2.004-5.3h-0.059l-2.034 5.3z"></path>
+</svg>
+<svg id="icon-clear-html" width="16" height="16" viewBox="0 0 16 16" x="0" y="756">
+<path fill="#1296db" d="M10.175 3.11c-0.106-0.106-0.279-0.106-0.385 0l-8.625 8.625c-0.106 0.106-0.106 0.279 0 0.385l1.678 1.678c0.106 0.106 0.315 0.192 0.464 0.192h5.374c0.15 0 0.358-0.087 0.464-0.192l5.666-5.666c0.106-0.106 0.106-0.279 0-0.385l-4.636-4.636zM8.612 12.774c-0.106 0.106-0.315 0.192-0.464 0.192h-4.161c-0.15 0-0.358-0.087-0.464-0.192l-0.791-0.791c-0.106-0.106-0.106-0.279 0-0.385l3.162-3.162c0.106-0.106 0.279-0.106 0.385 0l3.143 3.143c0.106 0.106 0.106 0.279 0 0.385l-0.81 0.81z"></path>
+</svg>
+<svg id="icon-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="777">
+<path fill="#1296db" d="M15.385 3.077c0-0.677-0.554-1.231-1.231-1.231h-12.308c-0.677 0-1.231 0.554-1.231 1.231v9.846c0 0.677 0.554 1.231 1.231 1.231h12.308c0.677 0 1.231-0.554 1.231-1.231v-9.846zM12.185 11.692h-8.923c-0.369 0-0.585-0.4-0.4-0.708l2.708-4.708c0.123-0.215 0.4-0.215 0.523 0l1.631 2.8c0.123 0.185 0.4 0.215 0.523 0.031l1.323-1.908c0.123-0.185 0.4-0.185 0.523 0l2.431 3.877c0.185 0.277 0 0.615-0.338 0.615zM11.385 6.154c-0.677 0-1.231-0.554-1.231-1.231s0.554-1.231 1.231-1.231 1.231 0.554 1.231 1.231-0.554 1.231-1.231 1.231z"></path>
+</svg>
+<svg id="icon-multiple-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="798">
+<path fill="#1296db" d="M13 1v12.033h-12v-12.033h12zM13 0h-12c-0.567 0-1 0.433-1 1v12.033c0 0.567 0.433 1 1 1h12.033c0.567 0 1-0.433 1-1v-12.033c-0.033-0.567-0.467-1-1.033-1z"></path>
+<path fill="#1296db" d="M13 12.267c0.567-0.6 0.8-2.3 0.8-3.1 0-2.033-1.6-3.7-3.633-3.7-1.433 0-2.633 0.8-3.233 1.967-0.667 1.033-1.8 1.7-3.1 1.7-1.367 0-2.533-0.733-3.2-1.833-0.333 0.567-0.5 1.2-0.5 1.867 0 0.733 0.2 2.333 0.567 2.9v1.133h1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h2.1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h0.7v-0.933z"></path>
+<path fill="#1296db" d="M2.767 4.233c0 0 0 0 0 0 0 0.7 0.567 1.267 1.267 1.267s1.267-0.567 1.267-1.267c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.7-0.567-1.267-1.267-1.267s-1.267 0.567-1.267 1.267c0 0 0 0 0 0v0z"></path>
+<path fill="#1296db" d="M15.633 16h-9c-0.267 0-0.5-0.233-0.5-0.5s0.233-0.5 0.5-0.5h8.5v-8.5c0-0.267 0.233-0.5 0.5-0.5s0.5 0.233 0.5 0.5v9c0 0.267-0.233 0.5-0.5 0.5z"></path>
+</svg>
+<svg id="icon-graft" width="17" height="16" viewBox="0 0 17 16" x="0" y="819">
+<path fill="#1296db" d="M16.407 3.584c0.106-0.333 0.388-1.214-0.194-1.628-0.171-0.118-0.382-0.188-0.61-0.188-0.013 0-0.026 0-0.039 0.001l0.002-0c-0.449 0-1.133 0.267-1.914 0.713-0.030-0.060-0.067-0.112-0.111-0.157l0 0c-1.435-1.432-3.417-2.318-5.605-2.318-4.379 0-7.93 3.548-7.935 7.926v0c-0 0.009-0 0.020-0 0.031 0 2.264 0.957 4.305 2.489 5.739l0.004 0.004c0.107 0.101 0.251 0.163 0.41 0.163 0.001 0 0.001 0 0.002 0h0.044c-0.291 0.29-0.604 0.557-0.938 0.8l-0.023 0.016c-0.155 0.11-0.255 0.289-0.255 0.491 0 0.279 0.19 0.513 0.448 0.581l0.004 0.001c0.631 0.152 1.356 0.239 2.102 0.239 0.004 0 0.008 0 0.011 0h-0.001c1.236 0 2.256-0.259 3.042-0.777v0.047c0 0.332 0.269 0.601 0.601 0.601v0c4.38-0.005 7.929-3.555 7.935-7.934v-0c0-0.008 0.001-0.018 0.001-0.028 0-0.332-0.269-0.601-0.601-0.601s-0.601 0.269-0.601 0.601c0 0.010 0 0.020 0.001 0.029l-0-0.001c-0.005 3.687-2.969 6.679-6.644 6.731l-0.005 0c0.617-0.614 0.933-1.306 0.906-1.993-0.017-0.336-0.114-0.646-0.272-0.916l0.005 0.009c0.166 0.056 0.358 0.088 0.557 0.088 0.004 0 0.007-0 0.011-0h-0.001c2.749-0.001 6.495-6.143 7.175-8.27zM4.521 13.81c0.268-0.47 1.21-1.992 2.168-1.992 0.209 0.006 0.402 0.071 0.563 0.18l-0.004-0.002c0.265 0.15 0.447 0.419 0.476 0.732l0 0.004c0.021 0.427-0.3 0.928-0.881 1.375s-1.457 0.695-2.549 0.695c-0.181 0-0.369-0.006-0.56-0.021 0.298-0.283 0.558-0.602 0.774-0.952l0.012-0.020zM8.754 9.025c1.072-2.589 5.206-5.632 6.574-6.016-0.129 0.493-0.567 1.583-1.553 3.158-1.643 2.599-3.549 4.486-4.55 4.486-0.003 0-0.007 0-0.010 0-0.167 0-0.317-0.071-0.422-0.185l-0-0c-0.299-0.299-0.312-0.786-0.039-1.443zM1.2 7.933c0-0.002 0-0.004 0-0.006 0-3.717 3.014-6.731 6.731-6.731 1.835 0 3.499 0.734 4.713 1.925l-0.001-0.001c-1.977 1.364-4.207 3.536-4.998 5.444-0.422 1.019-0.327 1.744-0.071 2.246-0.26-0.121-0.564-0.192-0.885-0.193h-0c-1.486 0-2.63 1.588-3.193 2.559-0.021-0.136-0.086-0.254-0.18-0.343l-0-0c-1.303-1.221-2.115-2.952-2.115-4.874 0-0.009 0-0.019 0-0.028v0.001z"></path>
+<path fill="#1296db" d="M8.931 4.704c0.858 0 1.553-0.695 1.553-1.553s-0.695-1.553-1.553-1.553c-0.858 0-1.553 0.695-1.553 1.553v0c0 0.858 0.695 1.553 1.553 1.553v0zM8.931 3.504c-0.194 0-0.352-0.158-0.352-0.352s0.158-0.352 0.352-0.352c0.194 0 0.352 0.158 0.352 0.352v0c0 0.194-0.158 0.352-0.352 0.352v0zM5.394 9.012c0-0.858-0.695-1.553-1.553-1.553s-1.553 0.695-1.553 1.553c0 0.858 0.695 1.553 1.553 1.553v0c0.858 0 1.553-0.695 1.553-1.553v0zM3.841 8.659c0.002-0 0.004-0 0.006-0 0.194 0 0.352 0.158 0.352 0.352s-0.158 0.352-0.352 0.352c-0.194 0-0.352-0.158-0.352-0.352v0c0-0 0-0 0-0 0-0.193 0.155-0.349 0.347-0.352h0zM4.977 7.069c1.144 0 2.071-0.927 2.071-2.071s-0.927-2.071-2.071-2.071c-1.144 0-2.071 0.927-2.071 2.071v0c0 1.144 0.927 2.071 2.071 2.071v0zM4.977 4.123c0.482 0 0.872 0.391 0.872 0.872s-0.391 0.872-0.872 0.872c-0.482 0-0.872-0.391-0.872-0.872v0c0.001-0.481 0.391-0.87 0.872-0.871h0z"></path>
+</svg>
+<svg id="icon-flash" width="16" height="16" viewBox="0 0 16 16" x="0" y="840">
+<path fill="#1296db" d="M8 0.889c-3.911 0-7.111 3.2-7.111 7.111s3.2 7.111 7.111 7.111 7.111-3.2 7.111-7.111-3.2-7.111-7.111-7.111zM11.556 5.956c-1.244-0.089-1.956 1.244-1.956 1.244l1.422 0.089v1.6h-2.044c-1.067 3.911-3.644 3.2-3.644 3.2v-1.333s1.511 0 2.311-2.756c1.156-4.356 3.911-3.467 3.911-3.467v1.422z"></path>
+</svg>
+<svg id="icon-vedio" width="16" height="16" viewBox="0 0 16 16" x="0" y="861">
+<path fill="#1296db" d="M15.385 0.615h-0.615v1.231h-1.846v-1.231h-9.846v1.231h-1.846v-1.231h-0.615c-0.339 0-0.615 0.276-0.615 0.615v13.538c0 0.339 0.276 0.615 0.615 0.615h0.615v-0.615h1.846v0.615h9.846v-0.615h1.846v0.615h0.615c0.339 0 0.615-0.276 0.615-0.615v-13.538c0-0.339-0.276-0.615-0.615-0.615zM3.077 12.923h-1.846v-1.846h1.846v1.846zM3.077 9.231h-1.846v-1.846h1.846v1.846zM3.077 5.538h-1.846v-1.846h1.846v1.846zM10.823 8.404l-4.002 2.334c-0.065 0.033-0.137 0.048-0.207 0.048-0.085 0-0.167-0.023-0.242-0.067-0.135-0.082-0.218-0.228-0.218-0.385v-4.668c0-0.157 0.082-0.303 0.218-0.385 0.137-0.082 0.307-0.090 0.449-0.018l4.002 2.334c0.156 0.077 0.254 0.233 0.254 0.404s-0.098 0.327-0.254 0.404zM14.769 12.923h-1.846v-1.846h1.846v1.846zM14.769 9.231h-1.846v-1.846h1.846v1.846zM14.769 5.538h-1.846v-1.846h1.846v1.846z"></path>
+</svg>
+<svg id="icon-attach" width="16" height="16" viewBox="0 0 16 16" x="0" y="882">
+<path fill="#1296db" d="M5.415 11.292c0.185 0.185 0.462 0.154 0.646 0l3.077-3.077c0.215-0.215 0.585-0.246 0.862 0s0.246 0.677 0 0.923l-3.785 3.723c-0.831 0.831-2.215 0.831-3.046 0l-0.031-0.031c-0.831-0.831-0.831-2.215 0-3.046l6.677-6.677c0.831-0.831 2.215-0.831 3.046 0l0.031 0.031c0.831 0.831 0.831 2.215 0 3.046l-0.031 0.031c-0.154 0.154-0.185 0.369-0.062 0.554 0.185 0.338 0.338 0.708 0.431 1.077 0.062 0.246 0.338 0.308 0.523 0.154 0.246-0.246 0.462-0.492 0.462-0.492 1.569-1.569 1.569-4.123 0-5.692h-0.062c-1.569-1.569-4.123-1.569-5.692 0l-6.677 6.646c-1.569 1.569-1.569 4.123 0 5.692l0.062 0.062c1.569 1.569 4.092 1.569 5.662 0l3.815-3.785c0.985-0.985 0.954-2.585-0.062-3.569-0.985-0.954-2.585-0.892-3.538 0.092l-3.015 3.015c-0.185 0.185-0.185 0.492 0 0.677l0.708 0.646z"></path>
+</svg>
+<svg id="icon-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="903">
+<path fill="#1296db" d="M17.846 0h-17.231c-0.49 0-0.615 0.129-0.615 0.615v14.769c0 0.486 0.125 0.615 0.615 0.615h17.231c0.49 0 0.615-0.129 0.615-0.615v-14.769c0-0.486-0.125-0.615-0.615-0.615zM5.538 14.769l-4.328 0.051v-3.108l4.328-0.020v3.077zM5.538 10.462h-4.308v-3.077h4.308v3.077zM5.538 6.154h-4.308v-2.462h4.308v2.462zM11.692 14.769h-4.923v-3.077h4.923v3.077zM11.692 10.462h-4.923v-3.077h4.923v3.077zM11.692 6.154h-4.923v-2.462h4.923v2.462zM17.231 14.769h-4.308v-3.077h4.308v3.077zM17.231 10.462h-4.308v-3.077h4.308v3.077zM17.231 6.154h-4.308v-2.462h4.308v2.462z"></path>
+</svg>
+<svg id="icon-split" width="16" height="16" viewBox="0 0 16 16" x="0" y="924">
+<path fill="#1296db" d="M14.222 12.412l-1.811 1.811h-1.022l2.833-2.833v1.022zM14.222 13.742v0.48h-0.48l0.48-0.48zM14.222 10.059l-4.164 4.164h-1.022l4.444-4.444h0.741v0.281zM12.15 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM9.796 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM7.444 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM5.091 9.778l-3.313 3.313v-1.012l2.3-2.3h1.013zM2.748 9.778l-0.97 0.97v-0.97h0.97zM14.222 3.078l-2.255 2.255h-1.022l3.277-3.277v1.022zM14.222 4.409v0.924h-0.924l0.924-0.924zM13.17 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM10.817 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM8.462 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM6.11 1.778l-3.556 3.556h-0.777v-0.244l3.311-3.311h1.022zM3.757 1.778l-1.98 1.98v-1.012l0.967-0.967h1.013zM0 7.111h16v0.889h-16v-0.889z"></path>
+</svg>
+<svg id="icon-face" width="16" height="16" viewBox="0 0 16 16" x="0" y="945">
+<path fill="#1296db" d="M8 16c-4.417 0-8-3.58-8-7.993s3.583-8.007 8-8.007 8 3.594 8 8.007c0 4.413-3.583 7.993-8 7.993zM8 1c-3.865 0-7 3.145-7 7.006s3.135 6.994 7 6.994 7-3.132 7-6.994c0-3.861-3.135-7.006-7-7.006zM8 13c-2.419 0-4.436-1.718-4.899-4h1.041c0.446 1.722 1.997 3 3.859 3s3.412-1.278 3.858-3h1.041c-0.463 2.282-2.48 4-4.899 4zM11 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1zM5 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1z"></path>
+</svg>
+<svg id="icon-split-page" width="16" height="16" viewBox="0 0 16 16" x="0" y="966">
+<path fill="#1296db" d="M14.25 1v4h-12.5v-4h1.042v3h10.417v-3zM1.75 15v-4h12.5v4h-1.041v-3h-10.417v3zM1 7h14v2h-14z"></path>
+</svg>
+<svg id="icon-anchor" width="16" height="16" viewBox="0 0 16 16" x="0" y="987">
+<path fill="#1296db" d="M15.297 9.614l-1.117-1.117c-0.075-0.075-0.174-0.116-0.28-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l0.442-0.442c-0.107 1.281-0.667 2.486-1.579 3.399-0.925 0.925-2.149 1.487-3.45 1.583l-0-7.611 3.106-0c0.218 0 0.396-0.178 0.396-0.396s-0.178-0.396-0.396-0.396h-3.106v-4.407l2.781 2.781c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-3.434-3.434c-0.083-0.083-0.198-0.125-0.316-0.114-0.109-0.003-0.214 0.038-0.291 0.116l-3.434 3.434c-0.154 0.154-0.154 0.406 0 0.56 0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l2.781-2.781v4.405h-3.106c-0.218 0-0.396 0.178-0.396 0.396s0.178 0.396 0.396 0.396l3.106-0v7.613c-1.311-0.091-2.546-0.653-3.478-1.585-0.92-0.92-1.481-2.137-1.582-3.43l0.444 0.444c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-1.117-1.117c-0.075-0.075-0.174-0.116-0.279-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28 0.174 0.116 0.28 0.116c0.106 0 0.205-0.041 0.28-0.116l0.475-0.475c0.047 0.697 0.208 1.376 0.48 2.018 0.316 0.748 0.769 1.42 1.346 1.997s1.249 1.030 1.997 1.346c0.775 0.328 1.598 0.494 2.446 0.494s1.671-0.166 2.446-0.494c0.748-0.316 1.42-0.769 1.997-1.346s1.030-1.249 1.346-1.997c0.275-0.651 0.437-1.338 0.481-2.045l0.474 0.474c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116 0.116-0.174 0.116-0.28c0-0.106-0.041-0.205-0.116-0.28z"></path>
+</svg>
+<svg id="icon-link" width="16" height="16" viewBox="0 0 16 16" x="0" y="1008">
+<path fill="#1296db" d="M8.369 12.831l-0.646-0.092s-0.431-0.092-0.646-0.185c-0.123-0.031-0.277 0-0.369 0.092l-0.154 0.154c-0.892 0.892-2.338 0.985-3.262 0.185-1.046-0.892-1.077-2.492-0.123-3.446l2.338-2.338c0.308-0.308 0.677-0.492 1.046-0.615 0.492-0.123 1.015-0.092 1.477 0.092 0.277 0.123 0.554 0.277 0.8 0.523 0.123 0.123 0.215 0.246 0.308 0.4 0.123 0.215 0.4 0.246 0.554 0.062l0.862-0.862c0.123-0.123 0.123-0.308 0.031-0.462-0.123-0.185-0.277-0.338-0.431-0.492-0.215-0.215-0.462-0.431-0.738-0.585-0.431-0.277-0.923-0.462-1.446-0.554-0.954-0.185-2-0.031-2.862 0.431-0.338 0.185-0.677 0.431-0.954 0.708l-2.246 2.246c-1.631 1.631-1.754 4.277-0.185 5.938 1.631 1.785 4.4 1.815 6.092 0.123l0.769-0.769c0.215-0.154 0.062-0.523-0.215-0.554zM14.031 1.785c-1.692-1.569-4.338-1.446-5.938 0.185l-0.708 0.677c-0.215 0.215-0.062 0.585 0.215 0.615 0.431 0.031 0.862 0.123 1.292 0.246 0.123 0.031 0.277 0 0.369-0.092l0.154-0.154c0.892-0.892 2.338-0.985 3.262-0.185 1.046 0.892 1.077 2.492 0.123 3.446l-2.338 2.338c-0.308 0.308-0.677 0.492-1.046 0.615-0.492 0.123-1.015 0.092-1.477-0.092-0.277-0.123-0.554-0.277-0.8-0.523-0.123-0.123-0.215-0.246-0.308-0.4-0.123-0.215-0.4-0.246-0.554-0.062l-0.862 0.862c-0.123 0.123-0.123 0.308-0.031 0.462 0.123 0.185 0.277 0.338 0.431 0.492 0.215 0.215 0.492 0.431 0.738 0.585 0.431 0.277 0.923 0.462 1.415 0.554 0.954 0.185 2 0.031 2.862-0.431 0.338-0.185 0.677-0.431 0.954-0.708l2.338-2.338c1.723-1.692 1.662-4.462-0.092-6.092z"></path>
+</svg>
+<svg id="icon-unlink" width="16" height="16" viewBox="0 0 16 16" x="0" y="1029">
+<path fill="#1296db" d="M7.385 11.262c-0.185 0-0.369-0.031-0.554-0.092-0.185-0.031-0.4-0.092-0.585-0.154-0.123-0.031-0.246 0-0.308 0.062l-0.123 0.123c-0.769 0.769-2.031 0.862-2.862 0.154-0.892-0.8-0.954-2.185-0.092-3.015l2.031-2.031c0.277-0.277 0.585-0.431 0.923-0.523 0.431-0.123 0.892-0.092 1.292 0.092 0.246 0.092 0.492 0.246 0.677 0.462 0.092 0.092 0.185 0.215 0.277 0.369 0.092 0.185 0.338 0.215 0.492 0.062l0.769-0.769c0.123-0.123 0.123-0.277 0.031-0.4-0.123-0.154-0.246-0.277-0.369-0.431-0.185-0.185-0.431-0.369-0.646-0.523-0.4-0.246-0.8-0.4-1.262-0.492-0.831-0.154-1.723-0.031-2.523 0.4-0.308 0.154-0.585 0.369-0.831 0.615l-1.969 1.969c-1.415 1.415-1.538 3.723-0.154 5.2 1.446 1.538 3.877 1.6 5.354 0.092l0.677-0.677c0.154-0.154 0.031-0.462-0.246-0.492zM12.462 6.923c1.477-1.477 1.446-3.908-0.092-5.354-1.477-1.354-3.785-1.262-5.2 0.154l-0.615 0.615c-0.185 0.185-0.062 0.492 0.185 0.523 0.369 0.031 0.769 0.092 1.138 0.215 0.123 0.031 0.246 0 0.308-0.062l0.123-0.123c0.769-0.769 2.031-0.862 2.862-0.154 0.892 0.8 0.954 2.185 0.092 3.015l-2.031 2.031c-0.277 0.277-0.585 0.431-0.923 0.523-0.431 0.123-0.892 0.092-1.292-0.092-0.246-0.092-0.492-0.246-0.677-0.462-0.092-0.092-0.185-0.215-0.246-0.338-0.092-0.185-0.338-0.215-0.492-0.062l-0.738 0.738c-0.123 0.123-0.123 0.277-0.031 0.4 0.123 0.154 0.215 0.277 0.369 0.431 0.215 0.215 0.431 0.369 0.646 0.523 0.4 0.246 0.8 0.4 1.262 0.492 0.831 0.154 1.723 0.031 2.523-0.4 0.308-0.154 0.585-0.369 0.831-0.615l2-2zM13.877 12.615l1.415-1.415c0.123-0.123 0.123-0.308 0-0.431l-0.862-0.862c-0.123-0.123-0.308-0.123-0.431 0l-1.385 1.446-1.323-1.323c-0.123-0.123-0.308-0.123-0.431 0l-0.862 0.862c-0.123 0.123-0.123 0.308 0 0.431l1.323 1.323-1.292 1.292c-0.123 0.123-0.123 0.308 0 0.431l0.862 0.862c0.123 0.123 0.308 0.123 0.431 0l1.292-1.292 1.385 1.385c0.123 0.123 0.308 0.123 0.431 0l0.862-0.862c0.123-0.123 0.123-0.308 0-0.431l-1.415-1.415z"></path>
+</svg>
+<svg id="icon-baidu-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1050">
+<path fill="#1296db" d="M9.473 10.846c0.725-0.156 0.626-1.022 0.605-1.211-0.035-0.292-0.379-0.802-0.845-0.762-0.587 0.053-0.672 0.9-0.672 0.9-0.080 0.392 0.189 1.229 0.913 1.073zM10.243 12.353c-0.021 0.061-0.069 0.217-0.027 0.352 0.081 0.305 0.345 0.318 0.345 0.318h0.379v-0.928h-0.407c-0.183 0.055-0.271 0.197-0.291 0.258zM10.819 9.393c0.401 0 0.724-0.461 0.724-1.031s-0.323-1.030-0.724-1.030c-0.399 0-0.724 0.461-0.724 1.030s0.324 1.031 0.724 1.031zM12.543 9.461c0.535 0.069 0.879-0.501 0.947-0.935 0.070-0.432-0.275-0.935-0.654-1.021-0.379-0.087-0.853 0.521-0.897 0.917-0.052 0.485 0.069 0.969 0.603 1.038zM13.854 12.006s-0.828-0.641-1.311-1.333c-0.655-1.021-1.586-0.605-1.897-0.086-0.31 0.519-0.793 0.847-0.861 0.935-0.069 0.085-1 0.588-0.793 1.505s0.932 0.899 0.932 0.899 0.535 0.053 1.155-0.086c0.621-0.137 1.155 0.035 1.155 0.035s1.449 0.485 1.846-0.449c0.396-0.935-0.224-1.42-0.224-1.42zM11.374 13.397h-0.942c-0.407-0.081-0.569-0.359-0.589-0.406s-0.135-0.271-0.075-0.651c0.176-0.569 0.677-0.61 0.677-0.61h0.501v-0.617l0.427 0.007v2.277zM13.129 13.39h-1.084c-0.42-0.108-0.44-0.407-0.44-0.407v-1.199l0.44-0.007v1.078c0.027 0.115 0.169 0.136 0.169 0.136h0.447v-1.206h0.468v1.605zM14.664 10.189c0-0.207-0.172-0.831-0.81-0.831s-0.725 0.589-0.725 1.005c0 0.397 0.033 0.951 0.827 0.933s0.707-0.899 0.707-1.107zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l0.052-0.111c-0.201-0.083-0.385-0.213-0.533-0.393-0.345-0.423-0.433-0.979-0.368-1.358 0.062-0.522 0.394-1.388 1.275-1.467 0.032-0.003 0.069-0.005 0.106-0.005 0.001 0 0.002 0 0.003 0h-0c0.051 0 0.1 0.003 0.149 0.009 0.061-0.878 0.647-1.546 1.386-1.546 0.072 0 0.14 0.015 0.208 0.027l0.092-0.195c0.143-0.304 0.215-0.692 0.215-1.165 0-0.92-0.325-1.706-0.977-2.357s-1.437-0.977-2.357-0.977-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM8.734 14h-7.401l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h5.811c0.083 0.274 0.202 0.494 0.344 0.667z"></path>
+</svg>
+<svg id="icon-google-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1071">
+<path fill="#1296db" d="M10.813 8.519c0 0.622 0.208 1.071 0.618 1.335 0.335 0.216 0.725 0.249 0.927 0.249 0.049 0 0.089-0.002 0.116-0.004 0 0-0.064 0.418 0.246 0.832h-0.014c-0.537 0-2.289 0.112-2.289 1.553 0 1.465 1.609 1.54 1.932 1.54 0.025 0 0.040-0.001 0.040-0.001 0.003 0 0.027 0.001 0.066 0.001 0.207 0 0.743-0.026 1.24-0.268 0.645-0.313 0.972-0.858 0.972-1.619 0-0.735-0.499-1.173-0.863-1.493-0.222-0.195-0.414-0.363-0.414-0.527 0-0.167 0.14-0.292 0.317-0.451 0.287-0.257 0.557-0.622 0.557-1.313 0-0.607-0.079-1.015-0.564-1.273 0.051-0.026 0.229-0.045 0.318-0.057 0.263-0.036 0.647-0.077 0.647-0.291v-0.041h-1.916c-0.019-0.001-1.937 0.071-1.937 1.827zM13.906 12.274c0.037 0.586-0.465 1.019-1.217 1.073-0.765 0.056-1.394-0.288-1.431-0.873-0.018-0.281 0.106-0.557 0.348-0.777 0.245-0.223 0.583-0.359 0.949-0.387 0.043-0.003 0.086-0.005 0.129-0.005 0.707 0 1.187 0.416 1.221 0.968zM13.405 8.118c0.188 0.661-0.096 1.353-0.548 1.48-0.048 0.014-0.103 0.022-0.16 0.022-0 0-0 0-0 0h0c-0.415 0-0.825-0.419-0.977-0.997-0.085-0.325-0.078-0.608 0.019-0.881 0.096-0.268 0.268-0.449 0.485-0.511 0.048-0.014 0.103-0.022 0.16-0.022 0 0 0 0 0 0h-0c0.501 0 0.823 0.207 1.021 0.908zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l1.275-2.711c-0.009-0.099-0.017-0.199-0.017-0.308 0-1.052 0.509-1.742 1.153-2.151 0.109-0.284 0.174-0.621 0.174-1.034 0-0.92-0.325-1.706-0.977-2.357-0.651-0.652-1.437-0.977-2.357-0.977s-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM9.895 10.667l0.313-0.667h0.225c0.137 0.189 0.299 0.35 0.483 0.48l0.006 0.004c-0.115 0.055-0.221 0.116-0.322 0.182h-0.705zM10.184 14h-8.851l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h7.195c0.099 0.255 0.235 0.479 0.411 0.667z"></path>
+</svg>
+<svg id="icon-about" width="16" height="16" viewBox="0 0 16 16" x="0" y="1092">
+<path fill="#1296db" d="M8.011 0.991c-3.868 0-7.003 3.135-7.003 7.003s3.135 7.003 7.003 7.003 7.003-3.136 7.003-7.003c0-3.868-3.135-7.003-7.003-7.003zM7.984 11.487c-0.399 0-0.723-0.333-0.723-0.743s0.324-0.743 0.723-0.743c0.399 0 0.723 0.333 0.723 0.743s-0.324 0.743-0.723 0.743zM10.003 6.816c-0.1 0.192-0.218 0.357-0.355 0.496s-0.384 0.374-0.739 0.704c-0.098 0.093-0.177 0.174-0.236 0.245s-0.103 0.134-0.132 0.193c-0.026 0.050-0.049 0.108-0.066 0.168l-0.002 0.007c-0.016 0.059-0.040 0.161-0.072 0.308-0.055 0.312-0.227 0.467-0.516 0.467-0.15 0-0.277-0.051-0.379-0.153s-0.154-0.253-0.154-0.454c0-0.251 0.037-0.47 0.113-0.654s0.175-0.347 0.299-0.486c0.124-0.139 0.292-0.305 0.503-0.497 0.185-0.168 0.319-0.294 0.401-0.38 0.080-0.083 0.149-0.176 0.205-0.279l0.003-0.007c0.056-0.105 0.085-0.219 0.085-0.341 0-0.24-0.086-0.442-0.258-0.607s-0.394-0.247-0.666-0.247c-0.318 0-0.552 0.083-0.702 0.25s-0.277 0.411-0.382 0.735c-0.098 0.339-0.285 0.508-0.559 0.508-0.162 0-0.298-0.059-0.41-0.178s-0.167-0.247-0.167-0.384c0-0.285 0.088-0.573 0.264-0.866s0.434-0.534 0.772-0.726c0.338-0.192 0.733-0.288 1.183-0.288 0.419 0 0.789 0.080 1.11 0.24s0.569 0.378 0.743 0.654c0.175 0.276 0.262 0.576 0.262 0.899 0 0.255-0.050 0.478-0.15 0.67z"></path>
+</svg>
+<svg id="icon-blockquote" width="16" height="16" viewBox="0 0 16 16" x="0" y="1113">
+<path fill="#1296db" d="M13.631 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8zM6 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8z"></path>
+</svg>
+<svg id="icon-table-attr" width="16" height="16" viewBox="0 0 16 16" x="0" y="1134">
+<path fill="#1296db" d="M15.204 1.055h-14.364c-0.41 0-0.743 0.333-0.743 0.743v12.383c0 0.41 0.333 0.743 0.743 0.743h14.364c0.41 0 0.743-0.333 0.743-0.743v-12.383c0-0.41-0.333-0.743-0.743-0.743l-0-0zM15.204 4.027v2.903h-4.293v-2.903h4.293zM5.875 10.563v-2.889h4.293v2.889h-4.293zM10.168 11.306v2.875h-4.293v-2.875h4.293zM5.132 10.563h-4.293v-2.889h4.293v2.889zM10.168 4.027v2.903h-4.293v-2.903h4.293zM10.911 7.674h4.293v2.889h-4.293v-2.889zM6.040 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM3.811 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 4.027h3.55v2.903h-4.293l0-2.903h0.743zM0.839 11.306h4.293v2.875h-4.293v-2.875zM10.911 14.181v-2.875h4.293v2.875h-4.293z"></path>
+</svg>
+<svg id="icon-insert-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1155">
+<path fill="#1296db" d="M14 0h-2s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h2c0.552 0 1-0.448 1-1v-10c0-0.552-0.448-1-1-1zM14 11h-2v-3h2v3zM14 7h-2v-2h2v2zM14 4h-2v-3h2v3zM9 13l-2 3h5l-2-3h-1zM8 11v-10c0-0.552-0.448-1-1-1h-5s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h5c0.552 0 1-0.448 1-1zM7 7h-2v-2h2v2zM7 1v3h-2v-3h2zM4 11h-2v-3h2v3zM4 7h-2v-2h2v2zM4 4h-2v-3h2v3zM5 8h2v3h-2v-3z"></path>
+</svg>
+<svg id="icon-insert-row" width="18" height="16" viewBox="0 0 18 16" x="0" y="1176">
+<path fill="#1296db" d="M17.143 16h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143zM9.143 9.143h-3.429v2.286h3.429v-2.286zM9.143 12.571h-3.429v2.286h3.429v-2.286zM12.571 9.143h-2.286v2.286h2.286v-2.286zM12.571 12.571h-2.286v2.286h2.286v-2.286zM17.143 9.143h-3.429v2.286h3.429v-2.286zM13.714 12.571v2.286h3.429v-2.286h-3.429zM17.143 4.571h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143zM9.143 1.143h-3.429v2.286h3.429v-2.286zM12.571 1.143h-2.286v2.286h2.286v-2.286zM17.143 1.143h-3.429v2.286h3.429v-2.286zM0 3.429l3.429 2.286v1.143l-3.429 2.286v-5.714z"></path>
+</svg>
+<svg id="icon-merge-table" width="21" height="16" viewBox="0 0 21 16" x="0" y="1197">
+<path fill="#1296db" d="M1.484 2.296c0-0.615 0.242-1.198 0.682-1.63 0.43-0.432 1.005-0.666 1.62-0.666h0.016l10.845 0.059c0.615 0 1.198 0.242 1.63 0.682s0.666 1.021 0.666 1.637l-0.059 10.845c0 0.615-0.242 1.198-0.682 1.63-0.432 0.432-1.007 0.666-1.622 0.666h-0.016l-10.845-0.059c-0.615 0-1.198-0.242-1.63-0.682s-0.666-1.023-0.666-1.639l0.061-10.843zM6.199 1.048l-2.412-0.016c-0.333 0-0.65 0.134-0.897 0.374-0.242 0.242-0.374 0.556-0.374 0.897l-0.016 2.461h3.7v-3.716zM10.98 1.072l-3.742-0.024v3.718h3.742v-3.693zM12.020 14.463l2.552 0.016c0.341 0 0.658-0.124 0.897-0.365 0.242-0.242 0.374-0.556 0.374-0.897l0.016-2.579h-3.842v3.825zM12.020 9.598h3.844l0.016-3.793h-3.868v3.793h0.008zM12.020 4.765h3.868l0.016-2.396c0-0.333-0.124-0.658-0.365-0.897-0.242-0.242-0.556-0.374-0.897-0.374l-2.619-0.016v3.683z"></path>
+<path fill="#1296db" d="M5.005 1.478c0.008 0 0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-merge-td" width="16" height="16" viewBox="0 0 16 16" x="0" y="1218">
+<path fill="#1296db" d="M11.371 9.493h2.837v-2.987h-12.416v2.987h9.579zM0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333z"></path>
+</svg>
+<svg id="icon-remove-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1239">
+<path fill="#1296db" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM7 12h1v1h-1s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h5c0.552 0 1 0.448 1 1v7h-1v-3h-2v3h-1v-3h-2v3h1v1h-1v3zM10 4h2v-3h-2v3zM9 4v-3h-2v3h2zM1 13s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h2c0.552 0 1 0.448 1 1v12h-3zM3 1h-2v3h2v-3zM3 5h-2v3h2v-3zM3 9h-2v3h2v-3z"></path>
+</svg>
+<svg id="icon-remove-row" width="16" height="16" viewBox="0 0 16 16" x="0" y="1260">
+<path fill="#1296db" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM9 8h-4v2h1.667l0.333 1h-2v2h2.667l0.333 1h-7c-0.552 0-1-0.448-1-1v-5s0.448-1 1-1h12v1h-4zM4 8h-3v2h3v-2zM4 11h-3v2h3v-2zM1 4c-0.552 0-1-0.448-1-1v-2s0.448-1 1-1h11c0.552 0 1 0.448 1 1v3h-12zM4 1h-3v2h3v-2zM8 1h-3v2h3v-2zM12 1h-3v2h3v-2z"></path>
+</svg>
+<svg id="icon-remove-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="1281">
+<path fill="#1296db" d="M14.857 16v-3.429l3.429-2.286v3.429l-3.429 2.286zM8 11.429l4.571-3.429h5.714l-4.571 3.429h-5.714zM13.714 4.571h-3.429v3.429h-4.571v2.286h1.143v1.143h-5.714c-0.631 0-1.143-0.512-1.143-1.143v-9.143c0-0.631 0.512-1.143 1.143-1.143h12.571c0.631 0 1.143 0.512 1.143 1.143v5.714h-1.143v-2.286zM4.571 1.143h-3.429v2.286h3.429v-2.286zM4.571 4.571h-3.429v2.286h3.429v-2.286zM4.571 8h-3.429v2.286h3.429v-2.286zM9.143 1.143h-3.429v2.286h3.429v-2.286zM9.143 4.571h-3.429v2.286h3.429v-2.286zM13.714 1.143h-3.429v2.286h3.429v-2.286zM13.714 16h-5.714v-3.429h5.714v3.429z"></path>
+</svg>
+<svg id="icon-insert-col2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1302">
+<path fill="#1296db" d="M2 16h2s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v10c0 0.552 0.448 1 1 1zM2 5h2v3h-2v-3zM2 9h2v2h-2v-2zM2 12h2v3h-2v-3zM7 3l2-3h-5l2 3h1zM8 5v10c0 0.552 0.448 1 1 1h5s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-5c-0.552 0-1 0.448-1 1zM9 9h2v2h-2v-2zM9 15v-3h2v3h-2zM12 5h2v3h-2v-3zM12 9h2v2h-2v-2zM12 12h2v3h-2v-3zM11 8h-2v-3h2v3z"></path>
+</svg>
+<svg id="icon-insert-row2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1323">
+<path fill="#1296db" d="M1.154 0h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143zM9.154 6.857h3.429v-2.286h-3.429v2.286zM9.154 3.429h3.429v-2.286h-3.429v2.286zM5.725 6.857h2.286v-2.286h-2.286v2.286zM5.725 3.429h2.286v-2.286h-2.286v2.286zM1.154 6.857h3.429v-2.286h-3.429v2.286zM4.583 3.429v-2.286h-3.429v2.286h3.429zM1.154 11.429h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143zM9.154 14.857h3.429v-2.286h-3.429v2.286zM5.725 14.857h2.286v-2.286h-2.286v2.286zM1.154 14.857h3.429v-2.286h-3.429v2.286zM18.297 12.571l-3.429-2.286v-1.143l3.429-2.286v5.714z"></path>
+</svg>
+<svg id="icon-split-table" width="16" height="16" viewBox="0 0 16 16" x="0" y="1344">
+<path fill="#1296db" d="M0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333zM10.667 9.493v-2.987h-1.792v2.987h1.792zM14.208 9.493v-2.987h-1.792v2.987h1.792zM3.584 9.493v-2.987h-1.792v2.987h1.792zM7.125 9.493v-2.987h-1.792v2.987h1.792z"></path>
+</svg>
+<svg id="icon-merge-table2" width="21" height="16" viewBox="0 0 21 16" x="0" y="1365">
+<path fill="#1296db" d="M19.297 2.296c0-0.615-0.242-1.198-0.682-1.63-0.43-0.432-1.005-0.666-1.62-0.666h-0.016l-10.845 0.059c-0.615 0-1.198 0.242-1.63 0.682s-0.666 1.021-0.666 1.637l0.059 10.845c0 0.615 0.242 1.198 0.682 1.63 0.432 0.432 1.007 0.666 1.622 0.666h0.016l10.845-0.059c0.615 0 1.198-0.242 1.63-0.682s0.666-1.023 0.666-1.639l-0.061-10.843zM14.583 1.048l2.412-0.016c0.333 0 0.65 0.134 0.897 0.374 0.242 0.242 0.374 0.556 0.374 0.897l0.016 2.461h-3.7v-3.716zM9.801 1.072l3.742-0.024v3.718h-3.742v-3.693zM8.761 14.463l-2.552 0.016c-0.341 0-0.658-0.124-0.897-0.365-0.242-0.242-0.374-0.556-0.374-0.897l-0.016-2.579h3.842v3.825zM8.761 9.598h-3.844l-0.016-3.793h3.868v3.793h-0.008zM8.761 4.765h-3.868l-0.016-2.396c0-0.333 0.124-0.658 0.365-0.897 0.242-0.242 0.556-0.374 0.897-0.374l2.619-0.016v3.683z"></path>
+<path fill="#1296db" d="M15.777 1.478c-0.008 0-0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-remove2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1386">
+<path fill="#1296db" d="M6.214 13.804c0.401 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726zM15.299 1.464h-6.178v-0.726c0-0.401-0.325-0.726-0.727-0.726h-0.727c-0.401 0-0.727 0.325-0.727 0.726v0.726h-6.177c-0.008-0-0.017-0-0.026-0-0.401 0-0.726 0.325-0.726 0.726s0.325 0.726 0.726 0.726c0.009 0 0.018-0 0.027-0.001l-0.001 0h1.090v11.615c0.001 0.802 0.651 1.452 1.453 1.452 0 0 0.001 0 0.001 0h9.448c0 0 0.001 0 0.001 0 0.802 0 1.452-0.65 1.453-1.452v-11.615h1.090c0.008 0 0.017 0 0.026 0 0.401 0 0.726-0.325 0.726-0.726s-0.325-0.726-0.726-0.726c-0.009 0-0.018 0-0.027 0l0.001-0zM12.755 13.804c0 0.401-0.325 0.726-0.727 0.726h-7.994c-0.401 0-0.727-0.325-0.727-0.726v-10.889h9.448v10.889zM9.847 13.804c0.402 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726z"></path>
+</svg>
+<svg id="icon-ok" width="16" height="16" viewBox="0 0 16 16" x="0" y="1407">
+<path fill="#1296db" d="M8 16c-4.418 0-8-3.582-8-8s3.582-8 8-8c4.418 0 8 3.582 8 8s-3.582 8-8 8zM12.177 4.986l-4.894 4.894-3.364-3.365-0.918 0.918 4.282 4.283 5.811-5.812-0.917-0.918z"></path>
+</svg>
+<svg id="icon-remove" width="16" height="16" viewBox="0 0 16 16" x="0" y="1428">
+<path fill="#1296db" d="M8 1c-3.867 0-7 3.133-7 7s3.133 7 7 7 7-3.133 7-7c0-3.867-3.133-7-7-7zM11.167 10.7c0.133 0.133 0.133 0.333 0 0.467s-0.333 0.133-0.467 0l-2.7-2.7-2.7 2.7c-0.133 0.133-0.333 0.133-0.467 0s-0.133-0.333 0-0.467l2.7-2.7-2.7-2.7c-0.133-0.133-0.133-0.333 0-0.467s0.333-0.133 0.467 0l2.7 2.7 2.7-2.7c0.133-0.133 0.333-0.133 0.467 0s0.133 0.333 0 0.467l-2.7 2.7 2.7 2.7z"></path>
+</svg>
+<svg id="icon-graft2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1449">
+<path fill="#1296db" d="M11.658 0.504c0.216-0.218 0.516-0.354 0.848-0.354s0.631 0.135 0.847 0.354l1.664 1.664c0.217 0.217 0.351 0.517 0.351 0.848s-0.134 0.631-0.351 0.848l-9.336 9.336c-0.468 0.468-1.365 0.954-2.024 1.089l-3.048 0.625 0.625-3.048c0.133-0.65 0.62-1.557 1.088-2.025l9.336-9.336zM9.96 2.202l-0.848 0.849 3.358 3.359 0.849-0.849-3.359-3.359zM12.184 12.804c0.905-0.457 1.054-0.865 0.639-1.526-0.338-0.537-1.675-0.285-1.797 0.805-0.044 0.398 0.117 0.753 0.421 1.026 0.28-0.096 0.525-0.197 0.737-0.305zM13.063 13.682c-0.092 0.059-0.206 0.124-0.322 0.183l-0.025 0.012c-0.396 0.201-0.877 0.38-1.442 0.54-1.27 0.36-2.968 0.617-5.104 0.781-0.013 0.001-0.028 0.002-0.043 0.002-0.314 0-0.572-0.243-0.594-0.552l-0-0.002c-0.001-0.014-0.002-0.031-0.002-0.048 0-0.313 0.24-0.57 0.547-0.596l0.002-0c1.652-0.127 3.021-0.311 4.101-0.548 0.479-0.104 0.901-0.22 1.266-0.345 0.367 0.331 0.943 0.544 1.616 0.573 0.981 0.043 2.17-0.303 3.22-1.242 0.104-0.093 0.242-0.15 0.393-0.15 0.177 0 0.336 0.078 0.444 0.202l0.001 0.001c0.093 0.106 0.149 0.245 0.149 0.398 0 0.178-0.077 0.338-0.2 0.449l-0.001 0c-1.888 1.687-4.29 1.855-5.796 1.079-0.462-0.238-0.84-0.565-1.093-0.964-0.221-0.346-0.353-0.767-0.353-1.219 0-0.101 0.007-0.2 0.019-0.297l-0.001 0.011c0.25-2.25 3.058-2.78 3.979-1.315 0.752 1.197 0.45 2.291-0.762 3.048z"></path>
+</svg>
+<svg id="icon-func" width="17" height="16" viewBox="0 0 17 16" x="0" y="1470">
+<path fill="#1296db" d="M0.531 15.51v-2.065h4.213c-1.236-0.919-2.162-1.924-2.78-3.018-0.582-1.007-0.926-2.215-0.926-3.503 0-0.014 0-0.029 0-0.043l-0 0.002c0-1.992 0.695-3.612 2.086-4.861 1.39-1.25 3.193-1.874 5.406-1.874 2.215 0 4.017 0.625 5.408 1.874s2.086 2.869 2.086 4.86c0 1.263-0.309 2.441-0.927 3.535s-1.544 2.103-2.78 3.028h4.213v2.065h-6.854v-2.065c1.012-0.756 1.772-1.663 2.278-2.72 0.506-1.056 0.76-2.263 0.76-3.62 0-1.519-0.373-2.715-1.12-3.59-0.745-0.874-1.767-1.31-3.063-1.31s-2.317 0.438-3.063 1.316c-0.746 0.877-1.119 2.076-1.119 3.595 0 1.356 0.253 2.562 0.76 3.615s1.265 1.958 2.278 2.714v2.065h-6.857z"></path>
+</svg>
+<svg id="icon-find" width="16" height="16" viewBox="0 0 16 16" x="0" y="1491">
+<path fill="#1296db" d="M1 0h6v1h-6zM9 0h6v1h-6zM14.875 5h-0.875v-4h-4v4h-4v-4h-4v4h-0.875c-0.619 0-1.125 0.506-1.125 1.125v8.75c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-5.875h2v5.875c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-8.75c0-0.619-0.506-1.125-1.125-1.125zM5.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5zM8.5 8h-1c-0.275 0-0.5-0.225-0.5-0.5s0.225-0.5 0.5-0.5h1c0.275 0 0.5 0.225 0.5 0.5s-0.225 0.5-0.5 0.5zM14.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5z"></path>
+</svg>
+<svg id="icon-date" width="16" height="16" viewBox="0 0 16 16" x="0" y="1512">
+<path fill="#1296db" d="M13.597 2.081h-0.584v2.837c0 0.603-0.489 1.093-1.093 1.093s-1.092-0.49-1.092-1.093v-2.837h-5.64v2.83c0 0.604-0.49 1.094-1.094 1.094-0.603 0-1.092-0.49-1.092-1.094v-2.83h-0.6c-0.775 0-1.402 0.628-1.402 1.402v3.070h14v-3.070c0-0.774-0.627-1.402-1.403-1.402zM4.927 4.612c0 0.463-0.376 0.837-0.837 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.375-0.837 0.837-0.837v0c0.461 0 0.837 0.374 0.837 0.837v2.76zM12.78 4.612c0 0.463-0.374 0.837-0.838 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.374-0.837 0.837-0.837v0c0.464 0 0.838 0.374 0.838 0.837v2.76zM14.182 7.133v5.608c0 0.774-0.627 1.401-1.401 1.401h-9.573c-0.774 0-1.401-0.627-1.401-1.401v-5.608h-0.807v6.45c0 0.774 0.627 1.403 1.403 1.403h11.193c0.776 0 1.403-0.629 1.403-1.403v-6.45h-0.817zM8.393 11.198h1.101c0.109 0.504 0.389 0.649 0.662 0.649 0.405 0 0.651-0.262 0.651-0.723 0-0.26-0.097-0.626-0.651-0.64h-0.351v-0.69h0.159c0.554-0.014 0.687-0.241 0.687-0.66 0-0.271-0.201-0.468-0.526-0.477-0.426-0.011-0.491 0.185-0.598 0.443l-1.031 0.002c0.239-0.793 0.793-1.196 1.661-1.21 1.052 0.028 1.597 0.453 1.635 1.274 0 0.403-0.232 0.708-0.692 0.909 0.589 0.202 0.885 0.563 0.885 1.080-0.037 0.865-0.646 1.319-1.827 1.362-0.998 0.001-1.599-0.483-1.765-1.319zM7.633 11.479v0.975h-3.543v-0.629c0.386-0.605 0.771-1.059 1.492-1.52 0.663-0.433 0.894-0.763 0.894-1.080 0-0.070 0.003-0.433-0.531-0.433-0.372 0.014-0.645 0.182-0.645 0.565l-1.128 0.007c0.065-1.087 0.95-1.473 1.856-1.473 1.032 0.043 1.586 0.482 1.66 1.317 0.037 0.563-0.28 1.101-1.148 1.634-0.48 0.287-0.523 0.319-0.817 0.636h1.91z"></path>
+</svg>
+<svg id="icon-clock" width="16" height="16" viewBox="0 0 16 16" x="0" y="1533">
+<path fill="#1296db" d="M11.331 7.805h-2.732v-2.199c0-0.333-0.267-0.6-0.6-0.6s-0.6 0.267-0.6 0.6v2.932c0.067 0.267 0.267 0.466 0.533 0.466h3.398c0.333 0 0.6-0.267 0.6-0.6s-0.267-0.6-0.6-0.6zM13.53 3.074c-1.399-1.399-3.331-2.199-5.53-2.199-2.132 0-4.131 0.866-5.53 2.199-1.399 1.399-2.265 3.265-2.265 5.33s0.866 3.998 2.265 5.33c1.399 1.399 3.331 2.199 5.53 2.199 2.132 0 4.131-0.866 5.53-2.199 1.399-1.399 2.265-3.265 2.265-5.33s-0.866-3.998-2.265-5.33zM12.664 12.935c-1.199 1.133-2.865 1.866-4.664 1.866s-3.465-0.733-4.664-1.866c-1.199-1.133-1.932-2.732-1.932-4.531s0.733-3.398 1.932-4.531c1.199-1.133 2.865-1.866 4.664-1.866s3.465 0.733 4.664 1.866c1.199 1.133 1.932 2.798 1.932 4.531 0 1.799-0.733 3.398-1.932 4.531zM1.271 2.874l2.332-1.866c0.267-0.2 0.267-0.6 0.067-0.8-0.2-0.267-0.6-0.267-0.866-0.067l-2.332 1.866c-0.267 0.2-0.333 0.6-0.067 0.8 0.2 0.267 0.6 0.267 0.866 0.067zM14.729 2.874c0.267 0.2 0.666 0.133 0.866-0.067 0.2-0.267 0.133-0.6-0.067-0.8l-2.332-1.866c-0.267-0.2-0.666-0.133-0.866 0.067-0.2 0.267-0.2 0.6 0.067 0.8l2.332 1.866z"></path>
+</svg>
+</svg>
diff --git a/public/assets/addons/nkeditor/themes/common/anchor.gif b/public/assets/addons/nkeditor/themes/common/anchor.gif
new file mode 100644
index 0000000..61145ea
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/anchor.gif differ
diff --git a/public/assets/addons/nkeditor/themes/common/blank.gif b/public/assets/addons/nkeditor/themes/common/blank.gif
new file mode 100644
index 0000000..5bfd67a
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/blank.gif differ
diff --git a/public/assets/addons/nkeditor/themes/common/common.css b/public/assets/addons/nkeditor/themes/common/common.css
new file mode 100644
index 0000000..a92c5de
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/common/common.css
@@ -0,0 +1,605 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+/*# sourceMappingURL=common.css.map */
diff --git a/public/assets/addons/nkeditor/themes/common/common.css.map b/public/assets/addons/nkeditor/themes/common/common.css.map
new file mode 100644
index 0000000..0844fe0
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/common/common.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["common.scss"],
+"names": [],
+"file": "common.css"
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/common/common.scss b/public/assets/addons/nkeditor/themes/common/common.scss
new file mode 100644
index 0000000..5e8549b
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/common/common.scss
@@ -0,0 +1,830 @@
+$inputBorderColor : #cccccc;
+$inputFocusBorderColor : #66afe9;
+$inputHeight : 30px;
+$editorBorderStyle : 1px solid #e1e1e1;
+$dialogBorderStyle : 1px solid #cccccc;
+$menuBgColor : #f5f5f5;
+
+@mixin ke-inline-block {
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline;
+}
+//工具栏图标样式
+@mixin ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+}
+//阴影
+@mixin ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+}
+
+/**
+公共样式
+*/
+//清除浮动
+.ke-clearfix {
+    zoom: 1;
+    clear: both;
+}
+.ke-clearfix:after {
+    content: ".";
+    display: block;
+    clear: both;
+    font-size: 0;
+    height: 0;
+    line-height: 0;
+    visibility: hidden;
+}
+// 过渡动画
+.ke-animated {
+    animation: zoomIn;
+    animation-duration: 0.3s;
+    animation-fill-mode: both;
+}
+@keyframes zoomIn {
+    from {
+        opacity: 0;
+        transform: scale3d(0.3, 0.3, 0.3);
+    }
+    50% {
+        opacity: 1;
+    }
+}
+
+//遮罩层
+.ke-dialog-mask {
+    background-color: #FFF;
+    filter: alpha(opacity=50);
+    opacity: 0.5;
+}
+.ke-dialog-lock {
+    background-color: #FFF;
+    filter: alpha(opacity=50);
+    opacity: 0.5;
+    z-index: 811213;
+    left: 0;
+    top: 0;
+    position: absolute;
+}
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+
+    display: block;
+    //border: $editorBorderStyle;
+    background-color: #FFF;
+    overflow: hidden;
+    margin: 0;
+    padding: 0;
+    box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 1px 1px rgba(0,0,0,0.16);
+
+    /**
+    通用样式
+     */
+    .ke-shadow {
+        @include ke-shadow;
+        background-color: #F0F0EE;
+    }
+
+    .ke-menu a,
+    .ke-menu a:hover,
+    .ke-dialog a,
+    .ke-dialog a:hover {
+        color: #337FE5;
+        text-decoration: none;
+    }
+
+    /**
+     toolbar 样式
+     */
+    .ke-toolbar {
+        //border-bottom: $editorBorderStyle;
+        text-align: left;
+        overflow: hidden;
+        zoom: 1;
+        padding: 0px 5px;
+
+        .ke-outline {
+            //border: 1px solid #f5f5f5;
+            padding: 10px 5px;
+            font-size: 0;
+            line-height: 0;
+            cursor: pointer;
+            display: block;
+            float: left;
+
+            /**
+             * 按钮通用样式
+             */
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+            }
+
+        }
+
+        .ke-on {
+            background: #ebebeb;
+        }
+        .ke-selected {
+            background-color: #ebebeb;
+        }
+        .ke-disabled {
+            cursor: default;
+        }
+        .ke-separator {
+            height: 16px;
+            margin: 2px 3px;
+            border-left: 1px solid #A0A0A0;
+            border-right: 1px solid #FFFFFF;
+            border-top: 0;
+            border-bottom: 0;
+            width: 0;
+            font-size: 0;
+            line-height: 0;
+            overflow: hidden;
+            display: block;
+            float: left;
+        }
+        .ke-hr {
+            clear: both;
+            height: 1px;
+            width: calc(100% - (2 * 2px));
+            background: #ebebeb;
+        }
+    }
+    //end ke-toolbar
+
+    /**
+     ke-edit
+     */
+    .ke-edit {
+        padding: 0;
+
+        .ke-edit-iframe,
+        .ke-edit-textarea {
+            border: 0;
+            margin: 0;
+            padding: 0;
+            overflow: auto;
+        }
+        .ke-edit-textarea {
+            font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+            color: #000;
+            overflow: auto;
+            resize: none;
+
+            &:focus {
+                outline: none;
+            }
+        }
+    }
+    //end ke-edit
+
+    /**
+     statusbar start
+     */
+    .ke-statusbar {
+        position: relative;
+        background-color: #f5f5f5;
+        border-top: $editorBorderStyle;
+        font-size: 0;
+        line-height: 0;
+        *height: 12px;
+        overflow: hidden;
+        text-align: center;
+        cursor: s-resize;
+        display: none;
+
+        .ke-statusbar-center-icon {
+            background-position: -0px -754px;
+            width: 15px;
+            height: 11px;
+        }
+
+        .ke-statusbar-right-icon {
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            cursor: se-resize;
+            width: 11px;
+            height: 11px;
+        }
+    }
+    //end ke-statusbar
+}
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+    border: $dialogBorderStyle;
+    background-color: $menuBgColor;
+    color: #222222;
+    padding: 2px;
+    font-family: "sans serif", tahoma, verdana, helvetica;
+    font-size: 12px;
+    text-align: left;
+    overflow: hidden;
+
+    .ke-menu-item {
+        border: 1px solid #F1F1F1;
+        background-color: #F1F1F1;
+        color: #222222;
+        height: 24px;
+        overflow: hidden;
+        cursor: pointer;
+
+        .ke-inline-block {
+            @include ke-inline-block;
+
+            .ke-inline-block {
+                @include ke-inline-block;
+            }
+        }
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+
+        }
+
+        .ke-menu-item-center {
+            width: 0;
+            height: 24px;
+            border-left: 1px solid #E3E3E3;
+            border-right: 1px solid #FFFFFF;
+            border-top: 0;
+            border-bottom: 0;
+        }
+
+        .ke-menu-item-center-on {
+            border-left: 1px solid #E9EFF6;
+            border-right: 1px solid #E9EFF6;
+        }
+
+        .ke-menu-item-right {
+            border: 0;
+            padding: 0 0 0 5px;
+            line-height: 24px;
+            text-align: left;
+            overflow: hidden;
+        }
+
+        .ke-menu-separator {
+            margin: 2px 0;
+            height: 0;
+            overflow: hidden;
+            border-top: $editorBorderStyle;
+            border-bottom: 1px solid #FFFFFF;
+            border-left: 0;
+            border-right: 0;
+        }
+    }
+
+    .ke-menu-item-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6;
+    }
+
+    /**
+    表情插件
+     */
+    .ke-plugin-emoticons {
+        position: relative;
+
+        .ke-preview {
+            position: absolute;
+            text-align: center;
+            margin: 2px;
+            padding: 10px;
+            top: 0;
+            border: 1px solid #A0A0A0;
+            background-color: #FFFFFF;
+            display: none;
+
+            .ke-preview-img {
+                border: 0;
+                margin: 0;
+                padding: 0;
+            }
+        } //end ke-preview
+
+        .ke-table {
+            border: 0;
+            margin: 0;
+            padding: 0;
+            border-collapse: separate;
+
+            .ke-cell {
+                margin: 0;
+                padding: 1px;
+                border: 1px solid #f5f5f5;
+                cursor: pointer;
+
+                .ke-img {
+                    display: block;
+                    background-repeat: no-repeat;
+                    overflow: hidden;
+                    margin: 2px;
+                    width: 24px;
+                    height: 24px;
+                    margin: 0;
+                    padding: 0;
+                    border: 0;
+                }
+            }
+            .ke-on {
+                border: 1px solid #5690D2;
+                background-color: #E9EFF6;
+            }
+        } //end ke-table
+
+        .ke-page {
+            text-align: right;
+            margin: 5px;
+            padding: 0;
+            border: 0;
+            font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+            color: #333;
+            text-decoration: none;
+        }
+    }
+
+}
+//menu end
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+    border: 1px solid #A0A0A0;
+    background-color: #F1F1F1;
+    color: #222222;
+    padding: 2px;
+
+    .ke-colorpicker-table {
+        border: 0;
+        margin: 0;
+        padding: 0;
+        border-collapse: separate;
+
+        .ke-colorpicker-cell {
+            font-size: 0;
+            line-height: 0;
+            border: 1px solid #F0F0EE;
+            cursor: pointer;
+            margin: 3px;
+            padding: 0;
+
+            .ke-colorpicker-cell-color {
+                width: 14px;
+                height: 14px;
+                margin: 3px;
+                padding: 0;
+                border: 0;
+            }
+        }
+        .ke-colorpicker-cell-top {
+            font-family: "sans serif", tahoma, verdana, helvetica;
+            font-size: 12px;
+            line-height: 24px;
+            border: 1px solid #F1F1F1;
+            cursor: pointer;
+            margin: 0;
+            padding: 0;
+            text-align: center;
+        }
+        .ke-colorpicker-cell-on {
+            border: 1px solid #5690D2;
+        }
+        .ke-colorpicker-cell-selected {
+            border: 1px solid #2446AB;
+        }
+
+    }
+} //colorpicker end
+
+/**
+ dialog
+ */
+.ke-dialog {
+    margin: 0;
+    padding: 0;
+    border: $dialogBorderStyle;
+    zoom: 1;
+    @include ke-shadow;
+    border-radius: 5px;
+    -moz-border-radius: 5px;
+    -webkit-border-radius: 5px;
+    overflow: hidden;
+
+    // start ke-dialog-header
+    .ke-dialog-header {
+        border: 0;
+        margin: 0;
+        font-weight: bold;
+        font-size: 14px;
+        height: 30px;
+        line-height: 30px;
+        padding: 0px 10px;
+        text-align: left;
+        color: #222;
+        cursor: move;
+        border-top-left-radius: 6px;
+        border-top-right-radius: 6px;
+        border-bottom: 1px solid #c6c6c6;
+        background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+        position: relative;
+        cursor: move;
+
+        .ke-dialog-icon-close {
+            height: 20px;
+            width: 20px;
+            cursor: pointer;
+            background: url("../common/icons-all.gif") 0 -59px;
+            position: absolute;
+            right: 5px;
+            top: 4px;
+
+            &:hover {
+                background-position: 0px -89px;
+            }
+        }
+
+    } //end ke-dialog-header
+
+    //start ke-content
+    .ke-dialog-content {
+
+        background-color: #FFF;
+        width: 100%;
+        height: 100%;
+        color: #333;
+        outline: 0;
+        zoom: 1;
+
+        // ke-dialog-body start
+        .ke-dialog-body {
+            font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+            text-align: left;
+            overflow: hidden;
+            width: 100%;
+
+            .ke-textarea {
+                display: block;
+                width: 408px;
+                height: 260px;
+                font-family: "sans serif", tahoma, verdana, helvetica;
+                font-size: 12px;
+                border: 1px solid $inputBorderColor;
+
+                &:focus {
+                    border-color: $inputFocusBorderColor;
+                    outline: none;
+                }
+            }
+
+            .ke-select {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline;
+                width: auto;
+                border: 1px solid $inputBorderColor;
+                height: $inputHeight;
+            }
+            .ke-form {
+                margin: 0;
+                padding: 0;
+            }
+
+            .ke-input-number {
+                width: 50px;
+            }
+
+            .ke-input-checkbox {
+                position: relative;
+                top:6px;
+            }
+
+            textarea {
+                display: block;
+                overflow: auto;
+                padding: 0;
+                resize: none;
+
+                &:focus {
+                    outline: none;
+                }
+            }
+
+            .ke-input-text {
+                display: inline-block !important;
+                max-width: 400px;
+                height: $inputHeight;
+                line-height: $inputHeight;
+                border:1px solid $inputBorderColor;
+                font-size: 14px;
+                margin: 0;
+                outline: 0;
+                padding: 0px 10px;
+                *display: inline;
+
+                &:focus {
+                    border-color: $inputFocusBorderColor;
+                }
+            }
+
+            .ke-input-color {
+                border: $editorBorderStyle;
+                background-color: #FFFFFF;
+                font-size: 12px;
+                width: 60px;
+                height: 30px;
+                line-height: 30px;
+                padding-left: 5px;
+                overflow: hidden;
+                cursor: pointer;
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline;
+            }
+
+            .ke-upload-area {
+                position: relative;
+                overflow: hidden;
+                margin: 0;
+                padding: 0;
+                top:-1px;
+                position: relative;
+                *height: 25px;
+
+                .ke-upload-file {
+                    position: absolute;
+                    font-size: 60px;
+                    top: 0;
+                    right: 0;
+                    padding: 0;
+                    margin: 0;
+                    z-index: 811212;
+                    border: 0 none;
+                    opacity: 0;
+                    cursor: pointer;
+                    width: 62px;
+                    height: 30px;
+                    filter: alpha(opacity=0);
+
+                }
+
+                .ke-button-common {
+                    top: -1px;
+                }
+                .ke-button {
+                    padding: 8px 15px;
+                }
+            }
+
+            .ke-dialog-content-inner {
+                padding: 10px 20px 0px 20px;
+
+                .ke-dialog-row {
+                    border:1px solid #FFFFFF;
+                    margin-bottom: 10px;
+                    overflow: hidden;
+
+                    .row-left {
+                        float: left;
+                        height: 30px;
+                        line-height: 30px;
+                        width: 60px;
+                        text-align: right;
+                    }
+                    .row-right {
+                        float: left;
+                        text-align: left;
+
+                        .ke-inline-block {
+                            @include ke-inline-block;
+
+                            .ke-upload-button {
+                                position: relative;
+                                top: -1px;
+                            }
+                        }
+
+                        label {
+                            cursor: pointer;
+                            display: -moz-inline-stack;
+                            display: inline-block;
+                            vertical-align: middle;
+                            text-align: right;
+                            zoom: 1;
+                            *display: inline;
+
+                            img {
+                                display: -moz-inline-stack;
+                                display: inline-block;
+                                vertical-align: middle;
+                                zoom: 1;
+                                *display: inline;
+                            }
+                        }
+                    }
+
+
+                } //end ke-dialog-row
+
+                //百度地图样式
+                .ke-header {
+                    height: 30px;
+                    line-height: 30px;
+
+                    .ke-input-text {
+                        height: 22px;
+                        line-height: 22px;
+                    }
+                    .ke-button {
+                        padding: 3px 10px;
+                    }
+                    .checkbox {
+                        margin-left:10px;
+                    }
+                }
+
+                /**
+                 tabs
+                 */
+                .ke-tabs {
+                    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+                    border-bottom: $editorBorderStyle;
+                    margin-bottom: 20px;
+
+                    .ke-tabs-ul {
+                        list-style: none outside none;
+                        margin: 0;
+                        padding: 0;
+
+                        .ke-tabs-li {
+                            position: relative;
+                            margin: 0 2px -1px 0;
+                            padding: 0 20px;
+                            float: left;
+                            line-height: 25px;
+                            text-align: center;
+                            color: #337ab7;
+                            cursor: pointer;
+                        }
+                        .ke-tabs-li-selected {
+                            background-color: #FFF;
+                            border: $editorBorderStyle;
+                            border-bottom: 1px solid #FFF;
+                            color: #555555;
+                            cursor: default;
+                            border-top-left-radius: 3px;
+                            border-top-right-radius: 3px;
+                        }
+
+                        .ke-tabs-li-on {
+                            background-color: #FFF;
+                            color: #000;
+                        }
+                    } //end ul
+                } //end tabs
+
+            } //end ke-dialog-content-inner
+
+
+        } // end ke-dialog-body
+
+        .ke-dialog-loading {
+            position: absolute;
+            top: 0;
+            left: 1px;
+            z-index: 1;
+            text-align: center;
+
+            .ke-dialog-loading-content {
+                background: url("../common/loading.gif") no-repeat center;
+                color: #666;
+                font-size: 14px;
+                font-weight: bold;
+                height: 31px;
+                line-height: 31px;
+                padding-left: 36px;
+            }
+        } //end ke-dialog-loading
+
+    } //end ke-content
+
+    .ke-dialog-footer {
+        font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+        text-align: right;
+        padding: 0 15px 5px 0;
+        background-color: #FFF;
+        height: 40px;
+
+        .ke-dialog-yes {
+            margin: 5px;
+        }
+
+        .ke-dialog-no {
+            margin: 5px 10px 5px 5px;
+        }
+    } // ke-dialog-footer
+
+    .ke-button-common {
+        display: inline-block;
+        text-align: center;
+        background: none;
+        border: none;
+        padding: 0;
+        cursor: pointer;
+    }
+
+    .ke-button-outer {
+        background-position: 0 -25px;
+        padding: 0;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+    }
+
+    .ke-button {
+        color: #333;
+        font-size: 12px;
+        border: 1px solid #e6e6e6;
+        background-color: #e6e6e6;
+        padding: 7px 10px;
+        margin-top: -4px;
+        color: #444;
+        text-decoration: none;
+        transition: background-color .3s ease-out, border-color .3s ease-out;
+
+        &:hover {
+            border: $editorBorderStyle;
+            background-color: #e1e1e1;
+        }
+    }
+
+    .ke-dialog-btn {
+        font-size: 12px;
+        margin: 5px;
+        background: #2e8ded;
+        color: #fff !important;
+        padding: 8px 12px;
+        display: inline-block;
+        border-radius: 2px;
+        cursor: pointer;
+        text-decoration: none;
+        transition: .3s ease-out;
+
+        &:hover {
+            filter: alpha(opacity=80);
+            box-shadow: none;
+            box-shadow: none;
+            opacity: .8;
+        }
+    }
+
+
+} //dialog end
+
+//.ke-dialog-preview {
+//    margin: 5px;
+//}
+
+
+//.ke-plugin-plainpaste-textarea,
+//.ke-plugin-wordpaste-iframe {
+//    display: block;
+//    width: 408px;
+//    height: 260px;
+//    font-family: "sans serif", tahoma, verdana, helvetica;
+//    font-size: 12px;
+//    border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+//    border-style: solid;
+//    border-width: 1px;
+//}
+
+
diff --git a/public/assets/addons/nkeditor/themes/common/dialog-title-bg.png b/public/assets/addons/nkeditor/themes/common/dialog-title-bg.png
new file mode 100644
index 0000000..f744f26
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/dialog-title-bg.png differ
diff --git a/public/assets/addons/nkeditor/themes/common/flash.gif b/public/assets/addons/nkeditor/themes/common/flash.gif
new file mode 100644
index 0000000..2cb12b2
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/flash.gif differ
diff --git a/public/assets/addons/nkeditor/themes/common/flash.png b/public/assets/addons/nkeditor/themes/common/flash.png
new file mode 100644
index 0000000..cc3be67
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/flash.png differ
diff --git a/public/assets/addons/nkeditor/themes/common/flash.svg b/public/assets/addons/nkeditor/themes/common/flash.svg
new file mode 100644
index 0000000..31750f2
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/common/flash.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1506319500431" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3560" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M512 56.888889C261.688889 56.888889 56.888889 261.688889 56.888889 512s204.8 455.111111 455.111111 455.111111 455.111111-204.8 455.111111-455.111111-204.8-455.111111-455.111111-455.111111z m227.555556 324.266667c-79.644444-5.688889-125.155556 79.644444-125.155556 79.644444l91.022222 5.688889V568.888889h-130.844444C506.311111 819.2 341.333333 773.688889 341.333333 773.688889v-85.333333s96.711111 0 147.911111-176.355556C563.2 233.244444 739.555556 290.133333 739.555556 290.133333v91.022223z" p-id="3561"></path></svg>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/common/icons-all.gif b/public/assets/addons/nkeditor/themes/common/icons-all.gif
new file mode 100644
index 0000000..21915e5
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/icons-all.gif differ
diff --git a/public/assets/addons/nkeditor/themes/common/loading.gif b/public/assets/addons/nkeditor/themes/common/loading.gif
new file mode 100644
index 0000000..c69e937
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/loading.gif differ
diff --git a/public/assets/addons/nkeditor/themes/common/media.gif b/public/assets/addons/nkeditor/themes/common/media.gif
new file mode 100644
index 0000000..e1c0e30
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/media.gif differ
diff --git a/public/assets/addons/nkeditor/themes/common/play.png b/public/assets/addons/nkeditor/themes/common/play.png
new file mode 100644
index 0000000..7899c5a
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/play.png differ
diff --git a/public/assets/addons/nkeditor/themes/common/play.svg b/public/assets/addons/nkeditor/themes/common/play.svg
new file mode 100644
index 0000000..8d5cd9a
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/common/play.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1506318981937" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1622" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css"></style></defs><path d="M512 1024C229.2352 1024 0 794.7648 0 512S229.2352 0 512 0s512 229.2352 512 512-229.2352 512-512 512z m-85.248-257.4976l307.0336-230.2848c17.024-12.7616 17.024-33.4336 0-46.1952L426.752 259.7376c-17.024-12.7616-30.7968-5.888-30.7968 15.3472v476.0704c0 21.2864 13.7984 28.1088 30.7968 15.36z" p-id="1623"></path></svg>
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/common/rm.gif b/public/assets/addons/nkeditor/themes/common/rm.gif
new file mode 100644
index 0000000..d013d55
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/common/rm.gif differ
diff --git a/public/assets/addons/nkeditor/themes/default/editor.css b/public/assets/addons/nkeditor/themes/default/editor.css
new file mode 100644
index 0000000..8518512
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/default/editor.css
@@ -0,0 +1,1398 @@
+/* common */
+.ke-animated {
+	animation: zoomIn;
+	animation-duration: 0.3s;
+	animation-fill-mode: both; }
+
+@keyframes zoomIn {
+	from {
+		opacity: 0;
+		transform: scale3d(0.3, 0.3, 0.3); }
+	50% {
+		opacity: 1; } }
+
+.ke-inline-block {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-clearfix {
+	zoom: 1;
+}
+
+.ke-clearfix:after {
+	content: ".";
+	display: block;
+	clear: both;
+	font-size: 0;
+	height: 0;
+	line-height: 0;
+	visibility: hidden;
+}
+
+.ke-shadow {
+	box-shadow: 1px 1px 3px #A0A0A0;
+	-moz-box-shadow: 1px 1px 3px #A0A0A0;
+	-webkit-box-shadow: 1px 1px 3px #A0A0A0;
+	filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+	background-color: #F0F0EE;
+}
+
+.ke-menu a,
+.ke-menu a:hover,
+.ke-dialog a,
+.ke-dialog a:hover {
+	color: #337FE5;
+	text-decoration: none;
+}
+
+/* icons */
+.ke-icon-source {
+	background-position: 0px 0px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-preview {
+	background-position: 0px -16px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-print {
+	background-position: 0px -32px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-undo {
+	background-position: 0px -48px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-redo {
+	background-position: 0px -64px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-cut {
+	background-position: 0px -80px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-copy {
+	background-position: 0px -96px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-paste {
+	background-position: 0px -112px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-selectall {
+	background-position: 0px -128px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-justifyleft {
+	background-position: 0px -144px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-justifycenter {
+	background-position: 0px -160px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-justifyright {
+	background-position: 0px -176px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-justifyfull {
+	background-position: 0px -192px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-insertorderedlist {
+	background-position: 0px -208px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-insertunorderedlist {
+	background-position: 0px -224px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-indent {
+	background-position: 0px -240px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-outdent {
+	background-position: 0px -256px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-subscript {
+	background-position: 0px -272px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-superscript {
+	background-position: 0px -288px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-date {
+	background-position: 0px -304px;
+	width: 25px;
+	height: 16px;
+}
+
+.ke-icon-time {
+	background-position: 0px -320px;
+	width: 25px;
+	height: 16px;
+}
+
+.ke-icon-formatblock {
+	background-position: 0px -336px;
+	width: 25px;
+	height: 16px;
+}
+
+.ke-icon-fontname {
+	background-position: 0px -352px;
+	width: 21px;
+	height: 16px;
+}
+
+.ke-icon-fontsize {
+	background-position: 0px -368px;
+	width: 23px;
+	height: 16px;
+}
+
+.ke-icon-forecolor {
+	background-position: 0px -384px;
+	width: 20px;
+	height: 16px;
+}
+
+.ke-icon-hilitecolor {
+	background-position: 0px -400px;
+	width: 23px;
+	height: 16px;
+}
+
+.ke-icon-bold {
+	background-position: 0px -416px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-italic {
+	background-position: 0px -432px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-underline {
+	background-position: 0px -448px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-strikethrough {
+	background-position: 0px -464px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-removeformat {
+	background-position: 0px -480px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-image {
+	background-position: 0px -496px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-flash {
+	background-position: 0px -512px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-media {
+	background-position: 0px -528px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-div {
+	background-position: 0px -544px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-formula {
+	background-position: 0px -576px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-hr {
+	background-position: 0px -592px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-emoticons {
+	background-position: 0px -608px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-link {
+	background-position: 0px -624px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-unlink {
+	background-position: 0px -640px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-fullscreen {
+	background-position: 0px -656px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-about {
+	background-position: 0px -672px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-plainpaste {
+	background-position: 0px -704px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-wordpaste {
+	background-position: 0px -720px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-table {
+	background-position: 0px -784px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablemenu {
+	background-position: 0px -768px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tableinsert {
+	background-position: 0px -784px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tabledelete {
+	background-position: 0px -800px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecolinsertleft {
+	background-position: 0px -816px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecolinsertright {
+	background-position: 0px -832px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowinsertabove {
+	background-position: 0px -848px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowinsertbelow {
+	background-position: 0px -864px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecoldelete {
+	background-position: 0px -880px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowdelete {
+	background-position: 0px -896px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecellprop {
+	background-position: 0px -912px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tableprop {
+	background-position: 0px -928px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-checked {
+	background-position: 0px -944px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-code {
+	background-position: 0px -960px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-map {
+	background-position: 0px -976px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-baidumap {
+	background-position: 0px -976px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-lineheight {
+	background-position: 0px -992px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-clearhtml {
+	background-position: 0px -1008px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-pagebreak {
+	background-position: 0px -1024px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-insertfile {
+	background-position: 0px -1040px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-quickformat {
+	background-position: 0px -1056px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-template {
+	background-position: 0px -1072px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecellsplit {
+	background-position: 0px -1088px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowmerge {
+	background-position: 0px -1104px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablerowsplit {
+	background-position: 0px -1120px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecolmerge {
+	background-position: 0px -1136px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-tablecolsplit {
+	background-position: 0px -1152px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-anchor {
+	background-position: 0px -1168px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-search {
+	background-position: 0px -1184px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-new {
+	background-position: 0px -1200px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-specialchar {
+	background-position: 0px -1216px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-multiimage {
+	background-position: 0px -1232px;
+	width: 16px;
+	height: 16px;
+}
+
+.ke-icon-graft {
+	background: url("images/scrawl.png") !important;
+	width: 16px;
+	height: 16px;
+}
+
+/* container */
+.ke-container {
+	display: block;
+	border: 1px solid #CCCCCC;
+	background-color: #FFF;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+}
+
+/* toolbar */
+.ke-toolbar {
+	border-bottom: 1px solid #CCC;
+	background-color: #FFFFFF;
+	padding: 2px 5px;
+	text-align: left;
+	overflow: hidden;
+	zoom: 1;
+}
+
+.ke-toolbar-icon {
+	background-repeat: no-repeat;
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	display: block;
+}
+
+.ke-toolbar-icon-url {
+	background-image: url(images/default.png);
+}
+
+.ke-toolbar .ke-outline {
+	border: 1px solid #F0F0EE;
+	margin: 1px;
+	padding: 1px 2px;
+	font-size: 0;
+	line-height: 0;
+	cursor: pointer;
+	display: block;
+	float: left;
+}
+
+.ke-toolbar .ke-on {
+	border: 1px solid #5690D2;
+}
+
+.ke-toolbar .ke-selected {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+.ke-toolbar .ke-disabled {
+	cursor: default;
+}
+
+.ke-toolbar .ke-separator {
+	height: 16px;
+	margin: 2px 3px;
+	border-left: 1px solid #A0A0A0;
+	border-right: 1px solid #FFFFFF;
+	border-top: 0;
+	border-bottom: 0;
+	width: 0;
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	display: block;
+	float: left;
+}
+
+.ke-toolbar .ke-hr {
+	overflow: hidden;
+	height: 1px;
+	clear: both;
+}
+
+/* edit */
+.ke-edit {
+	padding: 0;
+}
+
+.ke-edit-iframe,
+.ke-edit-textarea {
+	border: 0;
+	margin: 0;
+	padding: 0;
+	overflow: auto;
+}
+
+.ke-edit-textarea {
+	font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+	color: #000;
+	overflow: auto;
+	resize: none;
+}
+
+.ke-edit-textarea:focus {
+	outline: none;
+}
+
+/* statusbar */
+.ke-statusbar {
+	position: relative;
+	background-color: #F0F0EE;
+	border-top: 1px solid #CCCCCC;
+	font-size: 0;
+	line-height: 0;
+	*height: 12px;
+	overflow: hidden;
+	text-align: center;
+	cursor: s-resize;
+}
+
+.ke-statusbar-center-icon {
+	background-position: -0px -754px;
+	width: 15px;
+	height: 11px;
+	background-image: url(images/default.png);
+}
+
+.ke-statusbar-right-icon {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	cursor: se-resize;
+	background-position: -5px -741px;
+	width: 11px;
+	height: 11px;
+	background-image: url(images/default.png);
+}
+
+/* menu */
+.ke-menu {
+	border: 1px solid #A0A0A0;
+	background-color: #F1F1F1;
+	color: #222222;
+	padding: 2px;
+	font-family: "sans serif", tahoma, verdana, helvetica;
+	font-size: 12px;
+	text-align: left;
+	overflow: hidden;
+}
+
+.ke-menu-item {
+	border: 1px solid #F1F1F1;
+	background-color: #F1F1F1;
+	color: #222222;
+	height: 24px;
+	overflow: hidden;
+	cursor: pointer;
+}
+
+.ke-menu-item-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+.ke-menu-item-left {
+	width: 27px;
+	text-align: center;
+	overflow: hidden;
+}
+
+.ke-menu-item-center {
+	width: 0;
+	height: 24px;
+	border-left: 1px solid #E3E3E3;
+	border-right: 1px solid #FFFFFF;
+	border-top: 0;
+	border-bottom: 0;
+}
+
+.ke-menu-item-center-on {
+	border-left: 1px solid #E9EFF6;
+	border-right: 1px solid #E9EFF6;
+}
+
+.ke-menu-item-right {
+	border: 0;
+	padding: 0 0 0 5px;
+	line-height: 24px;
+	text-align: left;
+	overflow: hidden;
+}
+
+.ke-menu-separator {
+	margin: 2px 0;
+	height: 0;
+	overflow: hidden;
+	border-top: 1px solid #CCCCCC;
+	border-bottom: 1px solid #FFFFFF;
+	border-left: 0;
+	border-right: 0;
+}
+
+/* colorpicker */
+.ke-colorpicker {
+	border: 1px solid #A0A0A0;
+	background-color: #F1F1F1;
+	color: #222222;
+	padding: 2px;
+}
+
+.ke-colorpicker-table {
+	border: 0;
+	margin: 0;
+	padding: 0;
+	border-collapse: separate;
+}
+
+.ke-colorpicker-cell {
+	font-size: 0;
+	line-height: 0;
+	border: 1px solid #F0F0EE;
+	cursor: pointer;
+	margin: 3px;
+	padding: 0;
+}
+
+.ke-colorpicker-cell-top {
+	font-family: "sans serif", tahoma, verdana, helvetica;
+	font-size: 12px;
+	line-height: 24px;
+	border: 1px solid #F0F0EE;
+	cursor: pointer;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+}
+
+.ke-colorpicker-cell-on {
+	border: 1px solid #5690D2;
+}
+
+.ke-colorpicker-cell-selected {
+	border: 1px solid #2446AB;
+}
+
+.ke-colorpicker-cell-color {
+	width: 14px;
+	height: 14px;
+	margin: 3px;
+	padding: 0;
+	border: 0;
+}
+
+/* dialog */
+.ke-dialog {
+	position: absolute;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-dialog .ke-header {
+	width: 100%;
+	margin-bottom: 10px;
+}
+
+.ke-dialog .ke-header .ke-left {
+	float: left;
+}
+
+.ke-dialog .ke-header .ke-right {
+	float: right;
+}
+
+.ke-dialog .ke-header label {
+	margin-right: 0;
+	cursor: pointer;
+	font-weight: normal;
+	display: inline;
+	vertical-align: top;
+}
+
+.ke-dialog-content {
+	background-color: #FFF;
+	width: 100%;
+	height: 100%;
+	color: #333;
+	outline: 0;
+}
+
+.ke-dialog-header {
+	border: 0;
+	margin: 0;
+	font-weight: bold;
+	font-size: 14px;
+	background: #F8F8F8;
+	border-bottom: 1px solid #eeeeee;
+	height: 30px;
+	line-height: 30px;
+	padding: 0px 10px;
+	text-align: left;
+	color: #222;
+	cursor: move;
+	border-top-left-radius: 6px;
+	border-top-right-radius: 6px;
+
+}
+
+.ke-dialog-icon-close {
+	display: block;
+	background: url(images/default.png) no-repeat scroll 0px -688px;
+	width: 16px;
+	height: 16px;
+	position: absolute;
+	right: 6px;
+	top: 8px;
+	cursor: pointer;
+}
+
+.ke-dialog-body {
+	font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+	text-align: left;
+	overflow: hidden;
+	width: 100%;
+}
+
+.ke-dialog-body textarea {
+	display: block;
+	overflow: auto;
+	padding: 0;
+	resize: none;
+}
+
+.ke-dialog-body textarea:focus,
+.ke-dialog-body input:focus,
+.ke-dialog-body select:focus {
+	outline: none;
+}
+
+.ke-dialog-body label {
+	margin-right: 10px;
+	cursor: pointer;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	text-align: right;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-dialog-body img {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-dialog-body select {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+	width: auto;
+}
+
+.ke-dialog-body .ke-textarea {
+	display: block;
+	width: 408px;
+	height: 260px;
+	font-family: "sans serif", tahoma, verdana, helvetica;
+	font-size: 12px;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+}
+
+.ke-dialog-body .ke-form {
+	margin: 0;
+	padding: 0;
+}
+
+.ke-dialog-loading {
+	position: absolute;
+	top: 0;
+	left: 1px;
+	z-index: 1;
+	text-align: center;
+}
+
+.ke-dialog-loading-content {
+	background: url("../common/loading.gif") no-repeat;
+	color: #666;
+	font-size: 14px;
+	font-weight: bold;
+	height: 31px;
+	line-height: 31px;
+	padding-left: 36px;
+}
+
+.ke-dialog-row {
+	margin-bottom: 10px;
+}
+
+.ke-dialog-footer {
+	font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+	text-align: right;
+	padding: 0 15px 5px 0;
+	background-color: #FFF;
+	border-radius: 6px;
+	height: 45px;
+}
+
+.ke-dialog-preview,
+.ke-dialog-yes {
+	margin: 5px;
+}
+
+.ke-dialog-no {
+	margin: 5px 10px 5px 5px;
+}
+
+.ke-dialog-mask {
+	background-color: #FFF;
+	filter: alpha(opacity=50);
+	opacity: 0.5;
+}
+
+.ke-button-common {
+	display: inline-block;
+	text-align: center;
+	background: none;
+	border: none;
+	padding: 0;
+	cursor: pointer;
+}
+
+.ke-button-outer {
+	background-position: 0 -25px;
+	padding: 0;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-button {
+	color: #333;
+	font-size: 12px;
+	border: 1px solid #e6e6e6;
+	background-color: #e6e6e6;
+	padding: 5px 10px;
+	margin-top: -2px;
+	color: #444;
+	text-decoration: none;
+	transition: background-color .3s ease-out, border-color .3s ease-out;
+}
+
+.ke-button:hover {
+	border: 1px solid #d1d1d1;
+	background-color: #d1d1d1;
+}
+
+.ke-dialog-btn {
+	font-size: 12px;
+	margin: 5px;
+	background: #2e8ded;
+	color: #fff !important;
+	padding: 8px 12px;
+	display: inline-block;
+	border-radius: 2px;
+	cursor: pointer;
+	text-decoration: none;
+	transition: .3s ease-out;
+}
+
+.ke-dialog-btn:hover {
+	filter: alpha(opacity=80);
+	box-shadow: none;
+	box-shadow: none;
+	opacity: .8;
+}
+
+/* inputbox */
+.ke-input-text {
+	display: inline-block !important;
+	width: 400px;
+	border: 1px solid #cccccc;
+	height: 20px;
+	line-height: 18px;
+	font-size: 14px;
+	padding: 3px;
+	margin: 0;
+	outline: 0;
+	*display: inline;
+}
+
+.ke-input-text:focus {
+	border-color: #66afe9;
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+}
+
+.ke-input-number {
+	width: 50px;
+}
+
+.ke-input-color {
+	border: 1px solid #A0A0A0;
+	background-color: #FFFFFF;
+	font-size: 12px;
+	width: 60px;
+	height: 20px;
+	line-height: 20px;
+	padding-left: 5px;
+	overflow: hidden;
+	cursor: pointer;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+
+.ke-upload-button {
+	position: relative;
+	top: -1px;
+}
+
+.ke-upload-area {
+	position: relative;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+	*height: 25px;
+}
+
+.ke-upload-area .ke-upload-file {
+	position: absolute;
+	font-size: 60px;
+	top: 0;
+	right: 0;
+	padding: 0;
+	margin: 0;
+	z-index: 811212;
+	border: 0 none;
+	opacity: 0;
+	cursor: pointer;
+	width: 50px;
+	height: 30px;
+	filter: alpha(opacity=0);
+}
+
+.ke-upload-area .ke-button {
+	padding: 6px 15px;
+}
+
+/* tabs */
+.ke-tabs {
+	font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+	border-bottom: 1px solid #cccccc;
+	padding-left: 5px;
+	margin-bottom: 20px;
+}
+
+.ke-tabs-ul {
+	list-style-image: none;
+	list-style-position: outside;
+	list-style-type: none;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-tabs-li {
+	position: relative;
+
+	margin: 0 2px -1px 0;
+	padding: 0 20px;
+	float: left;
+	line-height: 25px;
+	text-align: center;
+	color: #337ab7;
+	cursor: pointer;
+}
+
+.ke-tabs-li-selected {
+	background-color: #FFF;
+	border: 1px solid #cccccc;
+	border-bottom: 1px solid #FFF;
+	color: #555555;
+	cursor: default;
+	border-top-left-radius: 3px;
+	border-top-right-radius: 3px;
+}
+
+.ke-tabs-li-on {
+	background-color: #FFF;
+	color: #000;
+}
+
+/* progressbar */
+.ke-progressbar {
+	position: relative;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-progressbar-bar {
+	border: 1px solid #6FA5DB;
+	width: 80px;
+	height: 5px;
+	margin: 10px 10px 0 10px;
+	padding: 0;
+}
+
+.ke-progressbar-bar-inner {
+	width: 0;
+	height: 5px;
+	background-color: #6FA5DB;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-progressbar-percent {
+	position: absolute;
+	top: 0;
+	left: 40%;
+	display: none;
+}
+
+/* swfupload */
+.ke-swfupload-top {
+	position: relative;
+	margin-bottom: 10px;
+	_width: 608px;
+}
+
+.ke-swfupload-button {
+	height: 23px;
+	line-height: 23px;
+}
+
+.ke-swfupload-desc {
+	padding: 0 10px;
+	height: 23px;
+	line-height: 23px;
+}
+
+.ke-swfupload-startupload {
+	position: absolute;
+	top: 0;
+	right: 0;
+}
+
+.ke-swfupload-body {
+	overflow: scroll;
+	background-color: #FFFFFF;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+	width: auto;
+	height: 370px;
+	padding: 5px;
+}
+
+.ke-swfupload-body .ke-item {
+	width: 100px;
+	margin: 5px;
+}
+
+.ke-swfupload-body .ke-photo {
+	position: relative;
+	border: 1px solid #DDDDDD;
+	background-color: #FFFFFF;
+	padding: 10px;
+}
+
+.ke-swfupload-body .ke-delete {
+	display: block;
+	background: url(images/default.png) no-repeat scroll 0px -688px;
+	width: 16px;
+	height: 16px;
+	position: absolute;
+	right: 0;
+	top: 0;
+	cursor: pointer;
+}
+
+.ke-swfupload-body .ke-status {
+	position: absolute;
+	left: 0;
+	bottom: 5px;
+	width: 100px;
+	height: 17px;
+}
+
+.ke-swfupload-body .ke-message {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height: 17px;
+}
+
+.ke-swfupload-body .ke-error {
+	color: red;
+}
+
+.ke-swfupload-body .ke-name {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height: 16px;
+}
+
+.ke-swfupload-body .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+/* emoticons */
+.ke-plugin-emoticons {
+	position: relative;
+}
+
+.ke-plugin-emoticons .ke-preview {
+	position: absolute;
+	text-align: center;
+	margin: 2px;
+	padding: 10px;
+	top: 0;
+	border: 1px solid #A0A0A0;
+	background-color: #FFFFFF;
+	display: none;
+}
+
+.ke-plugin-emoticons .ke-preview-img {
+	border: 0;
+	margin: 0;
+	padding: 0;
+}
+
+.ke-plugin-emoticons .ke-table {
+	border: 0;
+	margin: 0;
+	padding: 0;
+	border-collapse: separate;
+}
+
+.ke-plugin-emoticons .ke-cell {
+	margin: 0;
+	padding: 1px;
+	border: 1px solid #F0F0EE;
+	cursor: pointer;
+}
+
+.ke-plugin-emoticons .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+.ke-plugin-emoticons .ke-img {
+	display: block;
+	background-repeat: no-repeat;
+	overflow: hidden;
+	margin: 2px;
+	width: 24px;
+	height: 24px;
+	margin: 0;
+	padding: 0;
+	border: 0;
+}
+
+.ke-plugin-emoticons .ke-page {
+	text-align: right;
+	margin: 5px;
+	padding: 0;
+	border: 0;
+	font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+	color: #333;
+	text-decoration: none;
+}
+
+.ke-plugin-plainpaste-textarea,
+.ke-plugin-wordpaste-iframe {
+	display: block;
+	width: 408px;
+	height: 260px;
+	font-family: "sans serif", tahoma, verdana, helvetica;
+	font-size: 12px;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+}
+
+/* filemanager */
+.ke-plugin-filemanager-header {
+	width: 100%;
+	margin-bottom: 10px;
+}
+
+.ke-plugin-filemanager-header .ke-left {
+	float: left;
+}
+
+.ke-plugin-filemanager-header .ke-right {
+	float: right;
+}
+
+.ke-plugin-filemanager-body {
+	overflow: scroll;
+	background-color: #FFFFFF;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+	width: auto;
+	height: 370px;
+	padding: 5px;
+}
+
+.ke-plugin-filemanager-body .ke-item {
+	width: 100px;
+	margin: 5px;
+}
+
+.ke-plugin-filemanager-body .ke-photo {
+	border: 1px solid #DDDDDD;
+	background-color: #FFFFFF;
+	padding: 10px;
+}
+
+.ke-plugin-filemanager-body .ke-name {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height: 16px;
+}
+
+.ke-plugin-filemanager-body .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+.ke-plugin-filemanager-body .ke-table {
+	width: 95%;
+	border: 0;
+	margin: 0;
+	padding: 0;
+	border-collapse: separate;
+}
+
+.ke-plugin-filemanager-body .ke-table .ke-cell {
+	margin: 0;
+	padding: 0;
+	border: 0;
+}
+
+.ke-plugin-filemanager-body .ke-table .ke-name {
+	width: 55%;
+	text-align: left;
+}
+
+.ke-plugin-filemanager-body .ke-table .ke-size {
+	width: 15%;
+	text-align: left;
+}
+
+.ke-plugin-filemanager-body .ke-table .ke-datetime {
+	width: 30%;
+	text-align: center;
+}
+
+.ke-dialog-content-inner {
+	padding: 10px 20px;
+}
+.ke-dialog-content-inner .row-left {
+	float: left;
+}
+.ke-dialog-content-inner .row-right {
+	float: left;
+}
+.ke-dialog-default {
+	box-shadow: 0 5px 15px rgba(0, 0, 0, .2) !important;
+	border: 1px solid #999 !important;
+	border: 1px solid rgba(0, 0, 0, .2) !important;
+	border-radius: 6px;
+	outline: 0;
+	zoom: 1;
+	overflow: hidden;
+}
diff --git a/public/assets/addons/nkeditor/themes/default/editor.min.css b/public/assets/addons/nkeditor/themes/default/editor.min.css
new file mode 100644
index 0000000..cb8de2d
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/default/editor.min.css
@@ -0,0 +1 @@
+.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-clearfix{zoom:1}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-dialog a,.ke-dialog a:hover,.ke-menu a,.ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-icon-source{background-position:0 0;width:16px;height:16px}.ke-icon-preview{background-position:0 -16px;width:16px;height:16px}.ke-icon-print{background-position:0 -32px;width:16px;height:16px}.ke-icon-undo{background-position:0 -48px;width:16px;height:16px}.ke-icon-redo{background-position:0 -64px;width:16px;height:16px}.ke-icon-cut{background-position:0 -80px;width:16px;height:16px}.ke-icon-copy{background-position:0 -96px;width:16px;height:16px}.ke-icon-paste{background-position:0 -112px;width:16px;height:16px}.ke-icon-selectall{background-position:0 -128px;width:16px;height:16px}.ke-icon-justifyleft{background-position:0 -144px;width:16px;height:16px}.ke-icon-justifycenter{background-position:0 -160px;width:16px;height:16px}.ke-icon-justifyright{background-position:0 -176px;width:16px;height:16px}.ke-icon-justifyfull{background-position:0 -192px;width:16px;height:16px}.ke-icon-insertorderedlist{background-position:0 -208px;width:16px;height:16px}.ke-icon-insertunorderedlist{background-position:0 -224px;width:16px;height:16px}.ke-icon-indent{background-position:0 -240px;width:16px;height:16px}.ke-icon-outdent{background-position:0 -256px;width:16px;height:16px}.ke-icon-subscript{background-position:0 -272px;width:16px;height:16px}.ke-icon-superscript{background-position:0 -288px;width:16px;height:16px}.ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-icon-formatblock{background-position:0 -336px;width:25px;height:16px}.ke-icon-fontname{background-position:0 -352px;width:21px;height:16px}.ke-icon-fontsize{background-position:0 -368px;width:23px;height:16px}.ke-icon-forecolor{background-position:0 -384px;width:20px;height:16px}.ke-icon-hilitecolor{background-position:0 -400px;width:23px;height:16px}.ke-icon-bold{background-position:0 -416px;width:16px;height:16px}.ke-icon-italic{background-position:0 -432px;width:16px;height:16px}.ke-icon-underline{background-position:0 -448px;width:16px;height:16px}.ke-icon-strikethrough{background-position:0 -464px;width:16px;height:16px}.ke-icon-removeformat{background-position:0 -480px;width:16px;height:16px}.ke-icon-image{background-position:0 -496px;width:16px;height:16px}.ke-icon-flash{background-position:0 -512px;width:16px;height:16px}.ke-icon-media{background-position:0 -528px;width:16px;height:16px}.ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-icon-hr{background-position:0 -592px;width:16px;height:16px}.ke-icon-emoticons{background-position:0 -608px;width:16px;height:16px}.ke-icon-link{background-position:0 -624px;width:16px;height:16px}.ke-icon-unlink{background-position:0 -640px;width:16px;height:16px}.ke-icon-fullscreen{background-position:0 -656px;width:16px;height:16px}.ke-icon-about{background-position:0 -672px;width:16px;height:16px}.ke-icon-plainpaste{background-position:0 -704px;width:16px;height:16px}.ke-icon-wordpaste{background-position:0 -720px;width:16px;height:16px}.ke-icon-table{background-position:0 -784px;width:16px;height:16px}.ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-icon-tableinsert{background-position:0 -784px;width:16px;height:16px}.ke-icon-tabledelete{background-position:0 -800px;width:16px;height:16px}.ke-icon-tablecolinsertleft{background-position:0 -816px;width:16px;height:16px}.ke-icon-tablecolinsertright{background-position:0 -832px;width:16px;height:16px}.ke-icon-tablerowinsertabove{background-position:0 -848px;width:16px;height:16px}.ke-icon-tablerowinsertbelow{background-position:0 -864px;width:16px;height:16px}.ke-icon-tablecoldelete{background-position:0 -880px;width:16px;height:16px}.ke-icon-tablerowdelete{background-position:0 -896px;width:16px;height:16px}.ke-icon-tablecellprop{background-position:0 -912px;width:16px;height:16px}.ke-icon-tableprop{background-position:0 -928px;width:16px;height:16px}.ke-icon-checked{background-position:0 -944px;width:16px;height:16px}.ke-icon-code{background-position:0 -960px;width:16px;height:16px}.ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-icon-baidumap{background-position:0 -976px;width:16px;height:16px}.ke-icon-lineheight{background-position:0 -992px;width:16px;height:16px}.ke-icon-clearhtml{background-position:0 -1008px;width:16px;height:16px}.ke-icon-pagebreak{background-position:0 -1024px;width:16px;height:16px}.ke-icon-insertfile{background-position:0 -1040px;width:16px;height:16px}.ke-icon-quickformat{background-position:0 -1056px;width:16px;height:16px}.ke-icon-template{background-position:0 -1072px;width:16px;height:16px}.ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-icon-tablerowmerge{background-position:0 -1104px;width:16px;height:16px}.ke-icon-tablerowsplit{background-position:0 -1120px;width:16px;height:16px}.ke-icon-tablecolmerge{background-position:0 -1136px;width:16px;height:16px}.ke-icon-tablecolsplit{background-position:0 -1152px;width:16px;height:16px}.ke-icon-anchor{background-position:0 -1168px;width:16px;height:16px}.ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-icon-multiimage{background-position:0 -1232px;width:16px;height:16px}.ke-icon-graft{background:url(images/scrawl.png)!important;width:16px;height:16px}.ke-container{display:block;border:1px solid #ccc;background-color:#fff;overflow:hidden;margin:0;padding:0}.ke-toolbar{border-bottom:1px solid #ccc;background-color:#fff;padding:2px 5px;text-align:left;overflow:hidden;zoom:1}.ke-toolbar-icon{background-repeat:no-repeat;font-size:0;line-height:0;overflow:hidden;display:block}.ke-toolbar-icon-url{background-image:url(images/default.png)}.ke-toolbar .ke-outline{border:1px solid #f0f0ee;margin:1px;padding:1px 2px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-toolbar .ke-on{border:1px solid #5690d2}.ke-toolbar .ke-selected{border:1px solid #5690d2;background-color:#e9eff6}.ke-toolbar .ke-disabled{cursor:default}.ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-toolbar .ke-hr{overflow:hidden;height:1px;clear:both}.ke-edit{padding:0}.ke-edit-iframe,.ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-edit-textarea:focus{outline:0}.ke-statusbar{position:relative;background-color:#f0f0ee;border-top:1px solid #ccc;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize}.ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px;background-image:url(images/default.png)}.ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;background-position:-5px -741px;width:11px;height:11px;background-image:url(images/default.png)}.ke-menu{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #ccc;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f0f0ee;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-dialog{position:absolute;margin:0;padding:0}.ke-dialog .ke-header{width:100%;margin-bottom:10px}.ke-dialog .ke-header .ke-left{float:left}.ke-dialog .ke-header .ke-right{float:right}.ke-dialog .ke-header label{margin-right:0;cursor:pointer;font-weight:400;display:inline;vertical-align:top}.ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0}.ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;background:#f8f8f8;border-bottom:1px solid #eee;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px}.ke-dialog-icon-close{display:block;background:url(images/default.png) no-repeat scroll 0 -688px;width:16px;height:16px;position:absolute;right:6px;top:8px;cursor:pointer}.ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog-body input:focus,.ke-dialog-body select:focus,.ke-dialog-body textarea:focus{outline:0}.ke-dialog-body label{margin-right:10px;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog-body img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog-body select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto}.ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border-color:#848484 #e0e0e0 #e0e0e0 #848484;border-style:solid;border-width:1px}.ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog-row{margin-bottom:10px}.ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;border-radius:6px;height:45px}.ke-dialog-preview,.ke-dialog-yes{margin:5px}.ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:5px 10px;margin-top:-2px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-button:hover{border:1px solid #d1d1d1;background-color:#d1d1d1}.ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-input-text{display:inline-block!important;width:400px;border:1px solid #ccc;height:20px;line-height:18px;font-size:14px;padding:3px;margin:0;outline:0}.ke-input-text:focus{border-color:#66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.ke-input-number{width:50px}.ke-input-color{border:1px solid #a0a0a0;background-color:#fff;font-size:12px;width:60px;height:20px;line-height:20px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-upload-button{position:relative;top:-1px}.ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0}.ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:50px;height:30px}.ke-upload-area .ke-button{padding:6px 15px}.ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #ccc;padding-left:5px;margin-bottom:20px}.ke-tabs-ul{list-style-image:none;list-style-position:outside;list-style-type:none;margin:0;padding:0}.ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-tabs-li-selected{background-color:#fff;border:1px solid #ccc;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-tabs-li-on{background-color:#fff;color:#000}.ke-progressbar{position:relative;margin:0;padding:0}.ke-progressbar-bar{border:1px solid #6fa5db;width:80px;height:5px;margin:10px 10px 0 10px;padding:0}.ke-progressbar-bar-inner{width:0;height:5px;background-color:#6fa5db;overflow:hidden;margin:0;padding:0}.ke-progressbar-percent{position:absolute;top:0;left:40%;display:none}.ke-swfupload-top{position:relative;margin-bottom:10px}.ke-swfupload-button{height:23px;line-height:23px}.ke-swfupload-desc{padding:0 10px;height:23px;line-height:23px}.ke-swfupload-startupload{position:absolute;top:0;right:0}.ke-swfupload-body{overflow:scroll;background-color:#fff;border-color:#848484 #e0e0e0 #e0e0e0 #848484;border-style:solid;border-width:1px;width:auto;height:370px;padding:5px}.ke-swfupload-body .ke-item{width:100px;margin:5px}.ke-swfupload-body .ke-photo{position:relative;border:1px solid #ddd;background-color:#fff;padding:10px}.ke-swfupload-body .ke-delete{display:block;background:url(images/default.png) no-repeat scroll 0 -688px;width:16px;height:16px;position:absolute;right:0;top:0;cursor:pointer}.ke-swfupload-body .ke-status{position:absolute;left:0;bottom:5px;width:100px;height:17px}.ke-swfupload-body .ke-message{width:100px;text-align:center;overflow:hidden;height:17px}.ke-swfupload-body .ke-error{color:red}.ke-swfupload-body .ke-name{width:100px;text-align:center;overflow:hidden;height:16px}.ke-swfupload-body .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-plugin-emoticons{position:relative}.ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-plugin-emoticons .ke-preview-img{border:0;margin:0;padding:0}.ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-plugin-emoticons .ke-cell{margin:0;padding:1px;border:1px solid #f0f0ee;cursor:pointer}.ke-plugin-emoticons .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-plugin-emoticons .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-plugin-plainpaste-textarea,.ke-plugin-wordpaste-iframe{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border-color:#848484 #e0e0e0 #e0e0e0 #848484;border-style:solid;border-width:1px}.ke-plugin-filemanager-header{width:100%;margin-bottom:10px}.ke-plugin-filemanager-header .ke-left{float:left}.ke-plugin-filemanager-header .ke-right{float:right}.ke-plugin-filemanager-body{overflow:scroll;background-color:#fff;border-color:#848484 #e0e0e0 #e0e0e0 #848484;border-style:solid;border-width:1px;width:auto;height:370px;padding:5px}.ke-plugin-filemanager-body .ke-item{width:100px;margin:5px}.ke-plugin-filemanager-body .ke-photo{border:1px solid #ddd;background-color:#fff;padding:10px}.ke-plugin-filemanager-body .ke-name{width:100px;text-align:center;overflow:hidden;height:16px}.ke-plugin-filemanager-body .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-plugin-filemanager-body .ke-table{width:95%;border:0;margin:0;padding:0;border-collapse:separate}.ke-plugin-filemanager-body .ke-table .ke-cell{margin:0;padding:0;border:0}.ke-plugin-filemanager-body .ke-table .ke-name{width:55%;text-align:left}.ke-plugin-filemanager-body .ke-table .ke-size{width:15%;text-align:left}.ke-plugin-filemanager-body .ke-table .ke-datetime{width:30%;text-align:center}.ke-dialog-content-inner{padding:10px 20px}.ke-dialog-content-inner .row-left{float:left}.ke-dialog-content-inner .row-right{float:left}.ke-dialog-default{box-shadow:0 5px 15px rgba(0,0,0,.2)!important;border:1px solid #999!important;border:1px solid rgba(0,0,0,.2)!important;border-radius:6px;outline:0;zoom:1;overflow:hidden}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/default/images/background.png b/public/assets/addons/nkeditor/themes/default/images/background.png
new file mode 100644
index 0000000..e59bd68
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/default/images/background.png differ
diff --git a/public/assets/addons/nkeditor/themes/default/images/default.png b/public/assets/addons/nkeditor/themes/default/images/default.png
new file mode 100644
index 0000000..cc9e72d
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/default/images/default.png differ
diff --git a/public/assets/addons/nkeditor/themes/default/images/scrawl.png b/public/assets/addons/nkeditor/themes/default/images/scrawl.png
new file mode 100644
index 0000000..58e04ec
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/default/images/scrawl.png differ
diff --git a/public/assets/addons/nkeditor/themes/grey/editor.css b/public/assets/addons/nkeditor/themes/grey/editor.css
new file mode 100644
index 0000000..beb0eae
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/grey/editor.css
@@ -0,0 +1,822 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+.ke-container-grey .ke-toolbar {
+  border-top: 5px solid #8a8a8a;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  background-clip: padding-box;
+  text-rendering: optimizelegibility; }
+  .ke-container-grey .ke-toolbar .ke-toolbar-icon {
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-container-grey .ke-toolbar .ke-icon-source {
+    background-position: 0 0px; }
+  .ke-container-grey .ke-toolbar .ke-icon-preview {
+    background-position: 0 -63px; }
+  .ke-container-grey .ke-toolbar .ke-icon-print {
+    background-position: 0 -84px; }
+  .ke-container-grey .ke-toolbar .ke-icon-undo {
+    background-position: 0 -21px; }
+  .ke-container-grey .ke-toolbar .ke-icon-redo {
+    background-position: 0 -42px; }
+  .ke-container-grey .ke-toolbar .ke-icon-template {
+    background-position: 0 -105px; }
+  .ke-container-grey .ke-toolbar .ke-icon-cut {
+    background-position: 0 -147px; }
+  .ke-container-grey .ke-toolbar .ke-icon-copy {
+    background-position: 0 -168px; }
+  .ke-container-grey .ke-toolbar .ke-icon-paste {
+    background-position: 0 -189px; }
+  .ke-container-grey .ke-toolbar .ke-icon-selectall {
+    background-position: 0 -483px; }
+  .ke-container-grey .ke-toolbar .ke-icon-justifyleft {
+    background-position: 0 -252px; }
+  .ke-container-grey .ke-toolbar .ke-icon-justifycenter {
+    background-position: 0 -273px; }
+  .ke-container-grey .ke-toolbar .ke-icon-justifyright {
+    background-position: 0 -294px; }
+  .ke-container-grey .ke-toolbar .ke-icon-justifyfull {
+    background-position: 0 -315px; }
+  .ke-container-grey .ke-toolbar .ke-icon-insertorderedlist {
+    background-position: 0 -336px; }
+  .ke-container-grey .ke-toolbar .ke-icon-insertunorderedlist {
+    background-position: 0 -357px; }
+  .ke-container-grey .ke-toolbar .ke-icon-indent {
+    background-position: 0 -378px; }
+  .ke-container-grey .ke-toolbar .ke-icon-outdent {
+    background-position: 0 -399px; }
+  .ke-container-grey .ke-toolbar .ke-icon-subscript {
+    background-position: 0 -420px; }
+  .ke-container-grey .ke-toolbar .ke-icon-superscript {
+    background-position: 0 -441px; }
+  .ke-container-grey .ke-toolbar .ke-icon-date {
+    background-position: 0px -304px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-time {
+    background-position: 0px -320px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-formatblock {
+    background-position: 0 -546px; }
+  .ke-container-grey .ke-toolbar .ke-icon-fontname {
+    background-position: 0 -567px; }
+  .ke-container-grey .ke-toolbar .ke-icon-fontsize {
+    background-position: 0 -588px; }
+  .ke-container-grey .ke-toolbar .ke-icon-forecolor {
+    background-position: 0 -609px; }
+  .ke-container-grey .ke-toolbar .ke-icon-hilitecolor {
+    background-position: 0 -630px; }
+  .ke-container-grey .ke-toolbar .ke-icon-bold {
+    background-position: 0 -651px; }
+  .ke-container-grey .ke-toolbar .ke-icon-italic {
+    background-position: 0 -672px; }
+  .ke-container-grey .ke-toolbar .ke-icon-underline {
+    background-position: 0 -693px; }
+  .ke-container-grey .ke-toolbar .ke-icon-strikethrough {
+    background-position: 0 -714px; }
+  .ke-container-grey .ke-toolbar .ke-icon-removeformat {
+    background-position: 0 -756px; }
+  .ke-container-grey .ke-toolbar .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-container-grey .ke-toolbar .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-container-grey .ke-toolbar .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-container-grey .ke-toolbar .ke-icon-div {
+    background-position: 0px -544px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-formula {
+    background-position: 0px -576px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-hr {
+    background-position: 0 -924px; }
+  .ke-container-grey .ke-toolbar .ke-icon-emoticons {
+    background-position: 0 -945px; }
+  .ke-container-grey .ke-toolbar .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-container-grey .ke-toolbar .ke-icon-unlink {
+    background-position: 0 -1029px; }
+  .ke-container-grey .ke-toolbar .ke-icon-fullscreen {
+    background-position: 0 -525px; }
+  .ke-container-grey .ke-toolbar .ke-icon-about {
+    background-position: 0 -1092px; }
+  .ke-container-grey .ke-toolbar .ke-icon-quote {
+    background-position: 0 -1114px; }
+  .ke-container-grey .ke-toolbar .ke-icon-plainpaste {
+    background-position: 0 -210px; }
+  .ke-container-grey .ke-toolbar .ke-icon-wordpaste {
+    background-position: 0 -231px; }
+  .ke-container-grey .ke-toolbar .ke-icon-table {
+    background-position: 0px -903px;
+    width: 18px !important; }
+  .ke-container-grey .ke-toolbar .ke-icon-tablemenu {
+    background-position: 0px -768px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-code {
+    background-position: 0 -126px; }
+  .ke-container-grey .ke-toolbar .ke-icon-map {
+    background-position: 0px -976px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-baidumap {
+    background-position: 0 -1050px; }
+  .ke-container-grey .ke-toolbar .ke-icon-lineheight {
+    background-position: 0 -735px; }
+  .ke-container-grey .ke-toolbar .ke-icon-clearhtml {
+    background-position: 0 -462px; }
+  .ke-container-grey .ke-toolbar .ke-icon-pagebreak {
+    background-position: 0 -966px; }
+  .ke-container-grey .ke-toolbar .ke-icon-insertfile {
+    background-position: 0 -882px; }
+  .ke-container-grey .ke-toolbar .ke-icon-quickformat {
+    background-position: 0 -504px; }
+  .ke-container-grey .ke-toolbar .ke-icon-anchor {
+    background-position: 0 -987px; }
+  .ke-container-grey .ke-toolbar .ke-icon-search {
+    background-position: 0px -1184px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-new {
+    background-position: 0px -1200px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-specialchar {
+    background-position: 0px -1216px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-grey .ke-toolbar .ke-icon-multiimage {
+    background-position: 0 -798px; }
+  .ke-container-grey .ke-toolbar .ke-icon-graft {
+    background-position: 0 -819px; }
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-grey .ke-menu-item .ke-menu-item-left {
+  width: 27px;
+  text-align: center;
+  overflow: hidden; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert {
+    background-position: 0 -903px;
+    width: 18px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete {
+    background-position: 0 -1428px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft {
+    background-position: 0 -1176px;
+    width: 18px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright {
+    background-position: 0 -1323px;
+    width: 18px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove {
+    background-position: 0 -1302px;
+    width: 22px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow {
+    background-position: 0 -1155px;
+    width: 22px !important; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete {
+    background-position: 0 -1239px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete {
+    background-position: 0 -1260px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop {
+    background-position: 0 -1218px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tableprop {
+    background-position: 0 -1134px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit {
+    background-position: 0px -1088px;
+    width: 16px;
+    height: 16px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge {
+    background-position: -1px -1197px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge {
+    background-position: -4px -1365px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-checked {
+    background-position: 0 -1407px; }
+
+/*# sourceMappingURL=editor.css.map */
diff --git a/public/assets/addons/nkeditor/themes/grey/editor.css.map b/public/assets/addons/nkeditor/themes/grey/editor.css.map
new file mode 100644
index 0000000..01a6d6f
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/grey/editor.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../common/common.scss","editor.scss"],
+"names": [],
+"file": "editor.css"
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/grey/editor.min.css b/public/assets/addons/nkeditor/themes/grey/editor.min.css
new file mode 100644
index 0000000..34fe061
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/grey/editor.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ke-clearfix{zoom:1;clear:both}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-dialog-lock{background-color:#fff;opacity:.5;z-index:811213;left:0;top:0;position:absolute}.ke-container{display:block;background-color:#fff;overflow:hidden;margin:0;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16)}.ke-container .ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-container .ke-dialog a,.ke-container .ke-dialog a:hover,.ke-container .ke-menu a,.ke-container .ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-container .ke-toolbar{text-align:left;overflow:hidden;zoom:1;padding:0 5px}.ke-container .ke-toolbar .ke-outline{padding:10px 5px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-container .ke-toolbar .ke-outline .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px}.ke-container .ke-toolbar .ke-on{background:#ebebeb}.ke-container .ke-toolbar .ke-selected{background-color:#ebebeb}.ke-container .ke-toolbar .ke-disabled{cursor:default}.ke-container .ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-container .ke-toolbar .ke-hr{clear:both;height:1px;width:calc(100% - (2 * 2px));background:#ebebeb}.ke-container .ke-edit{padding:0}.ke-container .ke-edit .ke-edit-iframe,.ke-container .ke-edit .ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-container .ke-edit .ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-container .ke-edit .ke-edit-textarea:focus{outline:0}.ke-container .ke-statusbar{position:relative;background-color:#f5f5f5;border-top:1px solid #e1e1e1;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize;display:none}.ke-container .ke-statusbar .ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px}.ke-container .ke-statusbar .ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;width:11px;height:11px}.ke-menu{border:1px solid #ccc;background-color:#f5f5f5;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu .ke-menu-item .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-inline-block .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu .ke-menu-item .ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu .ke-menu-item .ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #e1e1e1;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-menu .ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons{position:relative}.ke-menu .ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img{border:0;margin:0;padding:0}.ke-menu .ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell{margin:0;padding:1px;border:1px solid #f5f5f5;cursor:pointer}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-menu .ke-plugin-emoticons .ke-table .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker .ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f1f1f1;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-dialog{margin:0;padding:0;border:1px solid #ccc;zoom:1;box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden}.ke-dialog .ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom:1px solid #c6c6c6;background:transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.ke-dialog .ke-dialog-header .ke-dialog-icon-close{height:20px;width:20px;cursor:pointer;background:url(../common/icons-all.gif) 0 -59px;position:absolute;right:5px;top:4px}.ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover{background-position:0 -89px}.ke-dialog .ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border:1px solid #ccc}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus{border-color:#66afe9;outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto;border:1px solid #ccc;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number{width:50px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox{position:relative;top:6px}.ke-dialog .ke-dialog-content .ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus{outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text{display:inline-block!important;max-width:400px;height:30px;line-height:30px;border:1px solid #ccc;font-size:14px;margin:0;outline:0;padding:0 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus{border-color:#66afe9}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color{border:1px solid #e1e1e1;background-color:#fff;font-size:12px;width:60px;height:30px;line-height:30px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0;top:-1px;position:relative}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:62px;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common{top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button{padding:8px 15px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner{padding:10px 20px 0 20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row{border:1px solid #fff;margin-bottom:10px;overflow:hidden}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left{float:left;height:30px;line-height:30px;width:60px;text-align:right}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right{float:left;text-align:left}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button{position:relative;top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label{cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header{height:30px;line-height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text{height:22px;line-height:22px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button{padding:3px 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox{margin-left:10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #e1e1e1;margin-bottom:20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul{list-style:none outside none;margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected{background-color:#fff;border:1px solid #e1e1e1;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on{background-color:#fff;color:#000}.ke-dialog .ke-dialog-content .ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat center;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog .ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;height:40px}.ke-dialog .ke-dialog-footer .ke-dialog-yes{margin:5px}.ke-dialog .ke-dialog-footer .ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog .ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-dialog .ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:7px 10px;margin-top:-4px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-dialog .ke-button:hover{border:1px solid #e1e1e1;background-color:#e1e1e1}.ke-dialog .ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog .ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-container-grey .ke-toolbar{border-top:5px solid #8a8a8a;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);background-clip:padding-box;text-rendering:optimizelegibility}.ke-container-grey .ke-toolbar .ke-toolbar-icon{background:url(images/nkeditor.svg) no-repeat}.ke-container-grey .ke-toolbar .ke-icon-source{background-position:0 0}.ke-container-grey .ke-toolbar .ke-icon-preview{background-position:0 -63px}.ke-container-grey .ke-toolbar .ke-icon-print{background-position:0 -84px}.ke-container-grey .ke-toolbar .ke-icon-undo{background-position:0 -21px}.ke-container-grey .ke-toolbar .ke-icon-redo{background-position:0 -42px}.ke-container-grey .ke-toolbar .ke-icon-template{background-position:0 -105px}.ke-container-grey .ke-toolbar .ke-icon-cut{background-position:0 -147px}.ke-container-grey .ke-toolbar .ke-icon-copy{background-position:0 -168px}.ke-container-grey .ke-toolbar .ke-icon-paste{background-position:0 -189px}.ke-container-grey .ke-toolbar .ke-icon-selectall{background-position:0 -483px}.ke-container-grey .ke-toolbar .ke-icon-justifyleft{background-position:0 -252px}.ke-container-grey .ke-toolbar .ke-icon-justifycenter{background-position:0 -273px}.ke-container-grey .ke-toolbar .ke-icon-justifyright{background-position:0 -294px}.ke-container-grey .ke-toolbar .ke-icon-justifyfull{background-position:0 -315px}.ke-container-grey .ke-toolbar .ke-icon-insertorderedlist{background-position:0 -336px}.ke-container-grey .ke-toolbar .ke-icon-insertunorderedlist{background-position:0 -357px}.ke-container-grey .ke-toolbar .ke-icon-indent{background-position:0 -378px}.ke-container-grey .ke-toolbar .ke-icon-outdent{background-position:0 -399px}.ke-container-grey .ke-toolbar .ke-icon-subscript{background-position:0 -420px}.ke-container-grey .ke-toolbar .ke-icon-superscript{background-position:0 -441px}.ke-container-grey .ke-toolbar .ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-formatblock{background-position:0 -546px}.ke-container-grey .ke-toolbar .ke-icon-fontname{background-position:0 -567px}.ke-container-grey .ke-toolbar .ke-icon-fontsize{background-position:0 -588px}.ke-container-grey .ke-toolbar .ke-icon-forecolor{background-position:0 -609px}.ke-container-grey .ke-toolbar .ke-icon-hilitecolor{background-position:0 -630px}.ke-container-grey .ke-toolbar .ke-icon-bold{background-position:0 -651px}.ke-container-grey .ke-toolbar .ke-icon-italic{background-position:0 -672px}.ke-container-grey .ke-toolbar .ke-icon-underline{background-position:0 -693px}.ke-container-grey .ke-toolbar .ke-icon-strikethrough{background-position:0 -714px}.ke-container-grey .ke-toolbar .ke-icon-removeformat{background-position:0 -756px}.ke-container-grey .ke-toolbar .ke-icon-image{background-position:0 -777px}.ke-container-grey .ke-toolbar .ke-icon-flash{background-position:0 -840px}.ke-container-grey .ke-toolbar .ke-icon-media{background-position:0 -861px}.ke-container-grey .ke-toolbar .ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-hr{background-position:0 -924px}.ke-container-grey .ke-toolbar .ke-icon-emoticons{background-position:0 -945px}.ke-container-grey .ke-toolbar .ke-icon-link{background-position:0 -1008px}.ke-container-grey .ke-toolbar .ke-icon-unlink{background-position:0 -1029px}.ke-container-grey .ke-toolbar .ke-icon-fullscreen{background-position:0 -525px}.ke-container-grey .ke-toolbar .ke-icon-about{background-position:0 -1092px}.ke-container-grey .ke-toolbar .ke-icon-quote{background-position:0 -1114px}.ke-container-grey .ke-toolbar .ke-icon-plainpaste{background-position:0 -210px}.ke-container-grey .ke-toolbar .ke-icon-wordpaste{background-position:0 -231px}.ke-container-grey .ke-toolbar .ke-icon-table{background-position:0 -903px;width:18px!important}.ke-container-grey .ke-toolbar .ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-code{background-position:0 -126px}.ke-container-grey .ke-toolbar .ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-baidumap{background-position:0 -1050px}.ke-container-grey .ke-toolbar .ke-icon-lineheight{background-position:0 -735px}.ke-container-grey .ke-toolbar .ke-icon-clearhtml{background-position:0 -462px}.ke-container-grey .ke-toolbar .ke-icon-pagebreak{background-position:0 -966px}.ke-container-grey .ke-toolbar .ke-icon-insertfile{background-position:0 -882px}.ke-container-grey .ke-toolbar .ke-icon-quickformat{background-position:0 -504px}.ke-container-grey .ke-toolbar .ke-icon-anchor{background-position:0 -987px}.ke-container-grey .ke-toolbar .ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-container-grey .ke-toolbar .ke-icon-multiimage{background-position:0 -798px}.ke-container-grey .ke-toolbar .ke-icon-graft{background-position:0 -819px}.ke-menu-grey .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px;background:url(images/nkeditor.svg) no-repeat}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert{background-position:0 -903px;width:18px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete{background-position:0 -1428px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft{background-position:0 -1176px;width:18px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright{background-position:0 -1323px;width:18px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove{background-position:0 -1302px;width:22px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow{background-position:0 -1155px;width:22px!important}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete{background-position:0 -1239px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete{background-position:0 -1260px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop{background-position:0 -1218px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tableprop{background-position:0 -1134px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge{background-position:-1px -1197px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit{background-position:0 -1344px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge{background-position:-4px -1365px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit{background-position:0 -1344px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-image{background-position:0 -777px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-flash{background-position:0 -840px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-media{background-position:0 -861px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-link{background-position:0 -1008px}.ke-menu-grey .ke-menu-item .ke-menu-item-left .ke-icon-checked{background-position:0 -1407px}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/grey/editor.scss b/public/assets/addons/nkeditor/themes/grey/editor.scss
new file mode 100644
index 0000000..9549839
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/grey/editor.scss
@@ -0,0 +1,387 @@
+@import "../common/common";
+
+.ke-container-grey {
+    .ke-toolbar {
+
+        border-top: 5px solid #8a8a8a;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+        background-clip: padding-box;
+        text-rendering: optimizelegibility;
+
+        .ke-toolbar-icon {
+            *background-image: url(images/nkeditor.png);
+            background: url(images/nkeditor.svg) no-repeat;
+        }
+
+        .ke-icon-source {
+            background-position: 0 0px;
+        }
+        .ke-icon-preview {
+            background-position: 0 -63px;
+        }
+        .ke-icon-print {
+            background-position: 0 -84px;
+        }
+        .ke-icon-undo {
+            background-position: 0 -21px;
+        }
+
+        .ke-icon-redo {
+            background-position: 0 -42px;
+        }
+
+        .ke-icon-template {
+            background-position: 0 -105px;
+        }
+
+        .ke-icon-cut {
+            background-position: 0 -147px;
+        }
+
+        .ke-icon-copy {
+            background-position: 0 -168px;
+        }
+
+        .ke-icon-paste {
+            background-position: 0 -189px;
+        }
+
+        .ke-icon-selectall {
+            background-position: 0 -483px;
+        }
+
+        .ke-icon-justifyleft {
+            background-position: 0 -252px;
+        }
+
+        .ke-icon-justifycenter {
+            background-position: 0 -273px;
+        }
+
+        .ke-icon-justifyright {
+            background-position: 0 -294px;
+        }
+
+        .ke-icon-justifyfull {
+            background-position: 0 -315px;
+        }
+
+        .ke-icon-insertorderedlist {
+            background-position: 0 -336px;
+        }
+
+        .ke-icon-insertunorderedlist {
+            background-position: 0 -357px;
+        }
+
+        .ke-icon-indent {
+            background-position: 0 -378px;
+        }
+
+        .ke-icon-outdent {
+            background-position: 0 -399px;
+        }
+
+        .ke-icon-subscript {
+            background-position: 0 -420px;
+        }
+
+        .ke-icon-superscript {
+            background-position: 0 -441px;
+        }
+
+        .ke-icon-date {
+            background-position: 0px -304px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-time {
+            background-position: 0px -320px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-formatblock {
+            background-position: 0 -546px;
+        }
+
+        .ke-icon-fontname {
+            background-position: 0 -567px;
+        }
+
+        .ke-icon-fontsize {
+            background-position: 0 -588px;
+        }
+
+        .ke-icon-forecolor {
+            background-position: 0 -609px;
+        }
+
+        .ke-icon-hilitecolor {
+            background-position: 0 -630px;
+        }
+
+        .ke-icon-bold {
+            background-position: 0 -651px;
+        }
+
+        .ke-icon-italic {
+            background-position: 0 -672px;
+        }
+
+        .ke-icon-underline {
+            background-position: 0 -693px;
+        }
+
+        .ke-icon-strikethrough {
+            background-position: 0 -714px;
+        }
+
+        .ke-icon-removeformat {
+            background-position: 0 -756px;
+        }
+
+        .ke-icon-image {
+            background-position: 0 -777px;
+        }
+
+        .ke-icon-flash {
+            background-position: 0 -840px;
+        }
+
+        .ke-icon-media {
+            background-position: 0 -861px;
+        }
+
+        .ke-icon-div {
+            background-position: 0px -544px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-formula {
+            background-position: 0px -576px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-hr {
+            background-position: 0 -924px;
+        }
+
+        .ke-icon-emoticons {
+            background-position: 0 -945px;
+        }
+
+        .ke-icon-link {
+            background-position: 0 -1008px;
+        }
+
+        .ke-icon-unlink {
+            background-position: 0 -1029px;
+        }
+
+        .ke-icon-fullscreen {
+            background-position: 0 -525px;
+        }
+
+        .ke-icon-about {
+            background-position: 0 -1092px;
+        }
+
+        .ke-icon-quote {
+            background-position: 0 -1114px;
+        }
+
+        .ke-icon-plainpaste {
+            background-position: 0 -210px;
+        }
+
+        .ke-icon-wordpaste {
+            background-position: 0 -231px;
+        }
+
+        .ke-icon-table {
+            background-position: 0px -903px;
+            width: 18px !important;
+        }
+
+        .ke-icon-tablemenu {
+            background-position: 0px -768px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-code {
+            background-position: 0 -126px;
+        }
+
+        .ke-icon-map {
+            background-position: 0px -976px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-baidumap {
+            background-position: 0 -1050px;
+        }
+
+        .ke-icon-lineheight {
+            background-position: 0 -735px;
+        }
+
+        .ke-icon-clearhtml {
+            background-position: 0 -462px;
+        }
+
+        .ke-icon-pagebreak {
+            background-position: 0 -966px;
+        }
+
+        .ke-icon-insertfile {
+            background-position: 0 -882px;
+        }
+
+        .ke-icon-quickformat {
+            background-position: 0 -504px;
+        }
+
+        .ke-icon-anchor {
+            background-position: 0 -987px;
+        }
+
+        .ke-icon-search {
+            background-position: 0px -1184px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-new {
+            background-position: 0px -1200px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-specialchar {
+            background-position: 0px -1216px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-multiimage {
+            background-position: 0 -798px;
+        }
+
+        .ke-icon-graft {
+            background-position: 0 -819px;
+        }
+    }
+}
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-grey {
+
+    .ke-menu-item {
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+                *background-image: url(images/nkeditor.png);
+                background: url(images/nkeditor.svg) no-repeat;
+            }
+
+            .ke-icon-tableinsert {
+                background-position: 0 -903px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tabledelete {
+                background-position: 0 -1428px;
+            }
+
+            .ke-icon-tablecolinsertleft {
+                background-position: 0 -1176px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablecolinsertright {
+                background-position: 0 -1323px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablerowinsertabove {
+                background-position: 0 -1302px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablerowinsertbelow {
+                background-position: 0 -1155px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablecoldelete {
+                background-position: 0 -1239px;
+            }
+
+            .ke-icon-tablerowdelete {
+                background-position: 0 -1260px;
+            }
+
+            .ke-icon-tablecellprop {
+                background-position: 0 -1218px;
+            }
+
+            .ke-icon-tableprop {
+                background-position: 0 -1134px;
+            }
+            .ke-icon-tablecellsplit {
+                background-position: 0px -1088px;
+                width: 16px;
+                height: 16px;
+            }
+
+            .ke-icon-tablerowmerge {
+                background-position: -1px -1197px;
+            }
+
+            .ke-icon-tablerowsplit {
+                background-position: 0 -1344px;
+            }
+
+            .ke-icon-tablecolmerge {
+                background-position: -4px -1365px;
+            }
+
+            .ke-icon-tablecolsplit {
+                background-position: 0 -1344px;
+            }
+
+            //图片,视频右键菜单
+            .ke-icon-image {
+                background-position: 0 -777px;
+            }
+            .ke-icon-flash {
+                background-position: 0 -840px;
+            }
+            .ke-icon-media {
+                background-position: 0 -861px;
+            }
+            .ke-icon-link {
+                background-position: 0 -1008px;
+            }
+
+            .ke-icon-checked {
+                background-position: 0 -1407px;
+            }
+
+        }
+    }
+}
+//menu end
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/grey/images/nkeditor.png b/public/assets/addons/nkeditor/themes/grey/images/nkeditor.png
new file mode 100644
index 0000000..3e12962
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/grey/images/nkeditor.png differ
diff --git a/public/assets/addons/nkeditor/themes/grey/images/nkeditor.svg b/public/assets/addons/nkeditor/themes/grey/images/nkeditor.svg
new file mode 100644
index 0000000..7a5b61d
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/grey/images/nkeditor.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="1549" viewBox="0 0 21 1549">
+<svg id="icon-source-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="0">
+<path fill="#8a8a8a" d="M14.4 16h-12.8c-0.884 0-1.6-0.716-1.6-1.6v-12.8c0-0.884 0.716-1.6 1.6-1.6h12.8c0.884 0 1.6 0.716 1.6 1.6v12.8c0 0.884-0.716 1.6-1.6 1.6zM14.4 2.4h-12.8v12h12.8v-12zM6.4 5.6l-2.4 3.2 2.4 2.4-0.8 0.8-3.2-3.2 3.2-4 0.8 0.8zM9.6 4l-1.6 8.8h-1.6l1.6-8.8h1.6zM10.4 4.8l3.2 4-3.2 3.2-0.8-0.8 2.4-2.4-2.4-3.2 0.8-0.8z"></path>
+</svg>
+<svg id="icon-undo" width="16" height="16" viewBox="0 0 16 16" x="0" y="21">
+<path fill="#8a8a8a" d="M12.161 16c1.777-3.219 2.076-8.13-4.904-7.966v3.966l-6-6 6-6v3.881c8.359-0.218 9.29 7.378 4.904 12.119z"></path>
+</svg>
+<svg id="icon-redo" width="16" height="16" viewBox="0 0 16 16" x="0" y="42">
+<path fill="#8a8a8a" d="M9 3.881v-3.881l6 6-6 6v-3.966c-6.981-0.164-6.681 4.747-4.904 7.966-4.386-4.741-3.454-12.337 4.904-12.119z"></path>
+</svg>
+<svg id="icon-preview" width="16" height="16" viewBox="0 0 16 16" x="0" y="63">
+<path fill="#8a8a8a" d="M11.566 10.552c1.261-1.733 1.095-4.134-0.425-5.645-0.827-0.827-1.922-1.275-3.089-1.275-1.166 0-2.261 0.456-3.089 1.275-0.811 0.827-1.269 1.922-1.269 3.086s0.456 2.259 1.277 3.086c0.827 0.827 1.922 1.275 3.089 1.275 0.922 0 1.805-0.291 2.561-0.85l2.269 2.259c0.127 0.127 0.292 0.197 0.473 0.197s0.347-0.070 0.473-0.197c0.259-0.259 0.259-0.684 0-0.945l-2.27-2.266zM5.916 10.134c-1.181-1.181-1.181-3.094 0-4.275 0.575-0.575 1.331-0.881 2.142-0.881s1.567 0.316 2.142 0.881c1.181 1.181 1.181 3.094 0 4.275-1.141 1.133-3.142 1.133-4.284 0z"></path>
+<path fill="#8a8a8a" d="M11.431 1h-6.855c-1.969 0-3.577 1.598-3.577 3.575v6.85c0 1.969 1.6 3.575 3.577 3.575h3.719c0.37 0 0.67-0.298 0.67-0.669s-0.3-0.669-0.67-0.669h-3.719c-1.23 0-2.23-1-2.23-2.228v-6.852c0-1.228 1-2.228 2.23-2.228h6.855c1.23 0 2.23 1 2.23 2.228v3.645c0 0.37 0.3 0.669 0.67 0.669s0.67-0.298 0.67-0.669v-3.661c-0.002-1.969-1.602-3.567-3.57-3.567z"></path>
+</svg>
+<svg id="icon-print" width="16" height="16" viewBox="0 0 16 16" x="0" y="84">
+<path fill="#8a8a8a" d="M4.98 14.938h5.967c0.548 0 0.975-0.461 0.975-1.011v-2.973h-7.922v2.973c0 0.55 0.431 1.011 0.98 1.011zM10.947 1.016h-5.967c-0.548 0-0.98 0.428-0.98 0.978v2.959h7.922v-2.959c0-0.55-0.427-0.978-0.975-0.978z"></path>
+<path fill="#8a8a8a" d="M12.922 4.953v1.016h-9.922v-1.016h-1.003c-0.55 0-0.981 0.469-0.981 1.019v6.961c0 0.55 0.431 1.005 0.981 1.005h1.003v-3.984h9.922v3.984h1.008c0.548 0 1.008-0.455 1.008-1.005v-6.961c0-0.55-0.458-1.019-1.008-1.019h-1.008zM12.922 7.984h-2.969v-1.016h2.969v1.016z"></path>
+</svg>
+<svg id="icon-template" width="16" height="16" viewBox="0 0 16 16" x="0" y="105">
+<path fill="#8a8a8a" d="M8.824 4.504h-8.504v8.536h8.504v-8.536zM6.632 10.84h-0.68v-3.056l-1.056 3.056h-0.608l-1.048-3.104v3.104h-0.68v-4.28h0.952l0.992 2.976c0.048 0.144 0.088 0.264 0.12 0.376 0.040-0.12 0.088-0.264 0.144-0.424l1-2.92h0.872v4.272zM14.88 2.84l-2.024-2.032c-0.44-0.44-1.312-0.808-1.936-0.808h-6.8c-0.624 0-1.136 0.512-1.136 1.136v2.296h0.904v-2.296c0-0.12 0.104-0.224 0.224-0.224h6.8c0.064 0 0.144 0.008 0.224 0.024v3.616h3.6c0.016 0.080 0.024 0.528 0.024 0.6v9.712c0 0.12-0.104 0.224-0.224 0.224h-10.432c-0.12 0-0.224-0.104-0.224-0.224v-0.76h-0.904v0.76c0 0.624 0.512 1.136 1.136 1.136h10.432c0.624 0 1.136-0.512 1.136-1.136v-9.712c0-0.624-0.36-1.872-0.8-2.312zM12.056 3.64v-2.328c0.064 0.040 0.112 0.088 0.16 0.136l2.024 2.032c0.048 0.048 0.088 0.096 0.136 0.16h-2.32zM9.864 9.6h3.72v-1.064h-3.72v1.064zM9.864 11.736h3.72v-1.064h-3.72v1.064zM13.584 6.4h-3.72v1.064h3.72v-1.064z"></path>
+</svg>
+<svg id="icon-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="126">
+<path fill="#8a8a8a" d="M5.015 3.754l-0.708-0.585c-0.215-0.154-0.462-0.123-0.646 0.062l-3.569 4.492c-0.123 0.154-0.123 0.4 0 0.585l3.6 4.462c0.154 0.185 0.431 0.246 0.646 0.062l0.708-0.585c0.215-0.154 0.246-0.462 0.062-0.646l-2.892-3.6 2.923-3.6c0.123-0.185 0.092-0.462-0.123-0.646zM15.908 7.723l-3.6-4.462c-0.154-0.185-0.431-0.246-0.646-0.062l-0.708 0.585c-0.215 0.154-0.246 0.462-0.062 0.646l2.923 3.6-2.923 3.6c-0.154 0.185-0.123 0.492 0.062 0.646l0.708 0.585c0.215 0.154 0.462 0.123 0.646-0.062l3.6-4.492c0.123-0.215 0.123-0.431 0-0.585zM9.723 3.323l-0.923-0.215c-0.246-0.062-0.523 0.092-0.585 0.338l-2.277 8.738c-0.062 0.246 0.092 0.492 0.338 0.554l0.923 0.215c0.246 0.062 0.523-0.092 0.585-0.338l2.277-8.738c0.062-0.277-0.092-0.492-0.338-0.554z"></path>
+</svg>
+<svg id="icon-crop" width="16" height="16" viewBox="0 0 16 16" x="0" y="147">
+<path fill="#8a8a8a" d="M13.585 0.288c1.548 1.972 0.581 3.752 0.581 3.752l-6.049 7.649s-4.161-4.761-5.855-7.12c-1.693-2.356 0.099-4.569 0.099-4.569l5.757 7.312 5.467-7.023zM8.074 10.223c0.469 0 0.846-0.378 0.846-0.842 0-0.224-0.090-0.439-0.249-0.597s-0.374-0.246-0.598-0.246c-0.467 0-0.848 0.377-0.848 0.842s0.381 0.842 0.848 0.842zM11.641 10.395c0.746-0.002 1.462 0.292 1.989 0.818s0.827 1.24 0.829 1.985c-0.002 0.746-0.3 1.459-0.829 1.985s-1.244 0.819-1.989 0.817c-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.3-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM11.641 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001zM4.575 10.395c0.746-0.002 1.461 0.292 1.989 0.818s0.826 1.24 0.829 1.985c-0.005 1.552-1.266 2.807-2.818 2.802-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.299-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM4.575 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001z"></path>
+</svg>
+<svg id="icon-copy" width="16" height="16" viewBox="0 0 16 16" x="0" y="168">
+<path fill="#8a8a8a" d="M3 10h7v1h-7v-1z"></path>
+<path fill="#8a8a8a" d="M3 8h7v1h-7v-1z"></path>
+<path fill="#8a8a8a" d="M3 12h4v1h-4v-1z"></path>
+<path fill="#8a8a8a" d="M14 0h-9c-1.1 0-2 0.9-2 2h1c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9c0 0.6-0.4 1-1 1v1c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2z"></path>
+<path fill="#8a8a8a" d="M3 6h7v1h-7v-1z"></path>
+<path fill="#8a8a8a" d="M11 3h-9c-1.1 0-2 0.9-2 2v9c0 1.1 0.9 2 2 2h9c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2zM12 14c0 0.6-0.4 1-1 1h-9c-0.6 0-1-0.4-1-1v-9c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9z"></path>
+</svg>
+<svg id="icon-paste" width="16" height="16" viewBox="0 0 16 16" x="0" y="189">
+<path fill="#8a8a8a" d="M13.644 7h-5.288c-1.298 0-2.356 1.056-2.356 2.356v4.288c0 1.298 1.056 2.356 2.356 2.356h5.289c1.298 0 2.356-1.056 2.356-2.356v-4.289c-0.002-1.298-1.058-2.355-2.358-2.355zM15 13.644c0 0.747-0.608 1.356-1.356 1.356h-5.288c-0.747 0-1.356-0.608-1.356-1.356v-4.289c0-0.747 0.608-1.356 1.356-1.356h5.289c0.747 0 1.356 0.608 1.356 1.356v4.289h-0.002z"></path>
+<path fill="#8a8a8a" d="M4.453 13h-2.434c-0.561 0-1.019-0.456-1.019-1.019v-9.963c0-0.561 0.456-1.019 1.019-1.019h8.962c0.561 0 1.019 0.456 1.019 1.019v3.497c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-3.497c0-1.112-0.906-2.019-2.019-2.019h-8.963c-1.112 0-2.019 0.905-2.019 2.019v9.962c0 1.113 0.906 2.019 2.019 2.019h2.434c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+<path fill="#8a8a8a" d="M10.5 3h-8c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h8c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM5.5 6h-3c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h3c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM4.5 9h-2c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h2c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+</svg>
+<svg id="icon-paste-text" width="16" height="16" viewBox="0 0 16 16" x="0" y="210">
+<path fill="#8a8a8a" d="M10.5 2h-2v-1c0-0.551-0.45-1-1-1h-2c-0.549 0-1 0.45-1 1v1h-2v2.278h7.999v-2.278zM7.5 2h-2v-0.998c0.001 0 0.001-0.001 0.002-0.001h1.996c0.001 0 0.001 0.001 0.002 0.001l-0.001 0.998zM8.17 9.529h1.972v3.834h1.005v-3.834h1.967v-1.005h-4.943z"></path>
+<path fill="#8a8a8a" d="M12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.816h-0.012v1.928h-8.992v-1.743h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.651c0 0.275 0.225 0.5 0.5 0.5h4.772v1.347l9.727 0.001v-10.118h-3zM6.773 14.999v-8.118h7.726l0.003 8.117-7.729 0.001z"></path>
+</svg>
+<svg id="icon-paste-word" width="16" height="16" viewBox="0 0 16 16" x="0" y="231">
+<path fill="#8a8a8a" d="M13.628 8.819v0.146c-0.195 0.017-0.34 0.154-0.437 0.413l-1.238 3.691h-0.17l-1.044-2.865h-0.024l-1.141 2.865h-0.17l-1.311-3.691c-0.081-0.259-0.227-0.396-0.437-0.413v-0.146h1.821v0.146c-0.275 0.017-0.405 0.105-0.389 0.267 0 0.081 0.016 0.154 0.049 0.219l0.59 1.788 0.718-1.799-0.046-0.257c-0.097-0.13-0.251-0.202-0.461-0.219v-0.146h1.942v0.146c-0.032 0.017-0.057 0.024-0.073 0.024-0.276 0-0.397 0.073-0.364 0.219 0 0.033 0.008 0.105 0.025 0.219 0.016 0.065 0.032 0.105 0.048 0.121l0.572 1.679 0.534-1.806c0.016-0.032 0.084-0.421-0.062-0.432-0.017-0.001-0.033-0.008-0.049-0.024v-0.146h1.117zM10.5 2h-2v-1c0-0.55-0.45-1-1-1h-2c-0.55 0-1 0.45-1 1v1h-2v2.278h8v-2.278zM7.5 2h-2v-0.998l0.002-0.002h1.997c0 0.001 0.002 0.001 0.002 0.002l-0 0.998zM12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.815h-0.011v1.928h-8.992v-1.744h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.652c0 0.275 0.225 0.5 0.5 0.5h4.773v1.348l9.727 0.001v-10.118h-3zM6.773 14.999v-8.117h7.727l0.003 8.117h-7.729z"></path>
+</svg>
+<svg id="icon-left-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="252">
+<path fill="#8a8a8a" d="M1.148 0h13.704c0.624 0 1.123 0.499 1.123 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.679c-0.649-0.025-1.148-0.524-1.148-1.148 0-0.649 0.499-1.148 1.148-1.148zM1.148 4.568h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 9.136h13.704c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.704c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 13.704h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.649-0.025-1.148-0.524-1.148-1.173 0-0.624 0.499-1.123 1.148-1.123z"></path>
+</svg>
+<svg id="icon-center-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="273">
+<path fill="#8a8a8a" d="M1.953 3.11q-0.407 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.281h11.719q0.406 0 0.688 0.281t0.281 0.688-0.281 0.696-0.688 0.289h-11.719zM11.719 5.063q0.406 0 0.688 0.282t0.281 0.688-0.281 0.696-0.688 0.289h-7.813q-0.406 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.282h7.813zM13.672 8.953q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-11.719q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h11.719zM11.719 12.86q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-7.813q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h7.813z"></path>
+</svg>
+<svg id="icon-right-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="294">
+<path fill="#8a8a8a" d="M3.497 10.966c-0.249-0.002-0.529-0.062-0.737-0.19-0.382-0.234-0.488-0.667-0.349-1.095 0.142-0.437 0.484-0.671 1.071-0.672 3.574-0.006 7.149-0.006 10.723 0.005 0.236 0.001 0.5 0.070 0.701 0.19 0.374 0.222 0.5 0.672 0.371 1.090-0.132 0.428-0.468 0.674-0.974 0.676-1.822 0.006-3.643 0.002-5.465 0.002-1.78 0-3.561 0.008-5.341-0.008zM14.228 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.795-0 3.589-0.002 5.383 0.001zM9.344 6.983c-1.63 0-3.26 0.004-4.89-0.002-0.662-0.002-1.097-0.402-1.095-0.98 0.001-0.58 0.436-0.993 1.093-0.994 3.26-0.006 6.52-0.008 9.78 0.007 0.245 0.001 0.521 0.098 0.727 0.235 0.35 0.232 0.448 0.677 0.309 1.074-0.144 0.412-0.47 0.654-0.951 0.656-1.658 0.007-3.315 0.003-4.973 0.003v0.002zM14.279 13.022c0.627 0.003 1.053 0.418 1.049 0.983-0.004 0.563-0.437 0.98-1.058 0.981-3.287 0.005-5.935 0.007-9.222-0.008-0.231-0.001-0.492-0.098-0.685-0.23-0.343-0.234-0.441-0.681-0.305-1.078 0.137-0.4 0.477-0.646 0.958-0.648 1.657-0.007 2.675-0.003 4.332-0.003 1.644-0 3.287-0.006 4.931 0.002z"></path>
+</svg>
+<svg id="icon-both-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="315">
+<path fill="#8a8a8a" d="M14.148 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 13.040c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 8.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.002 7.105-0.002 1.794-0 3.589-0.002 5.383 0.001zM14.148 4.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001z"></path>
+</svg>
+<svg id="icon-ol" width="16" height="16" viewBox="0 0 16 16" x="0" y="336">
+<path fill="#8a8a8a" d="M7.111 1.778h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889z"></path>
+<path fill="#8a8a8a" d="M15.111 4.711h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M15.111 9.511h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M15.111 14.222h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M2.578 0.533h-0.8l-1.689 0.889 0.267 0.889 1.244-0.711v3.733h-1.333v0.889h3.556v-0.889h-1.244z"></path>
+<path fill="#8a8a8a" d="M2.222 13.956c0.178-0.178 0.444-0.444 0.622-0.622s0.356-0.356 0.444-0.533c0.089-0.178 0.178-0.356 0.267-0.533s0.089-0.356 0.089-0.622c0-0.267-0.089-0.622-0.178-0.8-0.089-0.267-0.267-0.356-0.356-0.533s-0.444-0.267-0.622-0.356c-0.178-0.089-0.444-0.089-0.711-0.089-0.356 0-0.711 0.089-0.978 0.178-0.267 0.178-0.622 0.356-0.8 0.622l0.444 0.622c0.178-0.178 0.356-0.267 0.533-0.444s0.444-0.178 0.622-0.178c0.178 0 0.356 0 0.444 0s0.267 0.089 0.267 0.267 0.178 0.178 0.178 0.356 0.089 0.267 0.089 0.356c0 0.178 0 0.267 0 0.444s-0.089 0.267-0.178 0.356-0.178 0.267-0.356 0.444-0.356 0.444-0.533 0.711l-1.511 1.244v0.889h3.733v-0.889h-2.4l0.889-0.889z"></path>
+</svg>
+<svg id="icon-ul" width="16" height="16" viewBox="0 0 16 16" x="0" y="357">
+<path fill="#8a8a8a" d="M15.111 13.333h-8.889c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M6.222 2.667h8.889c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889z"></path>
+<path fill="#8a8a8a" d="M15.111 7.111h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#8a8a8a" d="M0 1.778c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#8a8a8a" d="M0 8c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#8a8a8a" d="M0 14.222c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+</svg>
+<svg id="icon-right-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="378">
+<path fill="#8a8a8a" d="M0 1.882h17.488v-1.882h-17.488zM7.511 5.412h9.977v-1.883h-9.977zM7.511 8.941h9.977v-1.883h-9.977zM7.511 12.471h9.977v-1.883h-9.977zM0 16h17.488v-1.882h-17.488zM0 11.572v-6.627l4.418 3.314z"></path>
+</svg>
+<svg id="icon-left-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="399">
+<path fill="#8a8a8a" d="M0 1.883h17.488v-1.883h-17.488v1.883zM7.511 5.412h9.977v-1.883h-9.977v1.883zM7.511 8.941h9.977v-1.883h-9.977v1.883zM7.511 12.471h9.977v-1.883h-9.977v1.883zM0 16h17.488v-1.883h-17.488v1.883zM4.418 11.572v-6.627l-4.418 3.314 4.418 3.313z"></path>
+</svg>
+<svg id="icon-down-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="420">
+<path fill="#8a8a8a" d="M13.331 13.511v1.089h2.669v1.4h-4.001v-3.189l2.664-1.309v-1.089h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-up-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="441">
+<path fill="#8a8a8a" d="M13.331 4.492v1.095h2.669v1.394h-4.001v-3.183l2.664-1.309v-1.095h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-clear-format" width="16" height="16" viewBox="0 0 16 16" x="0" y="462">
+<path fill="#8a8a8a" d="M11.163 3.197l3.005-1.734 1.43 1.763-2.248 2.491zM8.877 2.251c0.879 0.108 5.156 5.318 5.046 5.904s-2.497 2.206-2.497 2.206l-5.417-6.229c-0 0 1.989-1.988 2.868-1.88zM5.491 4.897l5.23 6.088-3.209 4.173-7.247-9.178s1.436-0.060 2.633-0.374c0.783-0.206 2.593-0.709 2.593-0.709z"></path>
+</svg>
+<svg id="icon-selectall" width="16" height="16" viewBox="0 0 16 16" x="0" y="483">
+<path fill="#8a8a8a" d="M7.272 8.96c-0.216 0-0.416-0.080-0.568-0.232l-3.136-3.144c-0.112-0.112-0.176-0.264-0.176-0.416 0-0.16 0.064-0.304 0.176-0.416s0.264-0.176 0.416-0.176c0.16 0 0.304 0.064 0.416 0.176l2.872 2.872 6.104-6.104c0.112-0.112 0.264-0.176 0.416-0.176 0.16 0 0.304 0.064 0.416 0.176 0.232 0.232 0.232 0.608 0 0.84l-6.368 6.368c-0.152 0.152-0.352 0.232-0.568 0.232z"></path>
+<path fill="#8a8a8a" d="M2 12.76c-0.256 0-0.496-0.104-0.68-0.28-0.184-0.184-0.28-0.424-0.28-0.68v-9.776c0-0.256 0.104-0.496 0.28-0.68 0.184-0.184 0.424-0.28 0.68-0.28h6.776c0.328 0 0.592 0.264 0.592 0.592s-0.264 0.592-0.592 0.592h-6.552v9.328h8.92v-4.304c0-0.328 0.272-0.6 0.6-0.6s0.6 0.272 0.6 0.6v4.528c0 0.256-0.104 0.496-0.28 0.68-0.184 0.184-0.424 0.28-0.68 0.28h-9.384z"></path>
+<path fill="#8a8a8a" d="M5 15.016c-0.328 0-0.592-0.264-0.592-0.592s0.264-0.592 0.592-0.592l8.808-0.008v-7.68c0-0.328 0.264-0.592 0.592-0.592 0.16 0 0.312 0.064 0.424 0.176s0.176 0.264 0.176 0.424l-0.008 8.008c0 0.472-0.384 0.848-0.856 0.848l-9.136 0.008z"></path>
+</svg>
+<svg id="icon-paiban" width="16" height="16" viewBox="0 0 16 16" x="0" y="504">
+<path fill="#8a8a8a" d="M15.176 12.792l-5.48-4.8c-0.304-0.264-0.76-0.232-1.024 0.072l-1.552 1.776c-0.264 0.304-0.232 0.76 0.064 1.024l2.16 1.888 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.776 0.68 0.36-0.416 0.424-0.48c0.088-0.104 0.24-0.112 0.344-0.024l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.424 0.48-0.36 0.416 0.776 0.68 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.616 0.544c0.304 0.264 0.76 0.232 1.024-0.072l1.56-1.776c0.264-0.32 0.232-0.776-0.072-1.040zM9.76 9.944c-0.176 0.2-0.488 0.208-0.704 0.024s-0.248-0.496-0.072-0.696c0.176-0.2 0.488-0.208 0.704-0.024s0.248 0.496 0.072 0.696z"></path>
+<path fill="#8a8a8a" d="M5.784 10.824h-2.928c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.552 0.552-0.552h3.096l0.944-1.112h-4.040c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.56 0.552-0.56h4.984l0.472-0.56c0.344-0.4 0.952-0.456 1.352-0.112l2.632 2.232v-6.016l-0.072-0.072v-0.008l-2.88-2.88h-7.784c-0.816 0-1.48 0.664-1.48 1.48v10.744c0 0.816 0.664 1.48 1.48 1.48h7.6l-3.144-2.664c-0.096-0.080-0.176-0.184-0.232-0.296zM2.856 3.040h3.704c0.304 0 0.552 0.248 0.552 0.552s-0.248 0.552-0.552 0.552h-3.704c-0.304 0-0.552-0.248-0.552-0.552 0-0.296 0.248-0.552 0.552-0.552zM2.856 5.264h6.664c0.304 0 0.552 0.248 0.552 0.56 0 0.304-0.248 0.552-0.552 0.552h-6.664c-0.304 0-0.552-0.248-0.552-0.552 0-0.312 0.248-0.56 0.552-0.56z"></path>
+</svg>
+<svg id="icon-full-screen" width="16" height="16" viewBox="0 0 16 16" x="0" y="525">
+<path fill="#8a8a8a" d="M14.872 1.258c-0.094-0.094-0.219-0.145-0.352-0.145h-0.002l-4.502 0.017c-0.275 0.002-0.497 0.223-0.497 0.5 0.002 0.273 0.223 0.497 0.498 0.497h0.002l3.175-0.013-3.423 3.45c-0.194 0.194-0.192 0.511 0.003 0.705 0.097 0.097 0.223 0.145 0.35 0.145 0.128 0 0.256-0.050 0.353-0.148l3.545-3.572v3.22c0 0.275 0.222 0.498 0.498 0.498 0.275 0 0.498-0.222 0.498-0.498v-4.303c-0.002-0.133-0.055-0.259-0.148-0.353zM1.239 1.238c0.094-0.094 0.219-0.145 0.352-0.145h0.002l4.502 0.019c0.275 0.002 0.497 0.225 0.497 0.5-0.002 0.273-0.223 0.497-0.498 0.497h-0.002l-3.177-0.014 3.425 3.45c0.194 0.194 0.192 0.511-0.003 0.705-0.097 0.097-0.223 0.145-0.35 0.145-0.128 0-0.256-0.050-0.353-0.148l-3.545-3.572v3.22c0 0.275-0.222 0.498-0.498 0.498s-0.498-0.222-0.498-0.498v-4.303c0.002-0.131 0.055-0.259 0.148-0.353zM14.872 14.881c-0.094 0.094-0.219 0.145-0.352 0.145h-0.002l-4.502-0.017c-0.275-0.002-0.497-0.225-0.497-0.5 0.002-0.273 0.223-0.497 0.498-0.497h0.002l3.175 0.012-3.423-3.448c-0.194-0.194-0.192-0.511 0.003-0.705 0.097-0.097 0.223-0.145 0.35-0.145 0.128 0 0.256 0.050 0.353 0.148l3.545 3.57v-3.22c0-0.275 0.222-0.498 0.498-0.498 0.275 0 0.498 0.222 0.498 0.498v4.303c-0.002 0.133-0.055 0.259-0.148 0.353zM1.223 14.886c0.094 0.094 0.219 0.145 0.352 0.145h0.002l4.502-0.017c0.275-0.002 0.497-0.225 0.497-0.5-0.002-0.273-0.223-0.497-0.498-0.497h-0.002l-3.175 0.012 3.425-3.45c0.194-0.194 0.192-0.511-0.003-0.705-0.097-0.097-0.223-0.145-0.35-0.145-0.128 0-0.256 0.050-0.353 0.148l-3.547 3.572v-3.22c0-0.275-0.222-0.498-0.498-0.498s-0.498 0.222-0.498 0.498v4.303c0.002 0.133 0.055 0.259 0.148 0.353z"></path>
+</svg>
+<svg id="icon-title" width="16" height="16" viewBox="0 0 16 16" x="0" y="546">
+<path fill="#8a8a8a" d="M1.815 2.089v4.803h1.332v-4.803h1.815v-1.089h-4.962v1.089h1.815zM6.443 1.966v-0.966h-1.205v0.966h1.205zM5.239 2.626v4.267h1.205v-4.267h-1.205zM8.594 2.626v-1.279h-1.205v1.279h-0.73v0.784h0.73v2.517c0 0.215 0.037 0.388 0.11 0.52s0.174 0.234 0.301 0.305c0.127 0.072 0.274 0.12 0.441 0.144s0.344 0.037 0.53 0.037c0.119 0 0.24-0.003 0.365-0.008s0.238-0.016 0.339-0.033v-0.908c-0.057 0.011-0.116 0.019-0.178 0.025s-0.127 0.008-0.195 0.008c-0.204 0-0.339-0.033-0.407-0.099s-0.102-0.198-0.102-0.396v-2.113h0.882v-0.784h-0.882zM9.761 1v5.893h1.205v-5.893h-1.205zM14.541 4.301h-1.96c0.006-0.083 0.024-0.176 0.055-0.281s0.085-0.204 0.161-0.297c0.076-0.094 0.178-0.172 0.305-0.235s0.287-0.095 0.479-0.095c0.294 0 0.513 0.077 0.657 0.231s0.245 0.38 0.301 0.677v0zM12.581 5.044h3.164c0.023-0.33-0.006-0.646-0.085-0.949s-0.208-0.572-0.386-0.809c-0.178-0.237-0.406-0.425-0.683-0.565s-0.602-0.21-0.976-0.21c-0.334 0-0.638 0.058-0.912 0.173s-0.51 0.274-0.708 0.475c-0.198 0.201-0.351 0.439-0.458 0.714s-0.161 0.572-0.161 0.891c0 0.33 0.052 0.633 0.157 0.908s0.253 0.512 0.445 0.71c0.192 0.198 0.427 0.351 0.704 0.458s0.588 0.161 0.933 0.161c0.498 0 0.922-0.11 1.272-0.33s0.611-0.586 0.78-1.098h-1.060c-0.040 0.132-0.147 0.257-0.322 0.376s-0.385 0.177-0.628 0.177c-0.339 0-0.599-0.085-0.78-0.256s-0.28-0.446-0.297-0.825zM0 9h16v1h-16v-1zM0 12h16v1h-16v-1zM0 15h12v1h-12v-1z"></path>
+</svg>
+<svg id="icon-font" width="16" height="16" viewBox="0 0 16 16" x="0" y="567">
+<path fill="#8a8a8a" d="M0.32 1.436v3.661h0.448c0.149-0.971 0.523-1.793 1.195-2.316 0.374-0.374 1.046-0.598 2.017-0.598h1.046v10.386c0 0.672-0.075 1.121-0.149 1.27-0.075 0.224-0.224 0.374-0.448 0.448-0.224 0.149-0.598 0.224-0.971 0.224h-0.448v0.374h7.472v-0.374h-0.448c-0.448 0-0.747-0.075-0.971-0.224s-0.374-0.299-0.448-0.448-0.149-0.598-0.149-1.27v-10.386h1.046c0.672 0 1.121 0.075 1.42 0.149 0.448 0.224 0.822 0.523 1.121 0.897s0.523 0.971 0.747 1.793h0.374v-3.586h-12.851z"></path>
+<path fill="#8a8a8a" d="M8.533 6.286v2.341h0.254c0.085-0.621 0.296-1.146 0.676-1.481 0.211-0.239 0.592-0.382 1.141-0.382h0.592v6.64c0 0.43-0.042 0.716-0.085 0.812-0.042 0.143-0.127 0.239-0.254 0.287-0.127 0.095-0.338 0.143-0.549 0.143h-0.254v0.239h4.225v-0.239h-0.253c-0.254 0-0.423-0.048-0.549-0.143s-0.211-0.191-0.254-0.287c-0.042-0.095-0.084-0.382-0.084-0.812v-6.64h0.592c0.38 0 0.634 0.048 0.803 0.096 0.255 0.145 0.467 0.338 0.63 0.567l0.004 0.006c0.169 0.239 0.296 0.621 0.423 1.146h0.211v-2.293h-7.268z"></path>
+</svg>
+<svg id="icon-fontsize" width="16" height="16" viewBox="0 0 16 16" x="0" y="588">
+<path fill="#8a8a8a" d="M10.75 12.432l2.663 3.141 2.674-3.141z"></path>
+<path fill="#8a8a8a" d="M2.979 7.234l1.53-4.933 1.534 4.933h-3.064zM5.888 0.408h-2.332l-3.489 11.051h1.617l0.825-2.63h4.042l0.839 2.63h2.025l-3.527-11.051z"></path>
+<path fill="#8a8a8a" d="M9.553 8.899l0.888-2.357 0.888 2.357h-1.776zM11.238 5.444h-1.351l-1.085 2.927 0.47 1.475 0.007-0.021h2.342l0.487 1.522h1.171l-2.041-5.903z"></path>
+</svg>
+<svg id="icon-fontcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="609">
+<path fill="#8a8a8a" d="M1.051 12.486v2.105h9.121l2.105-2.105h-11.226zM11.575 14.591h3.508v-3.508l-3.508 3.508z"></path>
+<path fill="#8a8a8a" d="M12.338 12.135h-1.766l-1.437-3.369h-4.42l-1.423 3.369h-1.802l4.631-10.705h1.66l4.558 10.705zM8.565 7.275l-1.625-3.615-1.639 3.615h3.264z"></path>
+</svg>
+<svg id="icon-font-bgcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="630">
+<path fill="#8a8a8a" d="M4.068 9.652c-0.151 0.146-0.226 0.351-0.226 0.614 0 0.231 0.082 0.42 0.246 0.566s0.38 0.219 0.649 0.219c0.374 0 0.683-0.132 0.926-0.395s0.364-0.594 0.364-0.991v-0.465l-1.136 0.154c-0.398 0.053-0.672 0.152-0.823 0.298zM12.953 1.452h-9.984c-1.103 0-1.997 0.894-1.997 1.997v8.985c0 1.103 0.894 1.997 1.997 1.997h9.984c1.103 0 1.997-0.894 1.997-1.997v-8.985c0-1.103-0.894-1.997-1.997-1.997zM6.879 11.635h-0.851v-0.75h-0.022c-0.336 0.576-0.832 0.864-1.487 0.864-0.471 0-0.845-0.127-1.123-0.382s-0.417-0.598-0.417-1.031c0-0.907 0.537-1.435 1.61-1.584l1.439-0.202c0-0.793-0.328-1.189-0.983-1.189-0.582 0-1.113 0.196-1.593 0.588v-0.829c0.483-0.301 1.040-0.452 1.672-0.452 1.17 0 1.755 0.614 1.755 1.843v3.124zM12.26 11.023c-0.402 0.484-0.938 0.726-1.608 0.726-0.632 0-1.113-0.266-1.443-0.799h-0.018v0.684h-0.86v-7.182h0.86v3.168h0.018c0.38-0.635 0.936-0.952 1.667-0.952 0.608 0 1.092 0.214 1.45 0.643s0.538 1.014 0.538 1.757c0 0.819-0.201 1.47-0.603 1.955zM10.638 7.38c-0.421 0-0.769 0.151-1.042 0.452s-0.41 0.684-0.41 1.15v0.658c0 0.392 0.127 0.723 0.382 0.994s0.573 0.406 0.956 0.406c0.456 0 0.813-0.175 1.071-0.526s0.386-0.836 0.386-1.457c0-0.512-0.12-0.919-0.36-1.222s-0.567-0.454-0.983-0.454z"></path>
+</svg>
+<svg id="icon-b" width="16" height="16" viewBox="0 0 16 16" x="0" y="651">
+<path fill="#8a8a8a" d="M12.615 5.846c0-1.846-1.477-3.385-3.231-3.385h-5.077c-0.338 0-0.615 0.277-0.615 0.615v10.154c0 0.338 0.277 0.615 0.615 0.615h5.077c1.754 0 3.231-1.538 3.231-3.385 0-0.892-0.338-1.692-0.892-2.308 0.554-0.615 0.892-1.415 0.892-2.308zM9.385 11.692h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231zM9.385 7.077h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231z"></path>
+</svg>
+<svg id="icon-italic" width="16" height="16" viewBox="0 0 16 16" x="0" y="672">
+<path fill="#8a8a8a" d="M11.692 3.785v-0.4c0-0.338-0.277-0.615-0.615-0.615h-4.308c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615 0.523 0 0.923 0.492 0.8 0.985l-1.108 5.415c-0.092 0.4-0.431 0.677-0.8 0.677h-0.738c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615h4.308c0.338 0 0.615-0.277 0.615-0.615v-0.615c0-0.338-0.277-0.615-0.615-0.615-0.523 0-0.923-0.492-0.8-0.985l1.108-5.415c0.092-0.4 0.431-0.677 0.8-0.677h0.523c0.462 0 0.831-0.369 0.831-0.831z"></path>
+</svg>
+<svg id="icon-underline" width="16" height="16" viewBox="0 0 16 16" x="0" y="693">
+<path fill="#8a8a8a" d="M13.692 12.923h-11.385c-0.246 0-0.462 0.215-0.462 0.462v0.923c0 0.246 0.215 0.462 0.462 0.462h11.385c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462zM7.785 11.692c-2.308-0.123-4.092-2.123-4.092-4.431v-4.185c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.215c0 1.323 0.985 2.462 2.308 2.554 1.446 0.092 2.615-1.046 2.615-2.462v-4.308c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.308c0 2.462-2.062 4.431-4.523 4.308z"></path>
+</svg>
+<svg id="icon-strickout" width="16" height="16" viewBox="0 0 16 16" x="0" y="714">
+<path fill="#8a8a8a" d="M3.723 5.569c-0.062-0.308-0.092-0.677-0.092-1.046 0-0.4 0.092-0.862 0.277-1.292 0.185-0.462 0.462-0.892 0.862-1.262 0.369-0.369 0.892-0.708 1.477-0.954 0.615-0.246 1.323-0.4 2.185-0.4 0.769 0 1.508 0.092 2.215 0.308 0.554 0.185 1.077 0.492 1.538 0.923 0.185 0.185 0.185 0.492-0.031 0.677l-0.831 0.769c-0.185 0.154-0.462 0.185-0.646 0-0.215-0.215-0.462-0.4-0.738-0.554-0.431-0.215-0.923-0.338-1.508-0.338-0.523 0-0.985 0.062-1.323 0.215s-0.646 0.308-0.862 0.554-0.369 0.462-0.462 0.708-0.123 0.492-0.123 0.677c0 0.338 0.062 0.615 0.154 0.862 0.092 0.215-0.062 0.431-0.277 0.431h-1.508c-0.154 0-0.277-0.154-0.308-0.277zM12.277 10.154h-1.538c-0.215 0-0.369 0.215-0.277 0.4s0.123 0.431 0.123 0.677c0 0.369-0.092 0.708-0.246 1.015-0.185 0.308-0.4 0.523-0.677 0.738-0.277 0.185-0.585 0.338-0.923 0.431s-0.646 0.154-0.985 0.154c-0.585 0-1.138-0.123-1.662-0.369-0.4-0.185-0.738-0.431-1.046-0.769-0.154-0.185-0.462-0.215-0.646-0.062l-0.862 0.738c-0.185 0.154-0.215 0.462-0.031 0.646 0.431 0.492 0.985 0.862 1.631 1.108 0.8 0.308 1.662 0.462 2.585 0.462 0.677 0 1.323-0.092 1.908-0.308 0.585-0.185 1.108-0.492 1.569-0.862 0.431-0.369 0.8-0.831 1.046-1.385s0.4-1.138 0.4-1.815c0-0.246 0-0.4-0.031-0.615-0.062-0.062-0.185-0.185-0.338-0.185zM15.354 7.354c-0.062-0.185-0.246-0.277-0.431-0.277h-13.846c-0.215 0-0.369 0.092-0.431 0.277-0.031 0.062-0.031 0.092-0.031 0.154v0.923c0 0.246 0.215 0.492 0.462 0.492h13.846c0.246 0 0.462-0.246 0.462-0.492v-0.923c0-0.062 0-0.092-0.031-0.154z"></path>
+</svg>
+<svg id="icon-line-height" width="16" height="16" viewBox="0 0 16 16" x="0" y="735">
+<path fill="#8a8a8a" d="M2.499 11.902v-7.682c-0.166 0-0.326 0.009-0.485-0.002-0.265-0.019-0.339-0.2-0.178-0.467 0.254-0.423 0.52-0.837 0.79-1.245 0.145-0.219 0.377-0.212 0.522 0.009 0.262 0.398 0.521 0.801 0.767 1.214 0.055 0.093 0.087 0.254 0.063 0.359-0.016 0.067-0.153 0.115-0.239 0.126-0.153 0.020-0.308 0.006-0.469 0.006v7.672c0.15 0 0.298-0.017 0.444 0.006 0.097 0.015 0.246 0.062 0.266 0.138 0.027 0.104-0.021 0.274-0.080 0.375-0.236 0.397-0.486 0.781-0.737 1.164-0.17 0.26-0.396 0.258-0.566-0.005-0.25-0.384-0.492-0.775-0.737-1.163-0.022-0.035-0.044-0.075-0.061-0.118l-0.002-0.005c-0.088-0.217-0.034-0.357 0.161-0.375 0.176-0.016 0.353-0.003 0.543-0.003z"></path>
+<path fill="#8a8a8a" d="M14.841 0v1.166h-13.69v-1.166zM14.849 14.834v1.166h-13.69v-1.166zM10.056 2.956l4.172 10.602h-1.321l-1.129-2.97h-4.871l-1.128 2.97h-1.307l4.173-10.602zM11.392 9.563l-2.004-5.3h-0.059l-2.034 5.3z"></path>
+</svg>
+<svg id="icon-clear-html" width="16" height="16" viewBox="0 0 16 16" x="0" y="756">
+<path fill="#8a8a8a" d="M10.175 3.11c-0.106-0.106-0.279-0.106-0.385 0l-8.625 8.625c-0.106 0.106-0.106 0.279 0 0.385l1.678 1.678c0.106 0.106 0.315 0.192 0.464 0.192h5.374c0.15 0 0.358-0.087 0.464-0.192l5.666-5.666c0.106-0.106 0.106-0.279 0-0.385l-4.636-4.636zM8.612 12.774c-0.106 0.106-0.315 0.192-0.464 0.192h-4.161c-0.15 0-0.358-0.087-0.464-0.192l-0.791-0.791c-0.106-0.106-0.106-0.279 0-0.385l3.162-3.162c0.106-0.106 0.279-0.106 0.385 0l3.143 3.143c0.106 0.106 0.106 0.279 0 0.385l-0.81 0.81z"></path>
+</svg>
+<svg id="icon-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="777">
+<path fill="#8a8a8a" d="M15.385 3.077c0-0.677-0.554-1.231-1.231-1.231h-12.308c-0.677 0-1.231 0.554-1.231 1.231v9.846c0 0.677 0.554 1.231 1.231 1.231h12.308c0.677 0 1.231-0.554 1.231-1.231v-9.846zM12.185 11.692h-8.923c-0.369 0-0.585-0.4-0.4-0.708l2.708-4.708c0.123-0.215 0.4-0.215 0.523 0l1.631 2.8c0.123 0.185 0.4 0.215 0.523 0.031l1.323-1.908c0.123-0.185 0.4-0.185 0.523 0l2.431 3.877c0.185 0.277 0 0.615-0.338 0.615zM11.385 6.154c-0.677 0-1.231-0.554-1.231-1.231s0.554-1.231 1.231-1.231 1.231 0.554 1.231 1.231-0.554 1.231-1.231 1.231z"></path>
+</svg>
+<svg id="icon-multiple-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="798">
+<path fill="#8a8a8a" d="M13 1v12.033h-12v-12.033h12zM13 0h-12c-0.567 0-1 0.433-1 1v12.033c0 0.567 0.433 1 1 1h12.033c0.567 0 1-0.433 1-1v-12.033c-0.033-0.567-0.467-1-1.033-1z"></path>
+<path fill="#8a8a8a" d="M13 12.267c0.567-0.6 0.8-2.3 0.8-3.1 0-2.033-1.6-3.7-3.633-3.7-1.433 0-2.633 0.8-3.233 1.967-0.667 1.033-1.8 1.7-3.1 1.7-1.367 0-2.533-0.733-3.2-1.833-0.333 0.567-0.5 1.2-0.5 1.867 0 0.733 0.2 2.333 0.567 2.9v1.133h1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h2.1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h0.7v-0.933z"></path>
+<path fill="#8a8a8a" d="M2.767 4.233c0 0 0 0 0 0 0 0.7 0.567 1.267 1.267 1.267s1.267-0.567 1.267-1.267c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.7-0.567-1.267-1.267-1.267s-1.267 0.567-1.267 1.267c0 0 0 0 0 0v0z"></path>
+<path fill="#8a8a8a" d="M15.633 16h-9c-0.267 0-0.5-0.233-0.5-0.5s0.233-0.5 0.5-0.5h8.5v-8.5c0-0.267 0.233-0.5 0.5-0.5s0.5 0.233 0.5 0.5v9c0 0.267-0.233 0.5-0.5 0.5z"></path>
+</svg>
+<svg id="icon-graft" width="17" height="16" viewBox="0 0 17 16" x="0" y="819">
+<path fill="#8a8a8a" d="M16.407 3.584c0.106-0.333 0.388-1.214-0.194-1.628-0.171-0.118-0.382-0.188-0.61-0.188-0.013 0-0.026 0-0.039 0.001l0.002-0c-0.449 0-1.133 0.267-1.914 0.713-0.030-0.060-0.067-0.112-0.111-0.157l0 0c-1.435-1.432-3.417-2.318-5.605-2.318-4.379 0-7.93 3.548-7.935 7.926v0c-0 0.009-0 0.020-0 0.031 0 2.264 0.957 4.305 2.489 5.739l0.004 0.004c0.107 0.101 0.251 0.163 0.41 0.163 0.001 0 0.001 0 0.002 0h0.044c-0.291 0.29-0.604 0.557-0.938 0.8l-0.023 0.016c-0.155 0.11-0.255 0.289-0.255 0.491 0 0.279 0.19 0.513 0.448 0.581l0.004 0.001c0.631 0.152 1.356 0.239 2.102 0.239 0.004 0 0.008 0 0.011 0h-0.001c1.236 0 2.256-0.259 3.042-0.777v0.047c0 0.332 0.269 0.601 0.601 0.601v0c4.38-0.005 7.929-3.555 7.935-7.934v-0c0-0.008 0.001-0.018 0.001-0.028 0-0.332-0.269-0.601-0.601-0.601s-0.601 0.269-0.601 0.601c0 0.010 0 0.020 0.001 0.029l-0-0.001c-0.005 3.687-2.969 6.679-6.644 6.731l-0.005 0c0.617-0.614 0.933-1.306 0.906-1.993-0.017-0.336-0.114-0.646-0.272-0.916l0.005 0.009c0.166 0.056 0.358 0.088 0.557 0.088 0.004 0 0.007-0 0.011-0h-0.001c2.749-0.001 6.495-6.143 7.175-8.27zM4.521 13.81c0.268-0.47 1.21-1.992 2.168-1.992 0.209 0.006 0.402 0.071 0.563 0.18l-0.004-0.002c0.265 0.15 0.447 0.419 0.476 0.732l0 0.004c0.021 0.427-0.3 0.928-0.881 1.375s-1.457 0.695-2.549 0.695c-0.181 0-0.369-0.006-0.56-0.021 0.298-0.283 0.558-0.602 0.774-0.952l0.012-0.020zM8.754 9.025c1.072-2.589 5.206-5.632 6.574-6.016-0.129 0.493-0.567 1.583-1.553 3.158-1.643 2.599-3.549 4.486-4.55 4.486-0.003 0-0.007 0-0.010 0-0.167 0-0.317-0.071-0.422-0.185l-0-0c-0.299-0.299-0.312-0.786-0.039-1.443zM1.2 7.933c0-0.002 0-0.004 0-0.006 0-3.717 3.014-6.731 6.731-6.731 1.835 0 3.499 0.734 4.713 1.925l-0.001-0.001c-1.977 1.364-4.207 3.536-4.998 5.444-0.422 1.019-0.327 1.744-0.071 2.246-0.26-0.121-0.564-0.192-0.885-0.193h-0c-1.486 0-2.63 1.588-3.193 2.559-0.021-0.136-0.086-0.254-0.18-0.343l-0-0c-1.303-1.221-2.115-2.952-2.115-4.874 0-0.009 0-0.019 0-0.028v0.001z"></path>
+<path fill="#8a8a8a" d="M8.931 4.704c0.858 0 1.553-0.695 1.553-1.553s-0.695-1.553-1.553-1.553c-0.858 0-1.553 0.695-1.553 1.553v0c0 0.858 0.695 1.553 1.553 1.553v0zM8.931 3.504c-0.194 0-0.352-0.158-0.352-0.352s0.158-0.352 0.352-0.352c0.194 0 0.352 0.158 0.352 0.352v0c0 0.194-0.158 0.352-0.352 0.352v0zM5.394 9.012c0-0.858-0.695-1.553-1.553-1.553s-1.553 0.695-1.553 1.553c0 0.858 0.695 1.553 1.553 1.553v0c0.858 0 1.553-0.695 1.553-1.553v0zM3.841 8.659c0.002-0 0.004-0 0.006-0 0.194 0 0.352 0.158 0.352 0.352s-0.158 0.352-0.352 0.352c-0.194 0-0.352-0.158-0.352-0.352v0c0-0 0-0 0-0 0-0.193 0.155-0.349 0.347-0.352h0zM4.977 7.069c1.144 0 2.071-0.927 2.071-2.071s-0.927-2.071-2.071-2.071c-1.144 0-2.071 0.927-2.071 2.071v0c0 1.144 0.927 2.071 2.071 2.071v0zM4.977 4.123c0.482 0 0.872 0.391 0.872 0.872s-0.391 0.872-0.872 0.872c-0.482 0-0.872-0.391-0.872-0.872v0c0.001-0.481 0.391-0.87 0.872-0.871h0z"></path>
+</svg>
+<svg id="icon-flash" width="16" height="16" viewBox="0 0 16 16" x="0" y="840">
+<path fill="#8a8a8a" d="M8 0.889c-3.911 0-7.111 3.2-7.111 7.111s3.2 7.111 7.111 7.111 7.111-3.2 7.111-7.111-3.2-7.111-7.111-7.111zM11.556 5.956c-1.244-0.089-1.956 1.244-1.956 1.244l1.422 0.089v1.6h-2.044c-1.067 3.911-3.644 3.2-3.644 3.2v-1.333s1.511 0 2.311-2.756c1.156-4.356 3.911-3.467 3.911-3.467v1.422z"></path>
+</svg>
+<svg id="icon-vedio" width="16" height="16" viewBox="0 0 16 16" x="0" y="861">
+<path fill="#8a8a8a" d="M15.385 0.615h-0.615v1.231h-1.846v-1.231h-9.846v1.231h-1.846v-1.231h-0.615c-0.339 0-0.615 0.276-0.615 0.615v13.538c0 0.339 0.276 0.615 0.615 0.615h0.615v-0.615h1.846v0.615h9.846v-0.615h1.846v0.615h0.615c0.339 0 0.615-0.276 0.615-0.615v-13.538c0-0.339-0.276-0.615-0.615-0.615zM3.077 12.923h-1.846v-1.846h1.846v1.846zM3.077 9.231h-1.846v-1.846h1.846v1.846zM3.077 5.538h-1.846v-1.846h1.846v1.846zM10.823 8.404l-4.002 2.334c-0.065 0.033-0.137 0.048-0.207 0.048-0.085 0-0.167-0.023-0.242-0.067-0.135-0.082-0.218-0.228-0.218-0.385v-4.668c0-0.157 0.082-0.303 0.218-0.385 0.137-0.082 0.307-0.090 0.449-0.018l4.002 2.334c0.156 0.077 0.254 0.233 0.254 0.404s-0.098 0.327-0.254 0.404zM14.769 12.923h-1.846v-1.846h1.846v1.846zM14.769 9.231h-1.846v-1.846h1.846v1.846zM14.769 5.538h-1.846v-1.846h1.846v1.846z"></path>
+</svg>
+<svg id="icon-attach" width="16" height="16" viewBox="0 0 16 16" x="0" y="882">
+<path fill="#8a8a8a" d="M5.415 11.292c0.185 0.185 0.462 0.154 0.646 0l3.077-3.077c0.215-0.215 0.585-0.246 0.862 0s0.246 0.677 0 0.923l-3.785 3.723c-0.831 0.831-2.215 0.831-3.046 0l-0.031-0.031c-0.831-0.831-0.831-2.215 0-3.046l6.677-6.677c0.831-0.831 2.215-0.831 3.046 0l0.031 0.031c0.831 0.831 0.831 2.215 0 3.046l-0.031 0.031c-0.154 0.154-0.185 0.369-0.062 0.554 0.185 0.338 0.338 0.708 0.431 1.077 0.062 0.246 0.338 0.308 0.523 0.154 0.246-0.246 0.462-0.492 0.462-0.492 1.569-1.569 1.569-4.123 0-5.692h-0.062c-1.569-1.569-4.123-1.569-5.692 0l-6.677 6.646c-1.569 1.569-1.569 4.123 0 5.692l0.062 0.062c1.569 1.569 4.092 1.569 5.662 0l3.815-3.785c0.985-0.985 0.954-2.585-0.062-3.569-0.985-0.954-2.585-0.892-3.538 0.092l-3.015 3.015c-0.185 0.185-0.185 0.492 0 0.677l0.708 0.646z"></path>
+</svg>
+<svg id="icon-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="903">
+<path fill="#8a8a8a" d="M17.846 0h-17.231c-0.49 0-0.615 0.129-0.615 0.615v14.769c0 0.486 0.125 0.615 0.615 0.615h17.231c0.49 0 0.615-0.129 0.615-0.615v-14.769c0-0.486-0.125-0.615-0.615-0.615zM5.538 14.769l-4.328 0.051v-3.108l4.328-0.020v3.077zM5.538 10.462h-4.308v-3.077h4.308v3.077zM5.538 6.154h-4.308v-2.462h4.308v2.462zM11.692 14.769h-4.923v-3.077h4.923v3.077zM11.692 10.462h-4.923v-3.077h4.923v3.077zM11.692 6.154h-4.923v-2.462h4.923v2.462zM17.231 14.769h-4.308v-3.077h4.308v3.077zM17.231 10.462h-4.308v-3.077h4.308v3.077zM17.231 6.154h-4.308v-2.462h4.308v2.462z"></path>
+</svg>
+<svg id="icon-split" width="16" height="16" viewBox="0 0 16 16" x="0" y="924">
+<path fill="#8a8a8a" d="M14.222 12.412l-1.811 1.811h-1.022l2.833-2.833v1.022zM14.222 13.742v0.48h-0.48l0.48-0.48zM14.222 10.059l-4.164 4.164h-1.022l4.444-4.444h0.741v0.281zM12.15 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM9.796 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM7.444 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM5.091 9.778l-3.313 3.313v-1.012l2.3-2.3h1.013zM2.748 9.778l-0.97 0.97v-0.97h0.97zM14.222 3.078l-2.255 2.255h-1.022l3.277-3.277v1.022zM14.222 4.409v0.924h-0.924l0.924-0.924zM13.17 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM10.817 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM8.462 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM6.11 1.778l-3.556 3.556h-0.777v-0.244l3.311-3.311h1.022zM3.757 1.778l-1.98 1.98v-1.012l0.967-0.967h1.013zM0 7.111h16v0.889h-16v-0.889z"></path>
+</svg>
+<svg id="icon-face" width="16" height="16" viewBox="0 0 16 16" x="0" y="945">
+<path fill="#8a8a8a" d="M8 16c-4.417 0-8-3.58-8-7.993s3.583-8.007 8-8.007 8 3.594 8 8.007c0 4.413-3.583 7.993-8 7.993zM8 1c-3.865 0-7 3.145-7 7.006s3.135 6.994 7 6.994 7-3.132 7-6.994c0-3.861-3.135-7.006-7-7.006zM8 13c-2.419 0-4.436-1.718-4.899-4h1.041c0.446 1.722 1.997 3 3.859 3s3.412-1.278 3.858-3h1.041c-0.463 2.282-2.48 4-4.899 4zM11 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1zM5 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1z"></path>
+</svg>
+<svg id="icon-split-page" width="16" height="16" viewBox="0 0 16 16" x="0" y="966">
+<path fill="#8a8a8a" d="M14.25 1v4h-12.5v-4h1.042v3h10.417v-3zM1.75 15v-4h12.5v4h-1.041v-3h-10.417v3zM1 7h14v2h-14z"></path>
+</svg>
+<svg id="icon-anchor" width="16" height="16" viewBox="0 0 16 16" x="0" y="987">
+<path fill="#8a8a8a" d="M15.297 9.614l-1.117-1.117c-0.075-0.075-0.174-0.116-0.28-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l0.442-0.442c-0.107 1.281-0.667 2.486-1.579 3.399-0.925 0.925-2.149 1.487-3.45 1.583l-0-7.611 3.106-0c0.218 0 0.396-0.178 0.396-0.396s-0.178-0.396-0.396-0.396h-3.106v-4.407l2.781 2.781c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-3.434-3.434c-0.083-0.083-0.198-0.125-0.316-0.114-0.109-0.003-0.214 0.038-0.291 0.116l-3.434 3.434c-0.154 0.154-0.154 0.406 0 0.56 0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l2.781-2.781v4.405h-3.106c-0.218 0-0.396 0.178-0.396 0.396s0.178 0.396 0.396 0.396l3.106-0v7.613c-1.311-0.091-2.546-0.653-3.478-1.585-0.92-0.92-1.481-2.137-1.582-3.43l0.444 0.444c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-1.117-1.117c-0.075-0.075-0.174-0.116-0.279-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28 0.174 0.116 0.28 0.116c0.106 0 0.205-0.041 0.28-0.116l0.475-0.475c0.047 0.697 0.208 1.376 0.48 2.018 0.316 0.748 0.769 1.42 1.346 1.997s1.249 1.030 1.997 1.346c0.775 0.328 1.598 0.494 2.446 0.494s1.671-0.166 2.446-0.494c0.748-0.316 1.42-0.769 1.997-1.346s1.030-1.249 1.346-1.997c0.275-0.651 0.437-1.338 0.481-2.045l0.474 0.474c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116 0.116-0.174 0.116-0.28c0-0.106-0.041-0.205-0.116-0.28z"></path>
+</svg>
+<svg id="icon-link" width="16" height="16" viewBox="0 0 16 16" x="0" y="1008">
+<path fill="#8a8a8a" d="M8.369 12.831l-0.646-0.092s-0.431-0.092-0.646-0.185c-0.123-0.031-0.277 0-0.369 0.092l-0.154 0.154c-0.892 0.892-2.338 0.985-3.262 0.185-1.046-0.892-1.077-2.492-0.123-3.446l2.338-2.338c0.308-0.308 0.677-0.492 1.046-0.615 0.492-0.123 1.015-0.092 1.477 0.092 0.277 0.123 0.554 0.277 0.8 0.523 0.123 0.123 0.215 0.246 0.308 0.4 0.123 0.215 0.4 0.246 0.554 0.062l0.862-0.862c0.123-0.123 0.123-0.308 0.031-0.462-0.123-0.185-0.277-0.338-0.431-0.492-0.215-0.215-0.462-0.431-0.738-0.585-0.431-0.277-0.923-0.462-1.446-0.554-0.954-0.185-2-0.031-2.862 0.431-0.338 0.185-0.677 0.431-0.954 0.708l-2.246 2.246c-1.631 1.631-1.754 4.277-0.185 5.938 1.631 1.785 4.4 1.815 6.092 0.123l0.769-0.769c0.215-0.154 0.062-0.523-0.215-0.554zM14.031 1.785c-1.692-1.569-4.338-1.446-5.938 0.185l-0.708 0.677c-0.215 0.215-0.062 0.585 0.215 0.615 0.431 0.031 0.862 0.123 1.292 0.246 0.123 0.031 0.277 0 0.369-0.092l0.154-0.154c0.892-0.892 2.338-0.985 3.262-0.185 1.046 0.892 1.077 2.492 0.123 3.446l-2.338 2.338c-0.308 0.308-0.677 0.492-1.046 0.615-0.492 0.123-1.015 0.092-1.477-0.092-0.277-0.123-0.554-0.277-0.8-0.523-0.123-0.123-0.215-0.246-0.308-0.4-0.123-0.215-0.4-0.246-0.554-0.062l-0.862 0.862c-0.123 0.123-0.123 0.308-0.031 0.462 0.123 0.185 0.277 0.338 0.431 0.492 0.215 0.215 0.492 0.431 0.738 0.585 0.431 0.277 0.923 0.462 1.415 0.554 0.954 0.185 2 0.031 2.862-0.431 0.338-0.185 0.677-0.431 0.954-0.708l2.338-2.338c1.723-1.692 1.662-4.462-0.092-6.092z"></path>
+</svg>
+<svg id="icon-unlink" width="16" height="16" viewBox="0 0 16 16" x="0" y="1029">
+<path fill="#8a8a8a" d="M7.385 11.262c-0.185 0-0.369-0.031-0.554-0.092-0.185-0.031-0.4-0.092-0.585-0.154-0.123-0.031-0.246 0-0.308 0.062l-0.123 0.123c-0.769 0.769-2.031 0.862-2.862 0.154-0.892-0.8-0.954-2.185-0.092-3.015l2.031-2.031c0.277-0.277 0.585-0.431 0.923-0.523 0.431-0.123 0.892-0.092 1.292 0.092 0.246 0.092 0.492 0.246 0.677 0.462 0.092 0.092 0.185 0.215 0.277 0.369 0.092 0.185 0.338 0.215 0.492 0.062l0.769-0.769c0.123-0.123 0.123-0.277 0.031-0.4-0.123-0.154-0.246-0.277-0.369-0.431-0.185-0.185-0.431-0.369-0.646-0.523-0.4-0.246-0.8-0.4-1.262-0.492-0.831-0.154-1.723-0.031-2.523 0.4-0.308 0.154-0.585 0.369-0.831 0.615l-1.969 1.969c-1.415 1.415-1.538 3.723-0.154 5.2 1.446 1.538 3.877 1.6 5.354 0.092l0.677-0.677c0.154-0.154 0.031-0.462-0.246-0.492zM12.462 6.923c1.477-1.477 1.446-3.908-0.092-5.354-1.477-1.354-3.785-1.262-5.2 0.154l-0.615 0.615c-0.185 0.185-0.062 0.492 0.185 0.523 0.369 0.031 0.769 0.092 1.138 0.215 0.123 0.031 0.246 0 0.308-0.062l0.123-0.123c0.769-0.769 2.031-0.862 2.862-0.154 0.892 0.8 0.954 2.185 0.092 3.015l-2.031 2.031c-0.277 0.277-0.585 0.431-0.923 0.523-0.431 0.123-0.892 0.092-1.292-0.092-0.246-0.092-0.492-0.246-0.677-0.462-0.092-0.092-0.185-0.215-0.246-0.338-0.092-0.185-0.338-0.215-0.492-0.062l-0.738 0.738c-0.123 0.123-0.123 0.277-0.031 0.4 0.123 0.154 0.215 0.277 0.369 0.431 0.215 0.215 0.431 0.369 0.646 0.523 0.4 0.246 0.8 0.4 1.262 0.492 0.831 0.154 1.723 0.031 2.523-0.4 0.308-0.154 0.585-0.369 0.831-0.615l2-2zM13.877 12.615l1.415-1.415c0.123-0.123 0.123-0.308 0-0.431l-0.862-0.862c-0.123-0.123-0.308-0.123-0.431 0l-1.385 1.446-1.323-1.323c-0.123-0.123-0.308-0.123-0.431 0l-0.862 0.862c-0.123 0.123-0.123 0.308 0 0.431l1.323 1.323-1.292 1.292c-0.123 0.123-0.123 0.308 0 0.431l0.862 0.862c0.123 0.123 0.308 0.123 0.431 0l1.292-1.292 1.385 1.385c0.123 0.123 0.308 0.123 0.431 0l0.862-0.862c0.123-0.123 0.123-0.308 0-0.431l-1.415-1.415z"></path>
+</svg>
+<svg id="icon-baidu-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1050">
+<path fill="#8a8a8a" d="M9.473 10.846c0.725-0.156 0.626-1.022 0.605-1.211-0.035-0.292-0.379-0.802-0.845-0.762-0.587 0.053-0.672 0.9-0.672 0.9-0.080 0.392 0.189 1.229 0.913 1.073zM10.243 12.353c-0.021 0.061-0.069 0.217-0.027 0.352 0.081 0.305 0.345 0.318 0.345 0.318h0.379v-0.928h-0.407c-0.183 0.055-0.271 0.197-0.291 0.258zM10.819 9.393c0.401 0 0.724-0.461 0.724-1.031s-0.323-1.030-0.724-1.030c-0.399 0-0.724 0.461-0.724 1.030s0.324 1.031 0.724 1.031zM12.543 9.461c0.535 0.069 0.879-0.501 0.947-0.935 0.070-0.432-0.275-0.935-0.654-1.021-0.379-0.087-0.853 0.521-0.897 0.917-0.052 0.485 0.069 0.969 0.603 1.038zM13.854 12.006s-0.828-0.641-1.311-1.333c-0.655-1.021-1.586-0.605-1.897-0.086-0.31 0.519-0.793 0.847-0.861 0.935-0.069 0.085-1 0.588-0.793 1.505s0.932 0.899 0.932 0.899 0.535 0.053 1.155-0.086c0.621-0.137 1.155 0.035 1.155 0.035s1.449 0.485 1.846-0.449c0.396-0.935-0.224-1.42-0.224-1.42zM11.374 13.397h-0.942c-0.407-0.081-0.569-0.359-0.589-0.406s-0.135-0.271-0.075-0.651c0.176-0.569 0.677-0.61 0.677-0.61h0.501v-0.617l0.427 0.007v2.277zM13.129 13.39h-1.084c-0.42-0.108-0.44-0.407-0.44-0.407v-1.199l0.44-0.007v1.078c0.027 0.115 0.169 0.136 0.169 0.136h0.447v-1.206h0.468v1.605zM14.664 10.189c0-0.207-0.172-0.831-0.81-0.831s-0.725 0.589-0.725 1.005c0 0.397 0.033 0.951 0.827 0.933s0.707-0.899 0.707-1.107zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l0.052-0.111c-0.201-0.083-0.385-0.213-0.533-0.393-0.345-0.423-0.433-0.979-0.368-1.358 0.062-0.522 0.394-1.388 1.275-1.467 0.032-0.003 0.069-0.005 0.106-0.005 0.001 0 0.002 0 0.003 0h-0c0.051 0 0.1 0.003 0.149 0.009 0.061-0.878 0.647-1.546 1.386-1.546 0.072 0 0.14 0.015 0.208 0.027l0.092-0.195c0.143-0.304 0.215-0.692 0.215-1.165 0-0.92-0.325-1.706-0.977-2.357s-1.437-0.977-2.357-0.977-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM8.734 14h-7.401l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h5.811c0.083 0.274 0.202 0.494 0.344 0.667z"></path>
+</svg>
+<svg id="icon-google-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1071">
+<path fill="#8a8a8a" d="M10.813 8.519c0 0.622 0.208 1.071 0.618 1.335 0.335 0.216 0.725 0.249 0.927 0.249 0.049 0 0.089-0.002 0.116-0.004 0 0-0.064 0.418 0.246 0.832h-0.014c-0.537 0-2.289 0.112-2.289 1.553 0 1.465 1.609 1.54 1.932 1.54 0.025 0 0.040-0.001 0.040-0.001 0.003 0 0.027 0.001 0.066 0.001 0.207 0 0.743-0.026 1.24-0.268 0.645-0.313 0.972-0.858 0.972-1.619 0-0.735-0.499-1.173-0.863-1.493-0.222-0.195-0.414-0.363-0.414-0.527 0-0.167 0.14-0.292 0.317-0.451 0.287-0.257 0.557-0.622 0.557-1.313 0-0.607-0.079-1.015-0.564-1.273 0.051-0.026 0.229-0.045 0.318-0.057 0.263-0.036 0.647-0.077 0.647-0.291v-0.041h-1.916c-0.019-0.001-1.937 0.071-1.937 1.827zM13.906 12.274c0.037 0.586-0.465 1.019-1.217 1.073-0.765 0.056-1.394-0.288-1.431-0.873-0.018-0.281 0.106-0.557 0.348-0.777 0.245-0.223 0.583-0.359 0.949-0.387 0.043-0.003 0.086-0.005 0.129-0.005 0.707 0 1.187 0.416 1.221 0.968zM13.405 8.118c0.188 0.661-0.096 1.353-0.548 1.48-0.048 0.014-0.103 0.022-0.16 0.022-0 0-0 0-0 0h0c-0.415 0-0.825-0.419-0.977-0.997-0.085-0.325-0.078-0.608 0.019-0.881 0.096-0.268 0.268-0.449 0.485-0.511 0.048-0.014 0.103-0.022 0.16-0.022 0 0 0 0 0 0h-0c0.501 0 0.823 0.207 1.021 0.908zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l1.275-2.711c-0.009-0.099-0.017-0.199-0.017-0.308 0-1.052 0.509-1.742 1.153-2.151 0.109-0.284 0.174-0.621 0.174-1.034 0-0.92-0.325-1.706-0.977-2.357-0.651-0.652-1.437-0.977-2.357-0.977s-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM9.895 10.667l0.313-0.667h0.225c0.137 0.189 0.299 0.35 0.483 0.48l0.006 0.004c-0.115 0.055-0.221 0.116-0.322 0.182h-0.705zM10.184 14h-8.851l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h7.195c0.099 0.255 0.235 0.479 0.411 0.667z"></path>
+</svg>
+<svg id="icon-about" width="16" height="16" viewBox="0 0 16 16" x="0" y="1092">
+<path fill="#8a8a8a" d="M8.011 0.991c-3.868 0-7.003 3.135-7.003 7.003s3.135 7.003 7.003 7.003 7.003-3.136 7.003-7.003c0-3.868-3.135-7.003-7.003-7.003zM7.984 11.487c-0.399 0-0.723-0.333-0.723-0.743s0.324-0.743 0.723-0.743c0.399 0 0.723 0.333 0.723 0.743s-0.324 0.743-0.723 0.743zM10.003 6.816c-0.1 0.192-0.218 0.357-0.355 0.496s-0.384 0.374-0.739 0.704c-0.098 0.093-0.177 0.174-0.236 0.245s-0.103 0.134-0.132 0.193c-0.026 0.050-0.049 0.108-0.066 0.168l-0.002 0.007c-0.016 0.059-0.040 0.161-0.072 0.308-0.055 0.312-0.227 0.467-0.516 0.467-0.15 0-0.277-0.051-0.379-0.153s-0.154-0.253-0.154-0.454c0-0.251 0.037-0.47 0.113-0.654s0.175-0.347 0.299-0.486c0.124-0.139 0.292-0.305 0.503-0.497 0.185-0.168 0.319-0.294 0.401-0.38 0.080-0.083 0.149-0.176 0.205-0.279l0.003-0.007c0.056-0.105 0.085-0.219 0.085-0.341 0-0.24-0.086-0.442-0.258-0.607s-0.394-0.247-0.666-0.247c-0.318 0-0.552 0.083-0.702 0.25s-0.277 0.411-0.382 0.735c-0.098 0.339-0.285 0.508-0.559 0.508-0.162 0-0.298-0.059-0.41-0.178s-0.167-0.247-0.167-0.384c0-0.285 0.088-0.573 0.264-0.866s0.434-0.534 0.772-0.726c0.338-0.192 0.733-0.288 1.183-0.288 0.419 0 0.789 0.080 1.11 0.24s0.569 0.378 0.743 0.654c0.175 0.276 0.262 0.576 0.262 0.899 0 0.255-0.050 0.478-0.15 0.67z"></path>
+</svg>
+<svg id="icon-blockquote" width="16" height="16" viewBox="0 0 16 16" x="0" y="1113">
+<path fill="#8a8a8a" d="M13.631 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8zM6 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8z"></path>
+</svg>
+<svg id="icon-table-attr" width="16" height="16" viewBox="0 0 16 16" x="0" y="1134">
+<path fill="#8a8a8a" d="M15.204 1.055h-14.364c-0.41 0-0.743 0.333-0.743 0.743v12.383c0 0.41 0.333 0.743 0.743 0.743h14.364c0.41 0 0.743-0.333 0.743-0.743v-12.383c0-0.41-0.333-0.743-0.743-0.743l-0-0zM15.204 4.027v2.903h-4.293v-2.903h4.293zM5.875 10.563v-2.889h4.293v2.889h-4.293zM10.168 11.306v2.875h-4.293v-2.875h4.293zM5.132 10.563h-4.293v-2.889h4.293v2.889zM10.168 4.027v2.903h-4.293v-2.903h4.293zM10.911 7.674h4.293v2.889h-4.293v-2.889zM6.040 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM3.811 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 4.027h3.55v2.903h-4.293l0-2.903h0.743zM0.839 11.306h4.293v2.875h-4.293v-2.875zM10.911 14.181v-2.875h4.293v2.875h-4.293z"></path>
+</svg>
+<svg id="icon-insert-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1155">
+<path fill="#8a8a8a" d="M14 0h-2s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h2c0.552 0 1-0.448 1-1v-10c0-0.552-0.448-1-1-1zM14 11h-2v-3h2v3zM14 7h-2v-2h2v2zM14 4h-2v-3h2v3zM9 13l-2 3h5l-2-3h-1zM8 11v-10c0-0.552-0.448-1-1-1h-5s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h5c0.552 0 1-0.448 1-1zM7 7h-2v-2h2v2zM7 1v3h-2v-3h2zM4 11h-2v-3h2v3zM4 7h-2v-2h2v2zM4 4h-2v-3h2v3zM5 8h2v3h-2v-3z"></path>
+</svg>
+<svg id="icon-insert-row" width="18" height="16" viewBox="0 0 18 16" x="0" y="1176">
+<path fill="#8a8a8a" d="M17.143 16h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143zM9.143 9.143h-3.429v2.286h3.429v-2.286zM9.143 12.571h-3.429v2.286h3.429v-2.286zM12.571 9.143h-2.286v2.286h2.286v-2.286zM12.571 12.571h-2.286v2.286h2.286v-2.286zM17.143 9.143h-3.429v2.286h3.429v-2.286zM13.714 12.571v2.286h3.429v-2.286h-3.429zM17.143 4.571h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143zM9.143 1.143h-3.429v2.286h3.429v-2.286zM12.571 1.143h-2.286v2.286h2.286v-2.286zM17.143 1.143h-3.429v2.286h3.429v-2.286zM0 3.429l3.429 2.286v1.143l-3.429 2.286v-5.714z"></path>
+</svg>
+<svg id="icon-merge-table" width="21" height="16" viewBox="0 0 21 16" x="0" y="1197">
+<path fill="#8a8a8a" d="M1.484 2.296c0-0.615 0.242-1.198 0.682-1.63 0.43-0.432 1.005-0.666 1.62-0.666h0.016l10.845 0.059c0.615 0 1.198 0.242 1.63 0.682s0.666 1.021 0.666 1.637l-0.059 10.845c0 0.615-0.242 1.198-0.682 1.63-0.432 0.432-1.007 0.666-1.622 0.666h-0.016l-10.845-0.059c-0.615 0-1.198-0.242-1.63-0.682s-0.666-1.023-0.666-1.639l0.061-10.843zM6.199 1.048l-2.412-0.016c-0.333 0-0.65 0.134-0.897 0.374-0.242 0.242-0.374 0.556-0.374 0.897l-0.016 2.461h3.7v-3.716zM10.98 1.072l-3.742-0.024v3.718h3.742v-3.693zM12.020 14.463l2.552 0.016c0.341 0 0.658-0.124 0.897-0.365 0.242-0.242 0.374-0.556 0.374-0.897l0.016-2.579h-3.842v3.825zM12.020 9.598h3.844l0.016-3.793h-3.868v3.793h0.008zM12.020 4.765h3.868l0.016-2.396c0-0.333-0.124-0.658-0.365-0.897-0.242-0.242-0.556-0.374-0.897-0.374l-2.619-0.016v3.683z"></path>
+<path fill="#8a8a8a" d="M5.005 1.478c0.008 0 0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-merge-td" width="16" height="16" viewBox="0 0 16 16" x="0" y="1218">
+<path fill="#8a8a8a" d="M11.371 9.493h2.837v-2.987h-12.416v2.987h9.579zM0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333z"></path>
+</svg>
+<svg id="icon-remove-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1239">
+<path fill="#8a8a8a" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM7 12h1v1h-1s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h5c0.552 0 1 0.448 1 1v7h-1v-3h-2v3h-1v-3h-2v3h1v1h-1v3zM10 4h2v-3h-2v3zM9 4v-3h-2v3h2zM1 13s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h2c0.552 0 1 0.448 1 1v12h-3zM3 1h-2v3h2v-3zM3 5h-2v3h2v-3zM3 9h-2v3h2v-3z"></path>
+</svg>
+<svg id="icon-remove-row" width="16" height="16" viewBox="0 0 16 16" x="0" y="1260">
+<path fill="#8a8a8a" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM9 8h-4v2h1.667l0.333 1h-2v2h2.667l0.333 1h-7c-0.552 0-1-0.448-1-1v-5s0.448-1 1-1h12v1h-4zM4 8h-3v2h3v-2zM4 11h-3v2h3v-2zM1 4c-0.552 0-1-0.448-1-1v-2s0.448-1 1-1h11c0.552 0 1 0.448 1 1v3h-12zM4 1h-3v2h3v-2zM8 1h-3v2h3v-2zM12 1h-3v2h3v-2z"></path>
+</svg>
+<svg id="icon-remove-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="1281">
+<path fill="#8a8a8a" d="M14.857 16v-3.429l3.429-2.286v3.429l-3.429 2.286zM8 11.429l4.571-3.429h5.714l-4.571 3.429h-5.714zM13.714 4.571h-3.429v3.429h-4.571v2.286h1.143v1.143h-5.714c-0.631 0-1.143-0.512-1.143-1.143v-9.143c0-0.631 0.512-1.143 1.143-1.143h12.571c0.631 0 1.143 0.512 1.143 1.143v5.714h-1.143v-2.286zM4.571 1.143h-3.429v2.286h3.429v-2.286zM4.571 4.571h-3.429v2.286h3.429v-2.286zM4.571 8h-3.429v2.286h3.429v-2.286zM9.143 1.143h-3.429v2.286h3.429v-2.286zM9.143 4.571h-3.429v2.286h3.429v-2.286zM13.714 1.143h-3.429v2.286h3.429v-2.286zM13.714 16h-5.714v-3.429h5.714v3.429z"></path>
+</svg>
+<svg id="icon-insert-col2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1302">
+<path fill="#8a8a8a" d="M2 16h2s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v10c0 0.552 0.448 1 1 1zM2 5h2v3h-2v-3zM2 9h2v2h-2v-2zM2 12h2v3h-2v-3zM7 3l2-3h-5l2 3h1zM8 5v10c0 0.552 0.448 1 1 1h5s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-5c-0.552 0-1 0.448-1 1zM9 9h2v2h-2v-2zM9 15v-3h2v3h-2zM12 5h2v3h-2v-3zM12 9h2v2h-2v-2zM12 12h2v3h-2v-3zM11 8h-2v-3h2v3z"></path>
+</svg>
+<svg id="icon-insert-row2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1323">
+<path fill="#8a8a8a" d="M1.154 0h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143zM9.154 6.857h3.429v-2.286h-3.429v2.286zM9.154 3.429h3.429v-2.286h-3.429v2.286zM5.725 6.857h2.286v-2.286h-2.286v2.286zM5.725 3.429h2.286v-2.286h-2.286v2.286zM1.154 6.857h3.429v-2.286h-3.429v2.286zM4.583 3.429v-2.286h-3.429v2.286h3.429zM1.154 11.429h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143zM9.154 14.857h3.429v-2.286h-3.429v2.286zM5.725 14.857h2.286v-2.286h-2.286v2.286zM1.154 14.857h3.429v-2.286h-3.429v2.286zM18.297 12.571l-3.429-2.286v-1.143l3.429-2.286v5.714z"></path>
+</svg>
+<svg id="icon-split-table" width="16" height="16" viewBox="0 0 16 16" x="0" y="1344">
+<path fill="#8a8a8a" d="M0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333zM10.667 9.493v-2.987h-1.792v2.987h1.792zM14.208 9.493v-2.987h-1.792v2.987h1.792zM3.584 9.493v-2.987h-1.792v2.987h1.792zM7.125 9.493v-2.987h-1.792v2.987h1.792z"></path>
+</svg>
+<svg id="icon-merge-table2" width="21" height="16" viewBox="0 0 21 16" x="0" y="1365">
+<path fill="#8a8a8a" d="M19.297 2.296c0-0.615-0.242-1.198-0.682-1.63-0.43-0.432-1.005-0.666-1.62-0.666h-0.016l-10.845 0.059c-0.615 0-1.198 0.242-1.63 0.682s-0.666 1.021-0.666 1.637l0.059 10.845c0 0.615 0.242 1.198 0.682 1.63 0.432 0.432 1.007 0.666 1.622 0.666h0.016l10.845-0.059c0.615 0 1.198-0.242 1.63-0.682s0.666-1.023 0.666-1.639l-0.061-10.843zM14.583 1.048l2.412-0.016c0.333 0 0.65 0.134 0.897 0.374 0.242 0.242 0.374 0.556 0.374 0.897l0.016 2.461h-3.7v-3.716zM9.801 1.072l3.742-0.024v3.718h-3.742v-3.693zM8.761 14.463l-2.552 0.016c-0.341 0-0.658-0.124-0.897-0.365-0.242-0.242-0.374-0.556-0.374-0.897l-0.016-2.579h3.842v3.825zM8.761 9.598h-3.844l-0.016-3.793h3.868v3.793h-0.008zM8.761 4.765h-3.868l-0.016-2.396c0-0.333 0.124-0.658 0.365-0.897 0.242-0.242 0.556-0.374 0.897-0.374l2.619-0.016v3.683z"></path>
+<path fill="#8a8a8a" d="M15.777 1.478c-0.008 0-0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-remove2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1386">
+<path fill="#8a8a8a" d="M6.214 13.804c0.401 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726zM15.299 1.464h-6.178v-0.726c0-0.401-0.325-0.726-0.727-0.726h-0.727c-0.401 0-0.727 0.325-0.727 0.726v0.726h-6.177c-0.008-0-0.017-0-0.026-0-0.401 0-0.726 0.325-0.726 0.726s0.325 0.726 0.726 0.726c0.009 0 0.018-0 0.027-0.001l-0.001 0h1.090v11.615c0.001 0.802 0.651 1.452 1.453 1.452 0 0 0.001 0 0.001 0h9.448c0 0 0.001 0 0.001 0 0.802 0 1.452-0.65 1.453-1.452v-11.615h1.090c0.008 0 0.017 0 0.026 0 0.401 0 0.726-0.325 0.726-0.726s-0.325-0.726-0.726-0.726c-0.009 0-0.018 0-0.027 0l0.001-0zM12.755 13.804c0 0.401-0.325 0.726-0.727 0.726h-7.994c-0.401 0-0.727-0.325-0.727-0.726v-10.889h9.448v10.889zM9.847 13.804c0.402 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726z"></path>
+</svg>
+<svg id="icon-ok" width="16" height="16" viewBox="0 0 16 16" x="0" y="1407">
+<path fill="#8a8a8a" d="M8 16c-4.418 0-8-3.582-8-8s3.582-8 8-8c4.418 0 8 3.582 8 8s-3.582 8-8 8zM12.177 4.986l-4.894 4.894-3.364-3.365-0.918 0.918 4.282 4.283 5.811-5.812-0.917-0.918z"></path>
+</svg>
+<svg id="icon-remove" width="16" height="16" viewBox="0 0 16 16" x="0" y="1428">
+<path fill="#8a8a8a" d="M8 1c-3.867 0-7 3.133-7 7s3.133 7 7 7 7-3.133 7-7c0-3.867-3.133-7-7-7zM11.167 10.7c0.133 0.133 0.133 0.333 0 0.467s-0.333 0.133-0.467 0l-2.7-2.7-2.7 2.7c-0.133 0.133-0.333 0.133-0.467 0s-0.133-0.333 0-0.467l2.7-2.7-2.7-2.7c-0.133-0.133-0.133-0.333 0-0.467s0.333-0.133 0.467 0l2.7 2.7 2.7-2.7c0.133-0.133 0.333-0.133 0.467 0s0.133 0.333 0 0.467l-2.7 2.7 2.7 2.7z"></path>
+</svg>
+<svg id="icon-graft2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1449">
+<path fill="#8a8a8a" d="M11.658 0.504c0.216-0.218 0.516-0.354 0.848-0.354s0.631 0.135 0.847 0.354l1.664 1.664c0.217 0.217 0.351 0.517 0.351 0.848s-0.134 0.631-0.351 0.848l-9.336 9.336c-0.468 0.468-1.365 0.954-2.024 1.089l-3.048 0.625 0.625-3.048c0.133-0.65 0.62-1.557 1.088-2.025l9.336-9.336zM9.96 2.202l-0.848 0.849 3.358 3.359 0.849-0.849-3.359-3.359zM12.184 12.804c0.905-0.457 1.054-0.865 0.639-1.526-0.338-0.537-1.675-0.285-1.797 0.805-0.044 0.398 0.117 0.753 0.421 1.026 0.28-0.096 0.525-0.197 0.737-0.305zM13.063 13.682c-0.092 0.059-0.206 0.124-0.322 0.183l-0.025 0.012c-0.396 0.201-0.877 0.38-1.442 0.54-1.27 0.36-2.968 0.617-5.104 0.781-0.013 0.001-0.028 0.002-0.043 0.002-0.314 0-0.572-0.243-0.594-0.552l-0-0.002c-0.001-0.014-0.002-0.031-0.002-0.048 0-0.313 0.24-0.57 0.547-0.596l0.002-0c1.652-0.127 3.021-0.311 4.101-0.548 0.479-0.104 0.901-0.22 1.266-0.345 0.367 0.331 0.943 0.544 1.616 0.573 0.981 0.043 2.17-0.303 3.22-1.242 0.104-0.093 0.242-0.15 0.393-0.15 0.177 0 0.336 0.078 0.444 0.202l0.001 0.001c0.093 0.106 0.149 0.245 0.149 0.398 0 0.178-0.077 0.338-0.2 0.449l-0.001 0c-1.888 1.687-4.29 1.855-5.796 1.079-0.462-0.238-0.84-0.565-1.093-0.964-0.221-0.346-0.353-0.767-0.353-1.219 0-0.101 0.007-0.2 0.019-0.297l-0.001 0.011c0.25-2.25 3.058-2.78 3.979-1.315 0.752 1.197 0.45 2.291-0.762 3.048z"></path>
+</svg>
+<svg id="icon-func" width="17" height="16" viewBox="0 0 17 16" x="0" y="1470">
+<path fill="#8a8a8a" d="M0.531 15.51v-2.065h4.213c-1.236-0.919-2.162-1.924-2.78-3.018-0.582-1.007-0.926-2.215-0.926-3.503 0-0.014 0-0.029 0-0.043l-0 0.002c0-1.992 0.695-3.612 2.086-4.861 1.39-1.25 3.193-1.874 5.406-1.874 2.215 0 4.017 0.625 5.408 1.874s2.086 2.869 2.086 4.86c0 1.263-0.309 2.441-0.927 3.535s-1.544 2.103-2.78 3.028h4.213v2.065h-6.854v-2.065c1.012-0.756 1.772-1.663 2.278-2.72 0.506-1.056 0.76-2.263 0.76-3.62 0-1.519-0.373-2.715-1.12-3.59-0.745-0.874-1.767-1.31-3.063-1.31s-2.317 0.438-3.063 1.316c-0.746 0.877-1.119 2.076-1.119 3.595 0 1.356 0.253 2.562 0.76 3.615s1.265 1.958 2.278 2.714v2.065h-6.857z"></path>
+</svg>
+<svg id="icon-find" width="16" height="16" viewBox="0 0 16 16" x="0" y="1491">
+<path fill="#8a8a8a" d="M1 0h6v1h-6zM9 0h6v1h-6zM14.875 5h-0.875v-4h-4v4h-4v-4h-4v4h-0.875c-0.619 0-1.125 0.506-1.125 1.125v8.75c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-5.875h2v5.875c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-8.75c0-0.619-0.506-1.125-1.125-1.125zM5.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5zM8.5 8h-1c-0.275 0-0.5-0.225-0.5-0.5s0.225-0.5 0.5-0.5h1c0.275 0 0.5 0.225 0.5 0.5s-0.225 0.5-0.5 0.5zM14.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5z"></path>
+</svg>
+<svg id="icon-date" width="16" height="16" viewBox="0 0 16 16" x="0" y="1512">
+<path fill="#8a8a8a" d="M13.597 2.081h-0.584v2.837c0 0.603-0.489 1.093-1.093 1.093s-1.092-0.49-1.092-1.093v-2.837h-5.64v2.83c0 0.604-0.49 1.094-1.094 1.094-0.603 0-1.092-0.49-1.092-1.094v-2.83h-0.6c-0.775 0-1.402 0.628-1.402 1.402v3.070h14v-3.070c0-0.774-0.627-1.402-1.403-1.402zM4.927 4.612c0 0.463-0.376 0.837-0.837 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.375-0.837 0.837-0.837v0c0.461 0 0.837 0.374 0.837 0.837v2.76zM12.78 4.612c0 0.463-0.374 0.837-0.838 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.374-0.837 0.837-0.837v0c0.464 0 0.838 0.374 0.838 0.837v2.76zM14.182 7.133v5.608c0 0.774-0.627 1.401-1.401 1.401h-9.573c-0.774 0-1.401-0.627-1.401-1.401v-5.608h-0.807v6.45c0 0.774 0.627 1.403 1.403 1.403h11.193c0.776 0 1.403-0.629 1.403-1.403v-6.45h-0.817zM8.393 11.198h1.101c0.109 0.504 0.389 0.649 0.662 0.649 0.405 0 0.651-0.262 0.651-0.723 0-0.26-0.097-0.626-0.651-0.64h-0.351v-0.69h0.159c0.554-0.014 0.687-0.241 0.687-0.66 0-0.271-0.201-0.468-0.526-0.477-0.426-0.011-0.491 0.185-0.598 0.443l-1.031 0.002c0.239-0.793 0.793-1.196 1.661-1.21 1.052 0.028 1.597 0.453 1.635 1.274 0 0.403-0.232 0.708-0.692 0.909 0.589 0.202 0.885 0.563 0.885 1.080-0.037 0.865-0.646 1.319-1.827 1.362-0.998 0.001-1.599-0.483-1.765-1.319zM7.633 11.479v0.975h-3.543v-0.629c0.386-0.605 0.771-1.059 1.492-1.52 0.663-0.433 0.894-0.763 0.894-1.080 0-0.070 0.003-0.433-0.531-0.433-0.372 0.014-0.645 0.182-0.645 0.565l-1.128 0.007c0.065-1.087 0.95-1.473 1.856-1.473 1.032 0.043 1.586 0.482 1.66 1.317 0.037 0.563-0.28 1.101-1.148 1.634-0.48 0.287-0.523 0.319-0.817 0.636h1.91z"></path>
+</svg>
+<svg id="icon-clock" width="16" height="16" viewBox="0 0 16 16" x="0" y="1533">
+<path fill="#8a8a8a" d="M11.331 7.805h-2.732v-2.199c0-0.333-0.267-0.6-0.6-0.6s-0.6 0.267-0.6 0.6v2.932c0.067 0.267 0.267 0.466 0.533 0.466h3.398c0.333 0 0.6-0.267 0.6-0.6s-0.267-0.6-0.6-0.6zM13.53 3.074c-1.399-1.399-3.331-2.199-5.53-2.199-2.132 0-4.131 0.866-5.53 2.199-1.399 1.399-2.265 3.265-2.265 5.33s0.866 3.998 2.265 5.33c1.399 1.399 3.331 2.199 5.53 2.199 2.132 0 4.131-0.866 5.53-2.199 1.399-1.399 2.265-3.265 2.265-5.33s-0.866-3.998-2.265-5.33zM12.664 12.935c-1.199 1.133-2.865 1.866-4.664 1.866s-3.465-0.733-4.664-1.866c-1.199-1.133-1.932-2.732-1.932-4.531s0.733-3.398 1.932-4.531c1.199-1.133 2.865-1.866 4.664-1.866s3.465 0.733 4.664 1.866c1.199 1.133 1.932 2.798 1.932 4.531 0 1.799-0.733 3.398-1.932 4.531zM1.271 2.874l2.332-1.866c0.267-0.2 0.267-0.6 0.067-0.8-0.2-0.267-0.6-0.267-0.866-0.067l-2.332 1.866c-0.267 0.2-0.333 0.6-0.067 0.8 0.2 0.267 0.6 0.267 0.866 0.067zM14.729 2.874c0.267 0.2 0.666 0.133 0.866-0.067 0.2-0.267 0.133-0.6-0.067-0.8l-2.332-1.866c-0.267-0.2-0.666-0.133-0.866 0.067-0.2 0.267-0.2 0.6 0.067 0.8l2.332 1.866z"></path>
+</svg>
+</svg>
diff --git a/public/assets/addons/nkeditor/themes/primary/editor.css b/public/assets/addons/nkeditor/themes/primary/editor.css
new file mode 100644
index 0000000..33f3788
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/primary/editor.css
@@ -0,0 +1,822 @@
+@charset "UTF-8";
+/**
+公共样式
+*/
+.ke-clearfix {
+  zoom: 1;
+  clear: both; }
+
+.ke-clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  font-size: 0;
+  height: 0;
+  line-height: 0;
+  visibility: hidden; }
+
+.ke-animated {
+  animation: zoomIn;
+  animation-duration: 0.3s;
+  animation-fill-mode: both; }
+
+@keyframes zoomIn {
+  from {
+    opacity: 0;
+    transform: scale3d(0.3, 0.3, 0.3); }
+  50% {
+    opacity: 1; } }
+.ke-dialog-mask {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5; }
+
+.ke-dialog-lock {
+  background-color: #FFF;
+  filter: alpha(opacity=50);
+  opacity: 0.5;
+  z-index: 811213;
+  left: 0;
+  top: 0;
+  position: absolute; }
+
+/**
+编辑器样式开始
+ */
+.ke-container {
+  display: block;
+  background-color: #FFF;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  /**
+  通用样式
+   */
+  /**
+   toolbar 样式
+   */
+  /**
+   ke-edit
+   */
+  /**
+   statusbar start
+   */ }
+  .ke-container .ke-shadow {
+    box-shadow: 1px 1px 3px #A0A0A0;
+    -moz-box-shadow: 1px 1px 3px #A0A0A0;
+    -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+    filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+    background-color: #F0F0EE; }
+  .ke-container .ke-menu a,
+  .ke-container .ke-menu a:hover,
+  .ke-container .ke-dialog a,
+  .ke-container .ke-dialog a:hover {
+    color: #337FE5;
+    text-decoration: none; }
+  .ke-container .ke-toolbar {
+    text-align: left;
+    overflow: hidden;
+    zoom: 1;
+    padding: 0px 5px; }
+    .ke-container .ke-toolbar .ke-outline {
+      padding: 10px 5px;
+      font-size: 0;
+      line-height: 0;
+      cursor: pointer;
+      display: block;
+      float: left;
+      /**
+       * 按钮通用样式
+       */ }
+      .ke-container .ke-toolbar .ke-outline .ke-toolbar-icon {
+        font-size: 0;
+        line-height: 0;
+        overflow: hidden;
+        display: block;
+        width: 16px;
+        height: 16px;
+        margin: 0px 2px; }
+    .ke-container .ke-toolbar .ke-on {
+      background: #ebebeb; }
+    .ke-container .ke-toolbar .ke-selected {
+      background-color: #ebebeb; }
+    .ke-container .ke-toolbar .ke-disabled {
+      cursor: default; }
+    .ke-container .ke-toolbar .ke-separator {
+      height: 16px;
+      margin: 2px 3px;
+      border-left: 1px solid #A0A0A0;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0;
+      width: 0;
+      font-size: 0;
+      line-height: 0;
+      overflow: hidden;
+      display: block;
+      float: left; }
+    .ke-container .ke-toolbar .ke-hr {
+      clear: both;
+      height: 1px;
+      width: calc(100% - (2 * 2px));
+      background: #ebebeb; }
+  .ke-container .ke-edit {
+    padding: 0; }
+    .ke-container .ke-edit .ke-edit-iframe,
+    .ke-container .ke-edit .ke-edit-textarea {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      overflow: auto; }
+    .ke-container .ke-edit .ke-edit-textarea {
+      font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+      color: #000;
+      overflow: auto;
+      resize: none; }
+      .ke-container .ke-edit .ke-edit-textarea:focus {
+        outline: none; }
+  .ke-container .ke-statusbar {
+    position: relative;
+    background-color: #f5f5f5;
+    border-top: 1px solid #e1e1e1;
+    font-size: 0;
+    line-height: 0;
+    *height: 12px;
+    overflow: hidden;
+    text-align: center;
+    cursor: s-resize;
+    display: none; }
+    .ke-container .ke-statusbar .ke-statusbar-center-icon {
+      background-position: -0px -754px;
+      width: 15px;
+      height: 11px; }
+    .ke-container .ke-statusbar .ke-statusbar-right-icon {
+      position: absolute;
+      right: 0;
+      bottom: 0;
+      cursor: se-resize;
+      width: 11px;
+      height: 11px; }
+
+/**
+     menu 右键菜单
+     */
+.ke-menu {
+  border: 1px solid #cccccc;
+  background-color: #f5f5f5;
+  color: #222222;
+  padding: 2px;
+  font-family: "sans serif", tahoma, verdana, helvetica;
+  font-size: 12px;
+  text-align: left;
+  overflow: hidden;
+  /**
+  表情插件
+   */ }
+  .ke-menu .ke-menu-item {
+    border: 1px solid #F1F1F1;
+    background-color: #F1F1F1;
+    color: #222222;
+    height: 24px;
+    overflow: hidden;
+    cursor: pointer; }
+    .ke-menu .ke-menu-item .ke-inline-block {
+      display: -moz-inline-stack;
+      display: inline-block;
+      vertical-align: middle;
+      zoom: 1;
+      *display: inline; }
+      .ke-menu .ke-menu-item .ke-inline-block .ke-inline-block {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+    .ke-menu .ke-menu-item .ke-menu-item-left {
+      width: 27px;
+      text-align: center;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-item-center {
+      width: 0;
+      height: 24px;
+      border-left: 1px solid #E3E3E3;
+      border-right: 1px solid #FFFFFF;
+      border-top: 0;
+      border-bottom: 0; }
+    .ke-menu .ke-menu-item .ke-menu-item-center-on {
+      border-left: 1px solid #E9EFF6;
+      border-right: 1px solid #E9EFF6; }
+    .ke-menu .ke-menu-item .ke-menu-item-right {
+      border: 0;
+      padding: 0 0 0 5px;
+      line-height: 24px;
+      text-align: left;
+      overflow: hidden; }
+    .ke-menu .ke-menu-item .ke-menu-separator {
+      margin: 2px 0;
+      height: 0;
+      overflow: hidden;
+      border-top: 1px solid #e1e1e1;
+      border-bottom: 1px solid #FFFFFF;
+      border-left: 0;
+      border-right: 0; }
+  .ke-menu .ke-menu-item-on {
+    border: 1px solid #5690D2;
+    background-color: #E9EFF6; }
+  .ke-menu .ke-plugin-emoticons {
+    position: relative; }
+    .ke-menu .ke-plugin-emoticons .ke-preview {
+      position: absolute;
+      text-align: center;
+      margin: 2px;
+      padding: 10px;
+      top: 0;
+      border: 1px solid #A0A0A0;
+      background-color: #FFFFFF;
+      display: none; }
+      .ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img {
+        border: 0;
+        margin: 0;
+        padding: 0; }
+    .ke-menu .ke-plugin-emoticons .ke-table {
+      border: 0;
+      margin: 0;
+      padding: 0;
+      border-collapse: separate; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-cell {
+        margin: 0;
+        padding: 1px;
+        border: 1px solid #f5f5f5;
+        cursor: pointer; }
+        .ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img {
+          display: block;
+          background-repeat: no-repeat;
+          overflow: hidden;
+          margin: 2px;
+          width: 24px;
+          height: 24px;
+          margin: 0;
+          padding: 0;
+          border: 0; }
+      .ke-menu .ke-plugin-emoticons .ke-table .ke-on {
+        border: 1px solid #5690D2;
+        background-color: #E9EFF6; }
+    .ke-menu .ke-plugin-emoticons .ke-page {
+      text-align: right;
+      margin: 5px;
+      padding: 0;
+      border: 0;
+      font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+      color: #333;
+      text-decoration: none; }
+
+/**
+ colorpicker
+ */
+.ke-colorpicker {
+  border: 1px solid #A0A0A0;
+  background-color: #F1F1F1;
+  color: #222222;
+  padding: 2px; }
+  .ke-colorpicker .ke-colorpicker-table {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    border-collapse: separate; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell {
+      font-size: 0;
+      line-height: 0;
+      border: 1px solid #F0F0EE;
+      cursor: pointer;
+      margin: 3px;
+      padding: 0; }
+      .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color {
+        width: 14px;
+        height: 14px;
+        margin: 3px;
+        padding: 0;
+        border: 0; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top {
+      font-family: "sans serif", tahoma, verdana, helvetica;
+      font-size: 12px;
+      line-height: 24px;
+      border: 1px solid #F1F1F1;
+      cursor: pointer;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on {
+      border: 1px solid #5690D2; }
+    .ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected {
+      border: 1px solid #2446AB; }
+
+/**
+ dialog
+ */
+.ke-dialog {
+  margin: 0;
+  padding: 0;
+  border: 1px solid #cccccc;
+  zoom: 1;
+  box-shadow: 1px 1px 3px #A0A0A0;
+  -moz-box-shadow: 1px 1px 3px #A0A0A0;
+  -webkit-box-shadow: 1px 1px 3px #A0A0A0;
+  filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+  border-radius: 5px;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  overflow: hidden; }
+  .ke-dialog .ke-dialog-header {
+    border: 0;
+    margin: 0;
+    font-weight: bold;
+    font-size: 14px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0px 10px;
+    text-align: left;
+    color: #222;
+    cursor: move;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    border-bottom: 1px solid #c6c6c6;
+    background: transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;
+    position: relative;
+    cursor: move; }
+    .ke-dialog .ke-dialog-header .ke-dialog-icon-close {
+      height: 20px;
+      width: 20px;
+      cursor: pointer;
+      background: url("../common/icons-all.gif") 0 -59px;
+      position: absolute;
+      right: 5px;
+      top: 4px; }
+      .ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover {
+        background-position: 0px -89px; }
+  .ke-dialog .ke-dialog-content {
+    background-color: #FFF;
+    width: 100%;
+    height: 100%;
+    color: #333;
+    outline: 0;
+    zoom: 1; }
+    .ke-dialog .ke-dialog-content .ke-dialog-body {
+      font: 12px/1.5 "sans serif", tahoma, verdana, helvetica;
+      text-align: left;
+      overflow: hidden;
+      width: 100%; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea {
+        display: block;
+        width: 408px;
+        height: 260px;
+        font-family: "sans serif", tahoma, verdana, helvetica;
+        font-size: 12px;
+        border: 1px solid #cccccc; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus {
+          border-color: #66afe9;
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-select {
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline;
+        width: auto;
+        border: 1px solid #cccccc;
+        height: 30px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-form {
+        margin: 0;
+        padding: 0; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number {
+        width: 50px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox {
+        position: relative;
+        top: 6px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body textarea {
+        display: block;
+        overflow: auto;
+        padding: 0;
+        resize: none; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus {
+          outline: none; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text {
+        display: inline-block !important;
+        max-width: 400px;
+        height: 30px;
+        line-height: 30px;
+        border: 1px solid #cccccc;
+        font-size: 14px;
+        margin: 0;
+        outline: 0;
+        padding: 0px 10px;
+        *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus {
+          border-color: #66afe9; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color {
+        border: 1px solid #e1e1e1;
+        background-color: #FFFFFF;
+        font-size: 12px;
+        width: 60px;
+        height: 30px;
+        line-height: 30px;
+        padding-left: 5px;
+        overflow: hidden;
+        cursor: pointer;
+        display: -moz-inline-stack;
+        display: inline-block;
+        vertical-align: middle;
+        zoom: 1;
+        *display: inline; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area {
+        position: relative;
+        overflow: hidden;
+        margin: 0;
+        padding: 0;
+        top: -1px;
+        position: relative;
+        *height: 25px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file {
+          position: absolute;
+          font-size: 60px;
+          top: 0;
+          right: 0;
+          padding: 0;
+          margin: 0;
+          z-index: 811212;
+          border: 0 none;
+          opacity: 0;
+          cursor: pointer;
+          width: 62px;
+          height: 30px;
+          filter: alpha(opacity=0); }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common {
+          top: -1px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button {
+          padding: 8px 15px; }
+      .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner {
+        padding: 10px 20px 0px 20px;
+        /**
+         tabs
+         */ }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row {
+          border: 1px solid #FFFFFF;
+          margin-bottom: 10px;
+          overflow: hidden; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left {
+            float: left;
+            height: 30px;
+            line-height: 30px;
+            width: 60px;
+            text-align: right; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right {
+            float: left;
+            text-align: left; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block {
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button {
+                position: relative;
+                top: -1px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label {
+              cursor: pointer;
+              display: -moz-inline-stack;
+              display: inline-block;
+              vertical-align: middle;
+              text-align: right;
+              zoom: 1;
+              *display: inline; }
+              .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img {
+                display: -moz-inline-stack;
+                display: inline-block;
+                vertical-align: middle;
+                zoom: 1;
+                *display: inline; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header {
+          height: 30px;
+          line-height: 30px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text {
+            height: 22px;
+            line-height: 22px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button {
+            padding: 3px 10px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox {
+            margin-left: 10px; }
+        .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs {
+          font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+          border-bottom: 1px solid #e1e1e1;
+          margin-bottom: 20px; }
+          .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul {
+            list-style: none outside none;
+            margin: 0;
+            padding: 0; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li {
+              position: relative;
+              margin: 0 2px -1px 0;
+              padding: 0 20px;
+              float: left;
+              line-height: 25px;
+              text-align: center;
+              color: #337ab7;
+              cursor: pointer; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected {
+              background-color: #FFF;
+              border: 1px solid #e1e1e1;
+              border-bottom: 1px solid #FFF;
+              color: #555555;
+              cursor: default;
+              border-top-left-radius: 3px;
+              border-top-right-radius: 3px; }
+            .ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on {
+              background-color: #FFF;
+              color: #000; }
+    .ke-dialog .ke-dialog-content .ke-dialog-loading {
+      position: absolute;
+      top: 0;
+      left: 1px;
+      z-index: 1;
+      text-align: center; }
+      .ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content {
+        background: url("../common/loading.gif") no-repeat center;
+        color: #666;
+        font-size: 14px;
+        font-weight: bold;
+        height: 31px;
+        line-height: 31px;
+        padding-left: 36px; }
+  .ke-dialog .ke-dialog-footer {
+    font: 12px/1 "sans serif", tahoma, verdana, helvetica;
+    text-align: right;
+    padding: 0 15px 5px 0;
+    background-color: #FFF;
+    height: 40px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-yes {
+      margin: 5px; }
+    .ke-dialog .ke-dialog-footer .ke-dialog-no {
+      margin: 5px 10px 5px 5px; }
+  .ke-dialog .ke-button-common {
+    display: inline-block;
+    text-align: center;
+    background: none;
+    border: none;
+    padding: 0;
+    cursor: pointer; }
+  .ke-dialog .ke-button-outer {
+    background-position: 0 -25px;
+    padding: 0;
+    display: -moz-inline-stack;
+    display: inline-block;
+    vertical-align: middle;
+    zoom: 1;
+    *display: inline; }
+  .ke-dialog .ke-button {
+    color: #333;
+    font-size: 12px;
+    border: 1px solid #e6e6e6;
+    background-color: #e6e6e6;
+    padding: 7px 10px;
+    margin-top: -4px;
+    color: #444;
+    text-decoration: none;
+    transition: background-color .3s ease-out, border-color .3s ease-out; }
+    .ke-dialog .ke-button:hover {
+      border: 1px solid #e1e1e1;
+      background-color: #e1e1e1; }
+  .ke-dialog .ke-dialog-btn {
+    font-size: 12px;
+    margin: 5px;
+    background: #2e8ded;
+    color: #fff !important;
+    padding: 8px 12px;
+    display: inline-block;
+    border-radius: 2px;
+    cursor: pointer;
+    text-decoration: none;
+    transition: .3s ease-out; }
+    .ke-dialog .ke-dialog-btn:hover {
+      filter: alpha(opacity=80);
+      box-shadow: none;
+      box-shadow: none;
+      opacity: .8; }
+
+.ke-container-primary .ke-toolbar {
+  border-top: 5px solid #009688;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+  background-clip: padding-box;
+  text-rendering: optimizelegibility; }
+  .ke-container-primary .ke-toolbar .ke-toolbar-icon {
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-container-primary .ke-toolbar .ke-icon-source {
+    background-position: 0 0px; }
+  .ke-container-primary .ke-toolbar .ke-icon-preview {
+    background-position: 0 -63px; }
+  .ke-container-primary .ke-toolbar .ke-icon-print {
+    background-position: 0 -84px; }
+  .ke-container-primary .ke-toolbar .ke-icon-undo {
+    background-position: 0 -21px; }
+  .ke-container-primary .ke-toolbar .ke-icon-redo {
+    background-position: 0 -42px; }
+  .ke-container-primary .ke-toolbar .ke-icon-template {
+    background-position: 0 -105px; }
+  .ke-container-primary .ke-toolbar .ke-icon-cut {
+    background-position: 0 -147px; }
+  .ke-container-primary .ke-toolbar .ke-icon-copy {
+    background-position: 0 -168px; }
+  .ke-container-primary .ke-toolbar .ke-icon-paste {
+    background-position: 0 -189px; }
+  .ke-container-primary .ke-toolbar .ke-icon-selectall {
+    background-position: 0 -483px; }
+  .ke-container-primary .ke-toolbar .ke-icon-justifyleft {
+    background-position: 0 -252px; }
+  .ke-container-primary .ke-toolbar .ke-icon-justifycenter {
+    background-position: 0 -273px; }
+  .ke-container-primary .ke-toolbar .ke-icon-justifyright {
+    background-position: 0 -294px; }
+  .ke-container-primary .ke-toolbar .ke-icon-justifyfull {
+    background-position: 0 -315px; }
+  .ke-container-primary .ke-toolbar .ke-icon-insertorderedlist {
+    background-position: 0 -336px; }
+  .ke-container-primary .ke-toolbar .ke-icon-insertunorderedlist {
+    background-position: 0 -357px; }
+  .ke-container-primary .ke-toolbar .ke-icon-indent {
+    background-position: 0 -378px; }
+  .ke-container-primary .ke-toolbar .ke-icon-outdent {
+    background-position: 0 -399px; }
+  .ke-container-primary .ke-toolbar .ke-icon-subscript {
+    background-position: 0 -420px; }
+  .ke-container-primary .ke-toolbar .ke-icon-superscript {
+    background-position: 0 -441px; }
+  .ke-container-primary .ke-toolbar .ke-icon-date {
+    background-position: 0px -304px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-time {
+    background-position: 0px -320px;
+    width: 25px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-formatblock {
+    background-position: 0 -546px; }
+  .ke-container-primary .ke-toolbar .ke-icon-fontname {
+    background-position: 0 -567px; }
+  .ke-container-primary .ke-toolbar .ke-icon-fontsize {
+    background-position: 0 -588px; }
+  .ke-container-primary .ke-toolbar .ke-icon-forecolor {
+    background-position: 0 -609px; }
+  .ke-container-primary .ke-toolbar .ke-icon-hilitecolor {
+    background-position: 0 -630px; }
+  .ke-container-primary .ke-toolbar .ke-icon-bold {
+    background-position: 0 -651px; }
+  .ke-container-primary .ke-toolbar .ke-icon-italic {
+    background-position: 0 -672px; }
+  .ke-container-primary .ke-toolbar .ke-icon-underline {
+    background-position: 0 -693px; }
+  .ke-container-primary .ke-toolbar .ke-icon-strikethrough {
+    background-position: 0 -714px; }
+  .ke-container-primary .ke-toolbar .ke-icon-removeformat {
+    background-position: 0 -756px; }
+  .ke-container-primary .ke-toolbar .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-container-primary .ke-toolbar .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-container-primary .ke-toolbar .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-container-primary .ke-toolbar .ke-icon-div {
+    background-position: 0px -544px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-formula {
+    background-position: 0px -576px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-hr {
+    background-position: 0 -924px; }
+  .ke-container-primary .ke-toolbar .ke-icon-emoticons {
+    background-position: 0 -945px; }
+  .ke-container-primary .ke-toolbar .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-container-primary .ke-toolbar .ke-icon-unlink {
+    background-position: 0 -1029px; }
+  .ke-container-primary .ke-toolbar .ke-icon-fullscreen {
+    background-position: 0 -525px; }
+  .ke-container-primary .ke-toolbar .ke-icon-about {
+    background-position: 0 -1092px; }
+  .ke-container-primary .ke-toolbar .ke-icon-quote {
+    background-position: 0 -1114px; }
+  .ke-container-primary .ke-toolbar .ke-icon-plainpaste {
+    background-position: 0 -210px; }
+  .ke-container-primary .ke-toolbar .ke-icon-wordpaste {
+    background-position: 0 -231px; }
+  .ke-container-primary .ke-toolbar .ke-icon-table {
+    background-position: 0px -903px;
+    width: 18px !important; }
+  .ke-container-primary .ke-toolbar .ke-icon-tablemenu {
+    background-position: 0px -768px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-code {
+    background-position: 0 -126px; }
+  .ke-container-primary .ke-toolbar .ke-icon-map {
+    background-position: 0px -976px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-baidumap {
+    background-position: 0 -1050px; }
+  .ke-container-primary .ke-toolbar .ke-icon-lineheight {
+    background-position: 0 -735px; }
+  .ke-container-primary .ke-toolbar .ke-icon-clearhtml {
+    background-position: 0 -462px; }
+  .ke-container-primary .ke-toolbar .ke-icon-pagebreak {
+    background-position: 0 -966px; }
+  .ke-container-primary .ke-toolbar .ke-icon-insertfile {
+    background-position: 0 -882px; }
+  .ke-container-primary .ke-toolbar .ke-icon-quickformat {
+    background-position: 0 -504px; }
+  .ke-container-primary .ke-toolbar .ke-icon-anchor {
+    background-position: 0 -987px; }
+  .ke-container-primary .ke-toolbar .ke-icon-search {
+    background-position: 0px -1184px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-new {
+    background-position: 0px -1200px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-specialchar {
+    background-position: 0px -1216px;
+    width: 16px;
+    height: 16px; }
+  .ke-container-primary .ke-toolbar .ke-icon-multiimage {
+    background-position: 0 -798px; }
+  .ke-container-primary .ke-toolbar .ke-icon-graft {
+    background-position: 0 -819px; }
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-primary .ke-menu-item .ke-menu-item-left {
+  width: 27px;
+  text-align: center;
+  overflow: hidden; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-toolbar-icon {
+    font-size: 0;
+    line-height: 0;
+    overflow: hidden;
+    display: block;
+    width: 16px;
+    height: 16px;
+    margin: 0px 2px;
+    *background-image: url(images/nkeditor.png);
+    background: url(images/nkeditor.svg) no-repeat; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert {
+    background-position: 0 -903px;
+    width: 18px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete {
+    background-position: 0 -1428px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft {
+    background-position: 0 -1176px;
+    width: 18px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright {
+    background-position: 0 -1323px;
+    width: 18px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove {
+    background-position: 0 -1302px;
+    width: 22px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow {
+    background-position: 0 -1155px;
+    width: 22px !important; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete {
+    background-position: 0 -1239px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete {
+    background-position: 0 -1260px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop {
+    background-position: 0 -1218px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tableprop {
+    background-position: 0 -1134px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit {
+    background-position: 0px -1088px;
+    width: 16px;
+    height: 16px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge {
+    background-position: -1px -1197px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge {
+    background-position: -4px -1365px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit {
+    background-position: 0 -1344px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-image {
+    background-position: 0 -777px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-flash {
+    background-position: 0 -840px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-media {
+    background-position: 0 -861px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-link {
+    background-position: 0 -1008px; }
+  .ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-checked {
+    background-position: 0 -1407px; }
+
+/*# sourceMappingURL=editor.css.map */
diff --git a/public/assets/addons/nkeditor/themes/primary/editor.css.map b/public/assets/addons/nkeditor/themes/primary/editor.css.map
new file mode 100644
index 0000000..268b7c7
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/primary/editor.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../common/common.scss","editor.scss"],
+"names": [],
+"file": "editor.css"
+}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/primary/editor.min.css b/public/assets/addons/nkeditor/themes/primary/editor.min.css
new file mode 100644
index 0000000..62d5203
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/primary/editor.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";.ke-clearfix{zoom:1;clear:both}.ke-clearfix:after{content:".";display:block;clear:both;font-size:0;height:0;line-height:0;visibility:hidden}.ke-animated{animation:zoomIn;animation-duration:.3s;animation-fill-mode:both}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.ke-dialog-mask{background-color:#fff;opacity:.5}.ke-dialog-lock{background-color:#fff;opacity:.5;z-index:811213;left:0;top:0;position:absolute}.ke-container{display:block;background-color:#fff;overflow:hidden;margin:0;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16)}.ke-container .ke-shadow{box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;background-color:#f0f0ee}.ke-container .ke-dialog a,.ke-container .ke-dialog a:hover,.ke-container .ke-menu a,.ke-container .ke-menu a:hover{color:#337fe5;text-decoration:none}.ke-container .ke-toolbar{text-align:left;overflow:hidden;zoom:1;padding:0 5px}.ke-container .ke-toolbar .ke-outline{padding:10px 5px;font-size:0;line-height:0;cursor:pointer;display:block;float:left}.ke-container .ke-toolbar .ke-outline .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px}.ke-container .ke-toolbar .ke-on{background:#ebebeb}.ke-container .ke-toolbar .ke-selected{background-color:#ebebeb}.ke-container .ke-toolbar .ke-disabled{cursor:default}.ke-container .ke-toolbar .ke-separator{height:16px;margin:2px 3px;border-left:1px solid #a0a0a0;border-right:1px solid #fff;border-top:0;border-bottom:0;width:0;font-size:0;line-height:0;overflow:hidden;display:block;float:left}.ke-container .ke-toolbar .ke-hr{clear:both;height:1px;width:calc(100% - (2 * 2px));background:#ebebeb}.ke-container .ke-edit{padding:0}.ke-container .ke-edit .ke-edit-iframe,.ke-container .ke-edit .ke-edit-textarea{border:0;margin:0;padding:0;overflow:auto}.ke-container .ke-edit .ke-edit-textarea{font:12px/1.5 Consolas,Monaco,"Bitstream Vera Sans Mono","Courier New",Courier,monospace;color:#000;overflow:auto;resize:none}.ke-container .ke-edit .ke-edit-textarea:focus{outline:0}.ke-container .ke-statusbar{position:relative;background-color:#f5f5f5;border-top:1px solid #e1e1e1;font-size:0;line-height:0;overflow:hidden;text-align:center;cursor:s-resize;display:none}.ke-container .ke-statusbar .ke-statusbar-center-icon{background-position:0 -754px;width:15px;height:11px}.ke-container .ke-statusbar .ke-statusbar-right-icon{position:absolute;right:0;bottom:0;cursor:se-resize;width:11px;height:11px}.ke-menu{border:1px solid #ccc;background-color:#f5f5f5;color:#222;padding:2px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item{border:1px solid #f1f1f1;background-color:#f1f1f1;color:#222;height:24px;overflow:hidden;cursor:pointer}.ke-menu .ke-menu-item .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-inline-block .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-menu .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-item-center{width:0;height:24px;border-left:1px solid #e3e3e3;border-right:1px solid #fff;border-top:0;border-bottom:0}.ke-menu .ke-menu-item .ke-menu-item-center-on{border-left:1px solid #e9eff6;border-right:1px solid #e9eff6}.ke-menu .ke-menu-item .ke-menu-item-right{border:0;padding:0 0 0 5px;line-height:24px;text-align:left;overflow:hidden}.ke-menu .ke-menu-item .ke-menu-separator{margin:2px 0;height:0;overflow:hidden;border-top:1px solid #e1e1e1;border-bottom:1px solid #fff;border-left:0;border-right:0}.ke-menu .ke-menu-item-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons{position:relative}.ke-menu .ke-plugin-emoticons .ke-preview{position:absolute;text-align:center;margin:2px;padding:10px;top:0;border:1px solid #a0a0a0;background-color:#fff;display:none}.ke-menu .ke-plugin-emoticons .ke-preview .ke-preview-img{border:0;margin:0;padding:0}.ke-menu .ke-plugin-emoticons .ke-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell{margin:0;padding:1px;border:1px solid #f5f5f5;cursor:pointer}.ke-menu .ke-plugin-emoticons .ke-table .ke-cell .ke-img{display:block;background-repeat:no-repeat;overflow:hidden;margin:2px;width:24px;height:24px;margin:0;padding:0;border:0}.ke-menu .ke-plugin-emoticons .ke-table .ke-on{border:1px solid #5690d2;background-color:#e9eff6}.ke-menu .ke-plugin-emoticons .ke-page{text-align:right;margin:5px;padding:0;border:0;font:12px/1 "sans serif",tahoma,verdana,helvetica;color:#333;text-decoration:none}.ke-colorpicker{border:1px solid #a0a0a0;background-color:#f1f1f1;color:#222;padding:2px}.ke-colorpicker .ke-colorpicker-table{border:0;margin:0;padding:0;border-collapse:separate}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell{font-size:0;line-height:0;border:1px solid #f0f0ee;cursor:pointer;margin:3px;padding:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell .ke-colorpicker-cell-color{width:14px;height:14px;margin:3px;padding:0;border:0}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-top{font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;line-height:24px;border:1px solid #f1f1f1;cursor:pointer;margin:0;padding:0;text-align:center}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-on{border:1px solid #5690d2}.ke-colorpicker .ke-colorpicker-table .ke-colorpicker-cell-selected{border:1px solid #2446ab}.ke-dialog{margin:0;padding:0;border:1px solid #ccc;zoom:1;box-shadow:1px 1px 3px #a0a0a0;-moz-box-shadow:1px 1px 3px #a0a0a0;-webkit-box-shadow:1px 1px 3px #a0a0a0;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;overflow:hidden}.ke-dialog .ke-dialog-header{border:0;margin:0;font-weight:700;font-size:14px;height:30px;line-height:30px;padding:0 10px;text-align:left;color:#222;cursor:move;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom:1px solid #c6c6c6;background:transparent url(../common/dialog-title-bg.png) repeat-x scroll 0 0;position:relative;cursor:move}.ke-dialog .ke-dialog-header .ke-dialog-icon-close{height:20px;width:20px;cursor:pointer;background:url(../common/icons-all.gif) 0 -59px;position:absolute;right:5px;top:4px}.ke-dialog .ke-dialog-header .ke-dialog-icon-close:hover{background-position:0 -89px}.ke-dialog .ke-dialog-content{background-color:#fff;width:100%;height:100%;color:#333;outline:0;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body{font:12px/1.5 "sans serif",tahoma,verdana,helvetica;text-align:left;overflow:hidden;width:100%}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea{display:block;width:408px;height:260px;font-family:"sans serif",tahoma,verdana,helvetica;font-size:12px;border:1px solid #ccc}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-textarea:focus{border-color:#66afe9;outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-select{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1;width:auto;border:1px solid #ccc;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-form{margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-number{width:50px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-checkbox{position:relative;top:6px}.ke-dialog .ke-dialog-content .ke-dialog-body textarea{display:block;overflow:auto;padding:0;resize:none}.ke-dialog .ke-dialog-content .ke-dialog-body textarea:focus{outline:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text{display:inline-block!important;max-width:400px;height:30px;line-height:30px;border:1px solid #ccc;font-size:14px;margin:0;outline:0;padding:0 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-text:focus{border-color:#66afe9}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-input-color{border:1px solid #e1e1e1;background-color:#fff;font-size:12px;width:60px;height:30px;line-height:30px;padding-left:5px;overflow:hidden;cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area{position:relative;overflow:hidden;margin:0;padding:0;top:-1px;position:relative}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-upload-file{position:absolute;font-size:60px;top:0;right:0;padding:0;margin:0;z-index:811212;border:0 none;opacity:0;cursor:pointer;width:62px;height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button-common{top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-upload-area .ke-button{padding:8px 15px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner{padding:10px 20px 0 20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row{border:1px solid #fff;margin-bottom:10px;overflow:hidden}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-left{float:left;height:30px;line-height:30px;width:60px;text-align:right}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right{float:left;text-align:left}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right .ke-inline-block .ke-upload-button{position:relative;top:-1px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label{cursor:pointer;display:-moz-inline-stack;display:inline-block;vertical-align:middle;text-align:right;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-dialog-row .row-right label img{display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header{height:30px;line-height:30px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-input-text{height:22px;line-height:22px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .ke-button{padding:3px 10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-header .checkbox{margin-left:10px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs{font:12px/1 "sans serif",tahoma,verdana,helvetica;border-bottom:1px solid #e1e1e1;margin-bottom:20px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul{list-style:none outside none;margin:0;padding:0}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li{position:relative;margin:0 2px -1px 0;padding:0 20px;float:left;line-height:25px;text-align:center;color:#337ab7;cursor:pointer}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-selected{background-color:#fff;border:1px solid #e1e1e1;border-bottom:1px solid #fff;color:#555;cursor:default;border-top-left-radius:3px;border-top-right-radius:3px}.ke-dialog .ke-dialog-content .ke-dialog-body .ke-dialog-content-inner .ke-tabs .ke-tabs-ul .ke-tabs-li-on{background-color:#fff;color:#000}.ke-dialog .ke-dialog-content .ke-dialog-loading{position:absolute;top:0;left:1px;z-index:1;text-align:center}.ke-dialog .ke-dialog-content .ke-dialog-loading .ke-dialog-loading-content{background:url(../common/loading.gif) no-repeat center;color:#666;font-size:14px;font-weight:700;height:31px;line-height:31px;padding-left:36px}.ke-dialog .ke-dialog-footer{font:12px/1 "sans serif",tahoma,verdana,helvetica;text-align:right;padding:0 15px 5px 0;background-color:#fff;height:40px}.ke-dialog .ke-dialog-footer .ke-dialog-yes{margin:5px}.ke-dialog .ke-dialog-footer .ke-dialog-no{margin:5px 10px 5px 5px}.ke-dialog .ke-button-common{display:inline-block;text-align:center;background:0 0;border:none;padding:0;cursor:pointer}.ke-dialog .ke-button-outer{background-position:0 -25px;padding:0;display:-moz-inline-stack;display:inline-block;vertical-align:middle;zoom:1}.ke-dialog .ke-button{color:#333;font-size:12px;border:1px solid #e6e6e6;background-color:#e6e6e6;padding:7px 10px;margin-top:-4px;color:#444;text-decoration:none;transition:background-color .3s ease-out,border-color .3s ease-out}.ke-dialog .ke-button:hover{border:1px solid #e1e1e1;background-color:#e1e1e1}.ke-dialog .ke-dialog-btn{font-size:12px;margin:5px;background:#2e8ded;color:#fff!important;padding:8px 12px;display:inline-block;border-radius:2px;cursor:pointer;text-decoration:none;transition:.3s ease-out}.ke-dialog .ke-dialog-btn:hover{box-shadow:none;box-shadow:none;opacity:.8}.ke-container-primary .ke-toolbar{border-top:5px solid #009688;box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 1px 1px rgba(0,0,0,.16);background-clip:padding-box;text-rendering:optimizelegibility}.ke-container-primary .ke-toolbar .ke-toolbar-icon{background:url(images/nkeditor.svg) no-repeat}.ke-container-primary .ke-toolbar .ke-icon-source{background-position:0 0}.ke-container-primary .ke-toolbar .ke-icon-preview{background-position:0 -63px}.ke-container-primary .ke-toolbar .ke-icon-print{background-position:0 -84px}.ke-container-primary .ke-toolbar .ke-icon-undo{background-position:0 -21px}.ke-container-primary .ke-toolbar .ke-icon-redo{background-position:0 -42px}.ke-container-primary .ke-toolbar .ke-icon-template{background-position:0 -105px}.ke-container-primary .ke-toolbar .ke-icon-cut{background-position:0 -147px}.ke-container-primary .ke-toolbar .ke-icon-copy{background-position:0 -168px}.ke-container-primary .ke-toolbar .ke-icon-paste{background-position:0 -189px}.ke-container-primary .ke-toolbar .ke-icon-selectall{background-position:0 -483px}.ke-container-primary .ke-toolbar .ke-icon-justifyleft{background-position:0 -252px}.ke-container-primary .ke-toolbar .ke-icon-justifycenter{background-position:0 -273px}.ke-container-primary .ke-toolbar .ke-icon-justifyright{background-position:0 -294px}.ke-container-primary .ke-toolbar .ke-icon-justifyfull{background-position:0 -315px}.ke-container-primary .ke-toolbar .ke-icon-insertorderedlist{background-position:0 -336px}.ke-container-primary .ke-toolbar .ke-icon-insertunorderedlist{background-position:0 -357px}.ke-container-primary .ke-toolbar .ke-icon-indent{background-position:0 -378px}.ke-container-primary .ke-toolbar .ke-icon-outdent{background-position:0 -399px}.ke-container-primary .ke-toolbar .ke-icon-subscript{background-position:0 -420px}.ke-container-primary .ke-toolbar .ke-icon-superscript{background-position:0 -441px}.ke-container-primary .ke-toolbar .ke-icon-date{background-position:0 -304px;width:25px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-time{background-position:0 -320px;width:25px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-formatblock{background-position:0 -546px}.ke-container-primary .ke-toolbar .ke-icon-fontname{background-position:0 -567px}.ke-container-primary .ke-toolbar .ke-icon-fontsize{background-position:0 -588px}.ke-container-primary .ke-toolbar .ke-icon-forecolor{background-position:0 -609px}.ke-container-primary .ke-toolbar .ke-icon-hilitecolor{background-position:0 -630px}.ke-container-primary .ke-toolbar .ke-icon-bold{background-position:0 -651px}.ke-container-primary .ke-toolbar .ke-icon-italic{background-position:0 -672px}.ke-container-primary .ke-toolbar .ke-icon-underline{background-position:0 -693px}.ke-container-primary .ke-toolbar .ke-icon-strikethrough{background-position:0 -714px}.ke-container-primary .ke-toolbar .ke-icon-removeformat{background-position:0 -756px}.ke-container-primary .ke-toolbar .ke-icon-image{background-position:0 -777px}.ke-container-primary .ke-toolbar .ke-icon-flash{background-position:0 -840px}.ke-container-primary .ke-toolbar .ke-icon-media{background-position:0 -861px}.ke-container-primary .ke-toolbar .ke-icon-div{background-position:0 -544px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-formula{background-position:0 -576px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-hr{background-position:0 -924px}.ke-container-primary .ke-toolbar .ke-icon-emoticons{background-position:0 -945px}.ke-container-primary .ke-toolbar .ke-icon-link{background-position:0 -1008px}.ke-container-primary .ke-toolbar .ke-icon-unlink{background-position:0 -1029px}.ke-container-primary .ke-toolbar .ke-icon-fullscreen{background-position:0 -525px}.ke-container-primary .ke-toolbar .ke-icon-about{background-position:0 -1092px}.ke-container-primary .ke-toolbar .ke-icon-quote{background-position:0 -1114px}.ke-container-primary .ke-toolbar .ke-icon-plainpaste{background-position:0 -210px}.ke-container-primary .ke-toolbar .ke-icon-wordpaste{background-position:0 -231px}.ke-container-primary .ke-toolbar .ke-icon-table{background-position:0 -903px;width:18px!important}.ke-container-primary .ke-toolbar .ke-icon-tablemenu{background-position:0 -768px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-code{background-position:0 -126px}.ke-container-primary .ke-toolbar .ke-icon-map{background-position:0 -976px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-baidumap{background-position:0 -1050px}.ke-container-primary .ke-toolbar .ke-icon-lineheight{background-position:0 -735px}.ke-container-primary .ke-toolbar .ke-icon-clearhtml{background-position:0 -462px}.ke-container-primary .ke-toolbar .ke-icon-pagebreak{background-position:0 -966px}.ke-container-primary .ke-toolbar .ke-icon-insertfile{background-position:0 -882px}.ke-container-primary .ke-toolbar .ke-icon-quickformat{background-position:0 -504px}.ke-container-primary .ke-toolbar .ke-icon-anchor{background-position:0 -987px}.ke-container-primary .ke-toolbar .ke-icon-search{background-position:0 -1184px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-new{background-position:0 -1200px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-specialchar{background-position:0 -1216px;width:16px;height:16px}.ke-container-primary .ke-toolbar .ke-icon-multiimage{background-position:0 -798px}.ke-container-primary .ke-toolbar .ke-icon-graft{background-position:0 -819px}.ke-menu-primary .ke-menu-item .ke-menu-item-left{width:27px;text-align:center;overflow:hidden}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-toolbar-icon{font-size:0;line-height:0;overflow:hidden;display:block;width:16px;height:16px;margin:0 2px;background:url(images/nkeditor.svg) no-repeat}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tableinsert{background-position:0 -903px;width:18px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tabledelete{background-position:0 -1428px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertleft{background-position:0 -1176px;width:18px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolinsertright{background-position:0 -1323px;width:18px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertabove{background-position:0 -1302px;width:22px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowinsertbelow{background-position:0 -1155px;width:22px!important}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecoldelete{background-position:0 -1239px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowdelete{background-position:0 -1260px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecellprop{background-position:0 -1218px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tableprop{background-position:0 -1134px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecellsplit{background-position:0 -1088px;width:16px;height:16px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowmerge{background-position:-1px -1197px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablerowsplit{background-position:0 -1344px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolmerge{background-position:-4px -1365px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-tablecolsplit{background-position:0 -1344px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-image{background-position:0 -777px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-flash{background-position:0 -840px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-media{background-position:0 -861px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-link{background-position:0 -1008px}.ke-menu-primary .ke-menu-item .ke-menu-item-left .ke-icon-checked{background-position:0 -1407px}
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/primary/editor.scss b/public/assets/addons/nkeditor/themes/primary/editor.scss
new file mode 100644
index 0000000..c20d945
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/primary/editor.scss
@@ -0,0 +1,387 @@
+@import "../common/common";
+
+.ke-container-primary {
+    .ke-toolbar {
+
+        border-top: 5px solid #009688;
+        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 1px 1px rgba(0, 0, 0, 0.16);
+        background-clip: padding-box;
+        text-rendering: optimizelegibility;
+
+        .ke-toolbar-icon {
+            *background-image: url(images/nkeditor.png);
+            background: url(images/nkeditor.svg) no-repeat;
+        }
+
+        .ke-icon-source {
+            background-position: 0 0px;
+        }
+        .ke-icon-preview {
+            background-position: 0 -63px;
+        }
+        .ke-icon-print {
+            background-position: 0 -84px;
+        }
+        .ke-icon-undo {
+            background-position: 0 -21px;
+        }
+
+        .ke-icon-redo {
+            background-position: 0 -42px;
+        }
+
+        .ke-icon-template {
+            background-position: 0 -105px;
+        }
+
+        .ke-icon-cut {
+            background-position: 0 -147px;
+        }
+
+        .ke-icon-copy {
+            background-position: 0 -168px;
+        }
+
+        .ke-icon-paste {
+            background-position: 0 -189px;
+        }
+
+        .ke-icon-selectall {
+            background-position: 0 -483px;
+        }
+
+        .ke-icon-justifyleft {
+            background-position: 0 -252px;
+        }
+
+        .ke-icon-justifycenter {
+            background-position: 0 -273px;
+        }
+
+        .ke-icon-justifyright {
+            background-position: 0 -294px;
+        }
+
+        .ke-icon-justifyfull {
+            background-position: 0 -315px;
+        }
+
+        .ke-icon-insertorderedlist {
+            background-position: 0 -336px;
+        }
+
+        .ke-icon-insertunorderedlist {
+            background-position: 0 -357px;
+        }
+
+        .ke-icon-indent {
+            background-position: 0 -378px;
+        }
+
+        .ke-icon-outdent {
+            background-position: 0 -399px;
+        }
+
+        .ke-icon-subscript {
+            background-position: 0 -420px;
+        }
+
+        .ke-icon-superscript {
+            background-position: 0 -441px;
+        }
+
+        .ke-icon-date {
+            background-position: 0px -304px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-time {
+            background-position: 0px -320px;
+            width: 25px;
+            height: 16px;
+        }
+
+        .ke-icon-formatblock {
+            background-position: 0 -546px;
+        }
+
+        .ke-icon-fontname {
+            background-position: 0 -567px;
+        }
+
+        .ke-icon-fontsize {
+            background-position: 0 -588px;
+        }
+
+        .ke-icon-forecolor {
+            background-position: 0 -609px;
+        }
+
+        .ke-icon-hilitecolor {
+            background-position: 0 -630px;
+        }
+
+        .ke-icon-bold {
+            background-position: 0 -651px;
+        }
+
+        .ke-icon-italic {
+            background-position: 0 -672px;
+        }
+
+        .ke-icon-underline {
+            background-position: 0 -693px;
+        }
+
+        .ke-icon-strikethrough {
+            background-position: 0 -714px;
+        }
+
+        .ke-icon-removeformat {
+            background-position: 0 -756px;
+        }
+
+        .ke-icon-image {
+            background-position: 0 -777px;
+        }
+
+        .ke-icon-flash {
+            background-position: 0 -840px;
+        }
+
+        .ke-icon-media {
+            background-position: 0 -861px;
+        }
+
+        .ke-icon-div {
+            background-position: 0px -544px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-formula {
+            background-position: 0px -576px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-hr {
+            background-position: 0 -924px;
+        }
+
+        .ke-icon-emoticons {
+            background-position: 0 -945px;
+        }
+
+        .ke-icon-link {
+            background-position: 0 -1008px;
+        }
+
+        .ke-icon-unlink {
+            background-position: 0 -1029px;
+        }
+
+        .ke-icon-fullscreen {
+            background-position: 0 -525px;
+        }
+
+        .ke-icon-about {
+            background-position: 0 -1092px;
+        }
+
+        .ke-icon-quote {
+            background-position: 0 -1114px;
+        }
+
+        .ke-icon-plainpaste {
+            background-position: 0 -210px;
+        }
+
+        .ke-icon-wordpaste {
+            background-position: 0 -231px;
+        }
+
+        .ke-icon-table {
+            background-position: 0px -903px;
+            width: 18px !important;
+        }
+
+        .ke-icon-tablemenu {
+            background-position: 0px -768px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-code {
+            background-position: 0 -126px;
+        }
+
+        .ke-icon-map {
+            background-position: 0px -976px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-baidumap {
+            background-position: 0 -1050px;
+        }
+
+        .ke-icon-lineheight {
+            background-position: 0 -735px;
+        }
+
+        .ke-icon-clearhtml {
+            background-position: 0 -462px;
+        }
+
+        .ke-icon-pagebreak {
+            background-position: 0 -966px;
+        }
+
+        .ke-icon-insertfile {
+            background-position: 0 -882px;
+        }
+
+        .ke-icon-quickformat {
+            background-position: 0 -504px;
+        }
+
+        .ke-icon-anchor {
+            background-position: 0 -987px;
+        }
+
+        .ke-icon-search {
+            background-position: 0px -1184px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-new {
+            background-position: 0px -1200px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-specialchar {
+            background-position: 0px -1216px;
+            width: 16px;
+            height: 16px;
+        }
+
+        .ke-icon-multiimage {
+            background-position: 0 -798px;
+        }
+
+        .ke-icon-graft {
+            background-position: 0 -819px;
+        }
+    }
+}
+
+/**
+ menu 右键菜单
+ */
+.ke-menu-primary {
+
+    .ke-menu-item {
+
+        .ke-menu-item-left {
+            width: 27px;
+            text-align: center;
+            overflow: hidden;
+
+            .ke-toolbar-icon {
+                @include ke-toolbar-icon;
+                *background-image: url(images/nkeditor.png);
+                background: url(images/nkeditor.svg) no-repeat;
+            }
+
+            .ke-icon-tableinsert {
+                background-position: 0 -903px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tabledelete {
+                background-position: 0 -1428px;
+            }
+
+            .ke-icon-tablecolinsertleft {
+                background-position: 0 -1176px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablecolinsertright {
+                background-position: 0 -1323px;
+                width: 18px !important;
+            }
+
+            .ke-icon-tablerowinsertabove {
+                background-position: 0 -1302px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablerowinsertbelow {
+                background-position: 0 -1155px;
+                width: 22px !important;
+            }
+
+            .ke-icon-tablecoldelete {
+                background-position: 0 -1239px;
+            }
+
+            .ke-icon-tablerowdelete {
+                background-position: 0 -1260px;
+            }
+
+            .ke-icon-tablecellprop {
+                background-position: 0 -1218px;
+            }
+
+            .ke-icon-tableprop {
+                background-position: 0 -1134px;
+            }
+            .ke-icon-tablecellsplit {
+                background-position: 0px -1088px;
+                width: 16px;
+                height: 16px;
+            }
+
+            .ke-icon-tablerowmerge {
+                background-position: -1px -1197px;
+            }
+
+            .ke-icon-tablerowsplit {
+                background-position: 0 -1344px;
+            }
+
+            .ke-icon-tablecolmerge {
+                background-position: -4px -1365px;
+            }
+
+            .ke-icon-tablecolsplit {
+                background-position: 0 -1344px;
+            }
+
+            //图片,视频右键菜单
+            .ke-icon-image {
+                background-position: 0 -777px;
+            }
+            .ke-icon-flash {
+                background-position: 0 -840px;
+            }
+            .ke-icon-media {
+                background-position: 0 -861px;
+            }
+            .ke-icon-link {
+                background-position: 0 -1008px;
+            }
+
+            .ke-icon-checked {
+                background-position: 0 -1407px;
+            }
+
+        }
+    }
+}
+//menu end
\ No newline at end of file
diff --git a/public/assets/addons/nkeditor/themes/primary/images/nkeditor.png b/public/assets/addons/nkeditor/themes/primary/images/nkeditor.png
new file mode 100644
index 0000000..2bd53f2
Binary files /dev/null and b/public/assets/addons/nkeditor/themes/primary/images/nkeditor.png differ
diff --git a/public/assets/addons/nkeditor/themes/primary/images/nkeditor.svg b/public/assets/addons/nkeditor/themes/primary/images/nkeditor.svg
new file mode 100644
index 0000000..3c83f02
--- /dev/null
+++ b/public/assets/addons/nkeditor/themes/primary/images/nkeditor.svg
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="1549" viewBox="0 0 21 1549">
+<svg id="icon-source-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="0">
+<path fill="#009688" d="M14.4 16h-12.8c-0.884 0-1.6-0.716-1.6-1.6v-12.8c0-0.884 0.716-1.6 1.6-1.6h12.8c0.884 0 1.6 0.716 1.6 1.6v12.8c0 0.884-0.716 1.6-1.6 1.6zM14.4 2.4h-12.8v12h12.8v-12zM6.4 5.6l-2.4 3.2 2.4 2.4-0.8 0.8-3.2-3.2 3.2-4 0.8 0.8zM9.6 4l-1.6 8.8h-1.6l1.6-8.8h1.6zM10.4 4.8l3.2 4-3.2 3.2-0.8-0.8 2.4-2.4-2.4-3.2 0.8-0.8z"></path>
+</svg>
+<svg id="icon-undo" width="16" height="16" viewBox="0 0 16 16" x="0" y="21">
+<path fill="#009688" d="M12.161 16c1.777-3.219 2.076-8.13-4.904-7.966v3.966l-6-6 6-6v3.881c8.359-0.218 9.29 7.378 4.904 12.119z"></path>
+</svg>
+<svg id="icon-redo" width="16" height="16" viewBox="0 0 16 16" x="0" y="42">
+<path fill="#009688" d="M9 3.881v-3.881l6 6-6 6v-3.966c-6.981-0.164-6.681 4.747-4.904 7.966-4.386-4.741-3.454-12.337 4.904-12.119z"></path>
+</svg>
+<svg id="icon-preview" width="16" height="16" viewBox="0 0 16 16" x="0" y="63">
+<path fill="#009688" d="M11.566 10.552c1.261-1.733 1.095-4.134-0.425-5.645-0.827-0.827-1.922-1.275-3.089-1.275-1.166 0-2.261 0.456-3.089 1.275-0.811 0.827-1.269 1.922-1.269 3.086s0.456 2.259 1.277 3.086c0.827 0.827 1.922 1.275 3.089 1.275 0.922 0 1.805-0.291 2.561-0.85l2.269 2.259c0.127 0.127 0.292 0.197 0.473 0.197s0.347-0.070 0.473-0.197c0.259-0.259 0.259-0.684 0-0.945l-2.27-2.266zM5.916 10.134c-1.181-1.181-1.181-3.094 0-4.275 0.575-0.575 1.331-0.881 2.142-0.881s1.567 0.316 2.142 0.881c1.181 1.181 1.181 3.094 0 4.275-1.141 1.133-3.142 1.133-4.284 0z"></path>
+<path fill="#009688" d="M11.431 1h-6.855c-1.969 0-3.577 1.598-3.577 3.575v6.85c0 1.969 1.6 3.575 3.577 3.575h3.719c0.37 0 0.67-0.298 0.67-0.669s-0.3-0.669-0.67-0.669h-3.719c-1.23 0-2.23-1-2.23-2.228v-6.852c0-1.228 1-2.228 2.23-2.228h6.855c1.23 0 2.23 1 2.23 2.228v3.645c0 0.37 0.3 0.669 0.67 0.669s0.67-0.298 0.67-0.669v-3.661c-0.002-1.969-1.602-3.567-3.57-3.567z"></path>
+</svg>
+<svg id="icon-print" width="16" height="16" viewBox="0 0 16 16" x="0" y="84">
+<path fill="#009688" d="M4.98 14.938h5.967c0.548 0 0.975-0.461 0.975-1.011v-2.973h-7.922v2.973c0 0.55 0.431 1.011 0.98 1.011zM10.947 1.016h-5.967c-0.548 0-0.98 0.428-0.98 0.978v2.959h7.922v-2.959c0-0.55-0.427-0.978-0.975-0.978z"></path>
+<path fill="#009688" d="M12.922 4.953v1.016h-9.922v-1.016h-1.003c-0.55 0-0.981 0.469-0.981 1.019v6.961c0 0.55 0.431 1.005 0.981 1.005h1.003v-3.984h9.922v3.984h1.008c0.548 0 1.008-0.455 1.008-1.005v-6.961c0-0.55-0.458-1.019-1.008-1.019h-1.008zM12.922 7.984h-2.969v-1.016h2.969v1.016z"></path>
+</svg>
+<svg id="icon-template" width="16" height="16" viewBox="0 0 16 16" x="0" y="105">
+<path fill="#009688" d="M8.824 4.504h-8.504v8.536h8.504v-8.536zM6.632 10.84h-0.68v-3.056l-1.056 3.056h-0.608l-1.048-3.104v3.104h-0.68v-4.28h0.952l0.992 2.976c0.048 0.144 0.088 0.264 0.12 0.376 0.040-0.12 0.088-0.264 0.144-0.424l1-2.92h0.872v4.272zM14.88 2.84l-2.024-2.032c-0.44-0.44-1.312-0.808-1.936-0.808h-6.8c-0.624 0-1.136 0.512-1.136 1.136v2.296h0.904v-2.296c0-0.12 0.104-0.224 0.224-0.224h6.8c0.064 0 0.144 0.008 0.224 0.024v3.616h3.6c0.016 0.080 0.024 0.528 0.024 0.6v9.712c0 0.12-0.104 0.224-0.224 0.224h-10.432c-0.12 0-0.224-0.104-0.224-0.224v-0.76h-0.904v0.76c0 0.624 0.512 1.136 1.136 1.136h10.432c0.624 0 1.136-0.512 1.136-1.136v-9.712c0-0.624-0.36-1.872-0.8-2.312zM12.056 3.64v-2.328c0.064 0.040 0.112 0.088 0.16 0.136l2.024 2.032c0.048 0.048 0.088 0.096 0.136 0.16h-2.32zM9.864 9.6h3.72v-1.064h-3.72v1.064zM9.864 11.736h3.72v-1.064h-3.72v1.064zM13.584 6.4h-3.72v1.064h3.72v-1.064z"></path>
+</svg>
+<svg id="icon-code" width="16" height="16" viewBox="0 0 16 16" x="0" y="126">
+<path fill="#009688" d="M5.015 3.754l-0.708-0.585c-0.215-0.154-0.462-0.123-0.646 0.062l-3.569 4.492c-0.123 0.154-0.123 0.4 0 0.585l3.6 4.462c0.154 0.185 0.431 0.246 0.646 0.062l0.708-0.585c0.215-0.154 0.246-0.462 0.062-0.646l-2.892-3.6 2.923-3.6c0.123-0.185 0.092-0.462-0.123-0.646zM15.908 7.723l-3.6-4.462c-0.154-0.185-0.431-0.246-0.646-0.062l-0.708 0.585c-0.215 0.154-0.246 0.462-0.062 0.646l2.923 3.6-2.923 3.6c-0.154 0.185-0.123 0.492 0.062 0.646l0.708 0.585c0.215 0.154 0.462 0.123 0.646-0.062l3.6-4.492c0.123-0.215 0.123-0.431 0-0.585zM9.723 3.323l-0.923-0.215c-0.246-0.062-0.523 0.092-0.585 0.338l-2.277 8.738c-0.062 0.246 0.092 0.492 0.338 0.554l0.923 0.215c0.246 0.062 0.523-0.092 0.585-0.338l2.277-8.738c0.062-0.277-0.092-0.492-0.338-0.554z"></path>
+</svg>
+<svg id="icon-crop" width="16" height="16" viewBox="0 0 16 16" x="0" y="147">
+<path fill="#009688" d="M13.585 0.288c1.548 1.972 0.581 3.752 0.581 3.752l-6.049 7.649s-4.161-4.761-5.855-7.12c-1.693-2.356 0.099-4.569 0.099-4.569l5.757 7.312 5.467-7.023zM8.074 10.223c0.469 0 0.846-0.378 0.846-0.842 0-0.224-0.090-0.439-0.249-0.597s-0.374-0.246-0.598-0.246c-0.467 0-0.848 0.377-0.848 0.842s0.381 0.842 0.848 0.842zM11.641 10.395c0.746-0.002 1.462 0.292 1.989 0.818s0.827 1.24 0.829 1.985c-0.002 0.746-0.3 1.459-0.829 1.985s-1.244 0.819-1.989 0.817c-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.3-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM11.641 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001zM4.575 10.395c0.746-0.002 1.461 0.292 1.989 0.818s0.826 1.24 0.829 1.985c-0.005 1.552-1.266 2.807-2.818 2.802-0.746 0.003-1.462-0.292-1.99-0.816s-0.827-1.24-0.829-1.986c0.002-0.746 0.299-1.46 0.829-1.986s1.244-0.819 1.99-0.817zM4.575 14.607c0.783 0 1.419-0.63 1.419-1.409s-0.637-1.411-1.419-1.411c-0.784 0-1.419 0.631-1.419 1.411s0.635 1.41 1.419 1.41v-0.001z"></path>
+</svg>
+<svg id="icon-copy" width="16" height="16" viewBox="0 0 16 16" x="0" y="168">
+<path fill="#009688" d="M3 10h7v1h-7v-1z"></path>
+<path fill="#009688" d="M3 8h7v1h-7v-1z"></path>
+<path fill="#009688" d="M3 12h4v1h-4v-1z"></path>
+<path fill="#009688" d="M14 0h-9c-1.1 0-2 0.9-2 2h1c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9c0 0.6-0.4 1-1 1v1c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2z"></path>
+<path fill="#009688" d="M3 6h7v1h-7v-1z"></path>
+<path fill="#009688" d="M11 3h-9c-1.1 0-2 0.9-2 2v9c0 1.1 0.9 2 2 2h9c1.1 0 2-0.9 2-2v-9c0-1.1-0.9-2-2-2zM12 14c0 0.6-0.4 1-1 1h-9c-0.6 0-1-0.4-1-1v-9c0-0.6 0.4-1 1-1h9c0.6 0 1 0.4 1 1v9z"></path>
+</svg>
+<svg id="icon-paste" width="16" height="16" viewBox="0 0 16 16" x="0" y="189">
+<path fill="#009688" d="M13.644 7h-5.288c-1.298 0-2.356 1.056-2.356 2.356v4.288c0 1.298 1.056 2.356 2.356 2.356h5.289c1.298 0 2.356-1.056 2.356-2.356v-4.289c-0.002-1.298-1.058-2.355-2.358-2.355zM15 13.644c0 0.747-0.608 1.356-1.356 1.356h-5.288c-0.747 0-1.356-0.608-1.356-1.356v-4.289c0-0.747 0.608-1.356 1.356-1.356h5.289c0.747 0 1.356 0.608 1.356 1.356v4.289h-0.002z"></path>
+<path fill="#009688" d="M4.453 13h-2.434c-0.561 0-1.019-0.456-1.019-1.019v-9.963c0-0.561 0.456-1.019 1.019-1.019h8.962c0.561 0 1.019 0.456 1.019 1.019v3.497c0 0.277 0.223 0.5 0.5 0.5s0.5-0.223 0.5-0.5v-3.497c0-1.112-0.906-2.019-2.019-2.019h-8.963c-1.112 0-2.019 0.905-2.019 2.019v9.962c0 1.113 0.906 2.019 2.019 2.019h2.434c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+<path fill="#009688" d="M10.5 3h-8c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h8c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM5.5 6h-3c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h3c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5zM4.5 9h-2c-0.277 0-0.5 0.223-0.5 0.5s0.223 0.5 0.5 0.5h2c0.277 0 0.5-0.223 0.5-0.5s-0.223-0.5-0.5-0.5z"></path>
+</svg>
+<svg id="icon-paste-text" width="16" height="16" viewBox="0 0 16 16" x="0" y="210">
+<path fill="#009688" d="M10.5 2h-2v-1c0-0.551-0.45-1-1-1h-2c-0.549 0-1 0.45-1 1v1h-2v2.278h7.999v-2.278zM7.5 2h-2v-0.998c0.001 0 0.001-0.001 0.002-0.001h1.996c0.001 0 0.001 0.001 0.002 0.001l-0.001 0.998zM8.17 9.529h1.972v3.834h1.005v-3.834h1.967v-1.005h-4.943z"></path>
+<path fill="#009688" d="M12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.816h-0.012v1.928h-8.992v-1.743h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.651c0 0.275 0.225 0.5 0.5 0.5h4.772v1.347l9.727 0.001v-10.118h-3zM6.773 14.999v-8.118h7.726l0.003 8.117-7.729 0.001z"></path>
+</svg>
+<svg id="icon-paste-word" width="16" height="16" viewBox="0 0 16 16" x="0" y="231">
+<path fill="#009688" d="M13.628 8.819v0.146c-0.195 0.017-0.34 0.154-0.437 0.413l-1.238 3.691h-0.17l-1.044-2.865h-0.024l-1.141 2.865h-0.17l-1.311-3.691c-0.081-0.259-0.227-0.396-0.437-0.413v-0.146h1.821v0.146c-0.275 0.017-0.405 0.105-0.389 0.267 0 0.081 0.016 0.154 0.049 0.219l0.59 1.788 0.718-1.799-0.046-0.257c-0.097-0.13-0.251-0.202-0.461-0.219v-0.146h1.942v0.146c-0.032 0.017-0.057 0.024-0.073 0.024-0.276 0-0.397 0.073-0.364 0.219 0 0.033 0.008 0.105 0.025 0.219 0.016 0.065 0.032 0.105 0.048 0.121l0.572 1.679 0.534-1.806c0.016-0.032 0.084-0.421-0.062-0.432-0.017-0.001-0.033-0.008-0.049-0.024v-0.146h1.117zM10.5 2h-2v-1c0-0.55-0.45-1-1-1h-2c-0.55 0-1 0.45-1 1v1h-2v2.278h8v-2.278zM7.5 2h-2v-0.998l0.002-0.002h1.997c0 0.001 0.002 0.001 0.002 0.002l-0 0.998zM12.499 5.882v-3.382c0-0.275-0.225-0.5-0.499-0.5h-1v0.815h-0.011v1.928h-8.992v-1.744h0.004v-1h-1c-0.275 0-0.5 0.225-0.5 0.5v11.652c0 0.275 0.225 0.5 0.5 0.5h4.773v1.348l9.727 0.001v-10.118h-3zM6.773 14.999v-8.117h7.727l0.003 8.117h-7.729z"></path>
+</svg>
+<svg id="icon-left-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="252">
+<path fill="#009688" d="M1.148 0h13.704c0.624 0 1.123 0.499 1.123 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.679c-0.649-0.025-1.148-0.524-1.148-1.148 0-0.649 0.499-1.148 1.148-1.148zM1.148 4.568h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 9.136h13.704c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-13.704c-0.624 0-1.148-0.499-1.148-1.148s0.499-1.148 1.148-1.148zM1.148 13.704h9.136c0.624 0 1.148 0.499 1.148 1.148 0 0.624-0.499 1.148-1.148 1.148h-9.136c-0.649-0.025-1.148-0.524-1.148-1.173 0-0.624 0.499-1.123 1.148-1.123z"></path>
+</svg>
+<svg id="icon-center-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="273">
+<path fill="#009688" d="M1.953 3.11q-0.407 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.281h11.719q0.406 0 0.688 0.281t0.281 0.688-0.281 0.696-0.688 0.289h-11.719zM11.719 5.063q0.406 0 0.688 0.282t0.281 0.688-0.281 0.696-0.688 0.289h-7.813q-0.406 0-0.688-0.289t-0.281-0.696 0.281-0.688 0.688-0.282h7.813zM13.672 8.953q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-11.719q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h11.719zM11.719 12.86q0.406 0 0.688 0.289t0.281 0.696-0.281 0.688-0.688 0.281h-7.813q-0.406 0-0.688-0.281t-0.281-0.688 0.281-0.695 0.688-0.289h7.813z"></path>
+</svg>
+<svg id="icon-right-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="294">
+<path fill="#009688" d="M3.497 10.966c-0.249-0.002-0.529-0.062-0.737-0.19-0.382-0.234-0.488-0.667-0.349-1.095 0.142-0.437 0.484-0.671 1.071-0.672 3.574-0.006 7.149-0.006 10.723 0.005 0.236 0.001 0.5 0.070 0.701 0.19 0.374 0.222 0.5 0.672 0.371 1.090-0.132 0.428-0.468 0.674-0.974 0.676-1.822 0.006-3.643 0.002-5.465 0.002-1.78 0-3.561 0.008-5.341-0.008zM14.228 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.795-0 3.589-0.002 5.383 0.001zM9.344 6.983c-1.63 0-3.26 0.004-4.89-0.002-0.662-0.002-1.097-0.402-1.095-0.98 0.001-0.58 0.436-0.993 1.093-0.994 3.26-0.006 6.52-0.008 9.78 0.007 0.245 0.001 0.521 0.098 0.727 0.235 0.35 0.232 0.448 0.677 0.309 1.074-0.144 0.412-0.47 0.654-0.951 0.656-1.658 0.007-3.315 0.003-4.973 0.003v0.002zM14.279 13.022c0.627 0.003 1.053 0.418 1.049 0.983-0.004 0.563-0.437 0.98-1.058 0.981-3.287 0.005-5.935 0.007-9.222-0.008-0.231-0.001-0.492-0.098-0.685-0.23-0.343-0.234-0.441-0.681-0.305-1.078 0.137-0.4 0.477-0.646 0.958-0.648 1.657-0.007 2.675-0.003 4.332-0.003 1.644-0 3.287-0.006 4.931 0.002z"></path>
+</svg>
+<svg id="icon-both-align" width="16" height="16" viewBox="0 0 16 16" x="0" y="315">
+<path fill="#009688" d="M14.148 1.013c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 13.040c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.336 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001zM14.148 8.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.002 7.105-0.002 1.794-0 3.589-0.002 5.383 0.001zM14.148 4.96c0.554 0.001 0.91 0.244 1.051 0.696 0.21 0.674-0.27 1.276-1.037 1.278-2.374 0.006-4.749 0.002-7.123 0.002-1.228 0-4.137 0.003-5.366-0.002-0.507-0.002-0.86-0.232-1.012-0.637-0.256-0.68 0.222-1.333 0.999-1.337 1.808-0.008 5.297-0.003 7.105-0.003 1.794-0 3.589-0.002 5.383 0.001z"></path>
+</svg>
+<svg id="icon-ol" width="16" height="16" viewBox="0 0 16 16" x="0" y="336">
+<path fill="#009688" d="M7.111 1.778h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889z"></path>
+<path fill="#009688" d="M15.111 4.711h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M15.111 9.511h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M15.111 14.222h-8c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M2.578 0.533h-0.8l-1.689 0.889 0.267 0.889 1.244-0.711v3.733h-1.333v0.889h3.556v-0.889h-1.244z"></path>
+<path fill="#009688" d="M2.222 13.956c0.178-0.178 0.444-0.444 0.622-0.622s0.356-0.356 0.444-0.533c0.089-0.178 0.178-0.356 0.267-0.533s0.089-0.356 0.089-0.622c0-0.267-0.089-0.622-0.178-0.8-0.089-0.267-0.267-0.356-0.356-0.533s-0.444-0.267-0.622-0.356c-0.178-0.089-0.444-0.089-0.711-0.089-0.356 0-0.711 0.089-0.978 0.178-0.267 0.178-0.622 0.356-0.8 0.622l0.444 0.622c0.178-0.178 0.356-0.267 0.533-0.444s0.444-0.178 0.622-0.178c0.178 0 0.356 0 0.444 0s0.267 0.089 0.267 0.267 0.178 0.178 0.178 0.356 0.089 0.267 0.089 0.356c0 0.178 0 0.267 0 0.444s-0.089 0.267-0.178 0.356-0.178 0.267-0.356 0.444-0.356 0.444-0.533 0.711l-1.511 1.244v0.889h3.733v-0.889h-2.4l0.889-0.889z"></path>
+</svg>
+<svg id="icon-ul" width="16" height="16" viewBox="0 0 16 16" x="0" y="357">
+<path fill="#009688" d="M15.111 13.333h-8.889c-0.533 0-0.889 0.356-0.889 0.889s0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M6.222 2.667h8.889c0.533 0 0.889-0.356 0.889-0.889s-0.356-0.889-0.889-0.889h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889z"></path>
+<path fill="#009688" d="M15.111 7.111h-8.889c-0.533 0-0.889 0.444-0.889 0.889 0 0.533 0.356 0.889 0.889 0.889h8.889c0.533 0 0.889-0.356 0.889-0.889 0-0.444-0.444-0.889-0.889-0.889z"></path>
+<path fill="#009688" d="M0 1.778c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#009688" d="M0 8c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+<path fill="#009688" d="M0 14.222c0 0.982 0.796 1.778 1.778 1.778s1.778-0.796 1.778-1.778v0c0-0.982-0.796-1.778-1.778-1.778s-1.778 0.796-1.778 1.778v0z"></path>
+</svg>
+<svg id="icon-right-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="378">
+<path fill="#009688" d="M0 1.882h17.488v-1.882h-17.488zM7.511 5.412h9.977v-1.883h-9.977zM7.511 8.941h9.977v-1.883h-9.977zM7.511 12.471h9.977v-1.883h-9.977zM0 16h17.488v-1.882h-17.488zM0 11.572v-6.627l4.418 3.314z"></path>
+</svg>
+<svg id="icon-left-indent" width="17" height="16" viewBox="0 0 17 16" x="0" y="399">
+<path fill="#009688" d="M0 1.883h17.488v-1.883h-17.488v1.883zM7.511 5.412h9.977v-1.883h-9.977v1.883zM7.511 8.941h9.977v-1.883h-9.977v1.883zM7.511 12.471h9.977v-1.883h-9.977v1.883zM0 16h17.488v-1.883h-17.488v1.883zM4.418 11.572v-6.627l-4.418 3.314 4.418 3.313z"></path>
+</svg>
+<svg id="icon-down-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="420">
+<path fill="#009688" d="M13.331 13.511v1.089h2.669v1.4h-4.001v-3.189l2.664-1.309v-1.089h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-up-tag" width="16" height="16" viewBox="0 0 16 16" x="0" y="441">
+<path fill="#009688" d="M13.331 4.492v1.095h2.669v1.394h-4.001v-3.183l2.664-1.309v-1.095h-2.664v-1.394h4.001v3.183l-2.669 1.309zM9.397 0.762l-3.448 5.204-3.454-5.204h-2.495l4.696 7.083-4.696 7.083h2.495l3.454-5.204 3.448 5.204h2.495l-4.696-7.083 4.696-7.083z"></path>
+</svg>
+<svg id="icon-clear-format" width="16" height="16" viewBox="0 0 16 16" x="0" y="462">
+<path fill="#009688" d="M11.163 3.197l3.005-1.734 1.43 1.763-2.248 2.491zM8.877 2.251c0.879 0.108 5.156 5.318 5.046 5.904s-2.497 2.206-2.497 2.206l-5.417-6.229c-0 0 1.989-1.988 2.868-1.88zM5.491 4.897l5.23 6.088-3.209 4.173-7.247-9.178s1.436-0.060 2.633-0.374c0.783-0.206 2.593-0.709 2.593-0.709z"></path>
+</svg>
+<svg id="icon-selectall" width="16" height="16" viewBox="0 0 16 16" x="0" y="483">
+<path fill="#009688" d="M7.272 8.96c-0.216 0-0.416-0.080-0.568-0.232l-3.136-3.144c-0.112-0.112-0.176-0.264-0.176-0.416 0-0.16 0.064-0.304 0.176-0.416s0.264-0.176 0.416-0.176c0.16 0 0.304 0.064 0.416 0.176l2.872 2.872 6.104-6.104c0.112-0.112 0.264-0.176 0.416-0.176 0.16 0 0.304 0.064 0.416 0.176 0.232 0.232 0.232 0.608 0 0.84l-6.368 6.368c-0.152 0.152-0.352 0.232-0.568 0.232z"></path>
+<path fill="#009688" d="M2 12.76c-0.256 0-0.496-0.104-0.68-0.28-0.184-0.184-0.28-0.424-0.28-0.68v-9.776c0-0.256 0.104-0.496 0.28-0.68 0.184-0.184 0.424-0.28 0.68-0.28h6.776c0.328 0 0.592 0.264 0.592 0.592s-0.264 0.592-0.592 0.592h-6.552v9.328h8.92v-4.304c0-0.328 0.272-0.6 0.6-0.6s0.6 0.272 0.6 0.6v4.528c0 0.256-0.104 0.496-0.28 0.68-0.184 0.184-0.424 0.28-0.68 0.28h-9.384z"></path>
+<path fill="#009688" d="M5 15.016c-0.328 0-0.592-0.264-0.592-0.592s0.264-0.592 0.592-0.592l8.808-0.008v-7.68c0-0.328 0.264-0.592 0.592-0.592 0.16 0 0.312 0.064 0.424 0.176s0.176 0.264 0.176 0.424l-0.008 8.008c0 0.472-0.384 0.848-0.856 0.848l-9.136 0.008z"></path>
+</svg>
+<svg id="icon-paiban" width="16" height="16" viewBox="0 0 16 16" x="0" y="504">
+<path fill="#009688" d="M15.176 12.792l-5.48-4.8c-0.304-0.264-0.76-0.232-1.024 0.072l-1.552 1.776c-0.264 0.304-0.232 0.76 0.064 1.024l2.16 1.888 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.776 0.68 0.36-0.416 0.424-0.48c0.088-0.104 0.24-0.112 0.344-0.024l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.424 0.48-0.36 0.416 0.776 0.68 0.456-0.52 0.64-0.736c0.088-0.096 0.24-0.104 0.344-0.016l0.016 0.016c0.104 0.088 0.112 0.24 0.024 0.344l-0.64 0.736-0.456 0.52 0.616 0.544c0.304 0.264 0.76 0.232 1.024-0.072l1.56-1.776c0.264-0.32 0.232-0.776-0.072-1.040zM9.76 9.944c-0.176 0.2-0.488 0.208-0.704 0.024s-0.248-0.496-0.072-0.696c0.176-0.2 0.488-0.208 0.704-0.024s0.248 0.496 0.072 0.696z"></path>
+<path fill="#009688" d="M5.784 10.824h-2.928c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.552 0.552-0.552h3.096l0.944-1.112h-4.040c-0.304 0-0.552-0.248-0.552-0.552s0.248-0.56 0.552-0.56h4.984l0.472-0.56c0.344-0.4 0.952-0.456 1.352-0.112l2.632 2.232v-6.016l-0.072-0.072v-0.008l-2.88-2.88h-7.784c-0.816 0-1.48 0.664-1.48 1.48v10.744c0 0.816 0.664 1.48 1.48 1.48h7.6l-3.144-2.664c-0.096-0.080-0.176-0.184-0.232-0.296zM2.856 3.040h3.704c0.304 0 0.552 0.248 0.552 0.552s-0.248 0.552-0.552 0.552h-3.704c-0.304 0-0.552-0.248-0.552-0.552 0-0.296 0.248-0.552 0.552-0.552zM2.856 5.264h6.664c0.304 0 0.552 0.248 0.552 0.56 0 0.304-0.248 0.552-0.552 0.552h-6.664c-0.304 0-0.552-0.248-0.552-0.552 0-0.312 0.248-0.56 0.552-0.56z"></path>
+</svg>
+<svg id="icon-full-screen" width="16" height="16" viewBox="0 0 16 16" x="0" y="525">
+<path fill="#009688" d="M14.872 1.258c-0.094-0.094-0.219-0.145-0.352-0.145h-0.002l-4.502 0.017c-0.275 0.002-0.497 0.223-0.497 0.5 0.002 0.273 0.223 0.497 0.498 0.497h0.002l3.175-0.013-3.423 3.45c-0.194 0.194-0.192 0.511 0.003 0.705 0.097 0.097 0.223 0.145 0.35 0.145 0.128 0 0.256-0.050 0.353-0.148l3.545-3.572v3.22c0 0.275 0.222 0.498 0.498 0.498 0.275 0 0.498-0.222 0.498-0.498v-4.303c-0.002-0.133-0.055-0.259-0.148-0.353zM1.239 1.238c0.094-0.094 0.219-0.145 0.352-0.145h0.002l4.502 0.019c0.275 0.002 0.497 0.225 0.497 0.5-0.002 0.273-0.223 0.497-0.498 0.497h-0.002l-3.177-0.014 3.425 3.45c0.194 0.194 0.192 0.511-0.003 0.705-0.097 0.097-0.223 0.145-0.35 0.145-0.128 0-0.256-0.050-0.353-0.148l-3.545-3.572v3.22c0 0.275-0.222 0.498-0.498 0.498s-0.498-0.222-0.498-0.498v-4.303c0.002-0.131 0.055-0.259 0.148-0.353zM14.872 14.881c-0.094 0.094-0.219 0.145-0.352 0.145h-0.002l-4.502-0.017c-0.275-0.002-0.497-0.225-0.497-0.5 0.002-0.273 0.223-0.497 0.498-0.497h0.002l3.175 0.012-3.423-3.448c-0.194-0.194-0.192-0.511 0.003-0.705 0.097-0.097 0.223-0.145 0.35-0.145 0.128 0 0.256 0.050 0.353 0.148l3.545 3.57v-3.22c0-0.275 0.222-0.498 0.498-0.498 0.275 0 0.498 0.222 0.498 0.498v4.303c-0.002 0.133-0.055 0.259-0.148 0.353zM1.223 14.886c0.094 0.094 0.219 0.145 0.352 0.145h0.002l4.502-0.017c0.275-0.002 0.497-0.225 0.497-0.5-0.002-0.273-0.223-0.497-0.498-0.497h-0.002l-3.175 0.012 3.425-3.45c0.194-0.194 0.192-0.511-0.003-0.705-0.097-0.097-0.223-0.145-0.35-0.145-0.128 0-0.256 0.050-0.353 0.148l-3.547 3.572v-3.22c0-0.275-0.222-0.498-0.498-0.498s-0.498 0.222-0.498 0.498v4.303c0.002 0.133 0.055 0.259 0.148 0.353z"></path>
+</svg>
+<svg id="icon-title" width="16" height="16" viewBox="0 0 16 16" x="0" y="546">
+<path fill="#009688" d="M1.815 2.089v4.803h1.332v-4.803h1.815v-1.089h-4.962v1.089h1.815zM6.443 1.966v-0.966h-1.205v0.966h1.205zM5.239 2.626v4.267h1.205v-4.267h-1.205zM8.594 2.626v-1.279h-1.205v1.279h-0.73v0.784h0.73v2.517c0 0.215 0.037 0.388 0.11 0.52s0.174 0.234 0.301 0.305c0.127 0.072 0.274 0.12 0.441 0.144s0.344 0.037 0.53 0.037c0.119 0 0.24-0.003 0.365-0.008s0.238-0.016 0.339-0.033v-0.908c-0.057 0.011-0.116 0.019-0.178 0.025s-0.127 0.008-0.195 0.008c-0.204 0-0.339-0.033-0.407-0.099s-0.102-0.198-0.102-0.396v-2.113h0.882v-0.784h-0.882zM9.761 1v5.893h1.205v-5.893h-1.205zM14.541 4.301h-1.96c0.006-0.083 0.024-0.176 0.055-0.281s0.085-0.204 0.161-0.297c0.076-0.094 0.178-0.172 0.305-0.235s0.287-0.095 0.479-0.095c0.294 0 0.513 0.077 0.657 0.231s0.245 0.38 0.301 0.677v0zM12.581 5.044h3.164c0.023-0.33-0.006-0.646-0.085-0.949s-0.208-0.572-0.386-0.809c-0.178-0.237-0.406-0.425-0.683-0.565s-0.602-0.21-0.976-0.21c-0.334 0-0.638 0.058-0.912 0.173s-0.51 0.274-0.708 0.475c-0.198 0.201-0.351 0.439-0.458 0.714s-0.161 0.572-0.161 0.891c0 0.33 0.052 0.633 0.157 0.908s0.253 0.512 0.445 0.71c0.192 0.198 0.427 0.351 0.704 0.458s0.588 0.161 0.933 0.161c0.498 0 0.922-0.11 1.272-0.33s0.611-0.586 0.78-1.098h-1.060c-0.040 0.132-0.147 0.257-0.322 0.376s-0.385 0.177-0.628 0.177c-0.339 0-0.599-0.085-0.78-0.256s-0.28-0.446-0.297-0.825zM0 9h16v1h-16v-1zM0 12h16v1h-16v-1zM0 15h12v1h-12v-1z"></path>
+</svg>
+<svg id="icon-font" width="16" height="16" viewBox="0 0 16 16" x="0" y="567">
+<path fill="#009688" d="M0.32 1.436v3.661h0.448c0.149-0.971 0.523-1.793 1.195-2.316 0.374-0.374 1.046-0.598 2.017-0.598h1.046v10.386c0 0.672-0.075 1.121-0.149 1.27-0.075 0.224-0.224 0.374-0.448 0.448-0.224 0.149-0.598 0.224-0.971 0.224h-0.448v0.374h7.472v-0.374h-0.448c-0.448 0-0.747-0.075-0.971-0.224s-0.374-0.299-0.448-0.448-0.149-0.598-0.149-1.27v-10.386h1.046c0.672 0 1.121 0.075 1.42 0.149 0.448 0.224 0.822 0.523 1.121 0.897s0.523 0.971 0.747 1.793h0.374v-3.586h-12.851z"></path>
+<path fill="#009688" d="M8.533 6.286v2.341h0.254c0.085-0.621 0.296-1.146 0.676-1.481 0.211-0.239 0.592-0.382 1.141-0.382h0.592v6.64c0 0.43-0.042 0.716-0.085 0.812-0.042 0.143-0.127 0.239-0.254 0.287-0.127 0.095-0.338 0.143-0.549 0.143h-0.254v0.239h4.225v-0.239h-0.253c-0.254 0-0.423-0.048-0.549-0.143s-0.211-0.191-0.254-0.287c-0.042-0.095-0.084-0.382-0.084-0.812v-6.64h0.592c0.38 0 0.634 0.048 0.803 0.096 0.255 0.145 0.467 0.338 0.63 0.567l0.004 0.006c0.169 0.239 0.296 0.621 0.423 1.146h0.211v-2.293h-7.268z"></path>
+</svg>
+<svg id="icon-fontsize" width="16" height="16" viewBox="0 0 16 16" x="0" y="588">
+<path fill="#009688" d="M10.75 12.432l2.663 3.141 2.674-3.141z"></path>
+<path fill="#009688" d="M2.979 7.234l1.53-4.933 1.534 4.933h-3.064zM5.888 0.408h-2.332l-3.489 11.051h1.617l0.825-2.63h4.042l0.839 2.63h2.025l-3.527-11.051z"></path>
+<path fill="#009688" d="M9.553 8.899l0.888-2.357 0.888 2.357h-1.776zM11.238 5.444h-1.351l-1.085 2.927 0.47 1.475 0.007-0.021h2.342l0.487 1.522h1.171l-2.041-5.903z"></path>
+</svg>
+<svg id="icon-fontcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="609">
+<path fill="#009688" d="M1.051 12.486v2.105h9.121l2.105-2.105h-11.226zM11.575 14.591h3.508v-3.508l-3.508 3.508z"></path>
+<path fill="#009688" d="M12.338 12.135h-1.766l-1.437-3.369h-4.42l-1.423 3.369h-1.802l4.631-10.705h1.66l4.558 10.705zM8.565 7.275l-1.625-3.615-1.639 3.615h3.264z"></path>
+</svg>
+<svg id="icon-font-bgcolor" width="16" height="16" viewBox="0 0 16 16" x="0" y="630">
+<path fill="#009688" d="M4.068 9.652c-0.151 0.146-0.226 0.351-0.226 0.614 0 0.231 0.082 0.42 0.246 0.566s0.38 0.219 0.649 0.219c0.374 0 0.683-0.132 0.926-0.395s0.364-0.594 0.364-0.991v-0.465l-1.136 0.154c-0.398 0.053-0.672 0.152-0.823 0.298zM12.953 1.452h-9.984c-1.103 0-1.997 0.894-1.997 1.997v8.985c0 1.103 0.894 1.997 1.997 1.997h9.984c1.103 0 1.997-0.894 1.997-1.997v-8.985c0-1.103-0.894-1.997-1.997-1.997zM6.879 11.635h-0.851v-0.75h-0.022c-0.336 0.576-0.832 0.864-1.487 0.864-0.471 0-0.845-0.127-1.123-0.382s-0.417-0.598-0.417-1.031c0-0.907 0.537-1.435 1.61-1.584l1.439-0.202c0-0.793-0.328-1.189-0.983-1.189-0.582 0-1.113 0.196-1.593 0.588v-0.829c0.483-0.301 1.040-0.452 1.672-0.452 1.17 0 1.755 0.614 1.755 1.843v3.124zM12.26 11.023c-0.402 0.484-0.938 0.726-1.608 0.726-0.632 0-1.113-0.266-1.443-0.799h-0.018v0.684h-0.86v-7.182h0.86v3.168h0.018c0.38-0.635 0.936-0.952 1.667-0.952 0.608 0 1.092 0.214 1.45 0.643s0.538 1.014 0.538 1.757c0 0.819-0.201 1.47-0.603 1.955zM10.638 7.38c-0.421 0-0.769 0.151-1.042 0.452s-0.41 0.684-0.41 1.15v0.658c0 0.392 0.127 0.723 0.382 0.994s0.573 0.406 0.956 0.406c0.456 0 0.813-0.175 1.071-0.526s0.386-0.836 0.386-1.457c0-0.512-0.12-0.919-0.36-1.222s-0.567-0.454-0.983-0.454z"></path>
+</svg>
+<svg id="icon-b" width="16" height="16" viewBox="0 0 16 16" x="0" y="651">
+<path fill="#009688" d="M12.615 5.846c0-1.846-1.477-3.385-3.231-3.385h-5.077c-0.338 0-0.615 0.277-0.615 0.615v10.154c0 0.338 0.277 0.615 0.615 0.615h5.077c1.754 0 3.231-1.538 3.231-3.385 0-0.892-0.338-1.692-0.892-2.308 0.554-0.615 0.892-1.415 0.892-2.308zM9.385 11.692h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231zM9.385 7.077h-3.538v-2.462h3.538c0.585 0 1.108 0.585 1.108 1.231s-0.523 1.231-1.108 1.231z"></path>
+</svg>
+<svg id="icon-italic" width="16" height="16" viewBox="0 0 16 16" x="0" y="672">
+<path fill="#009688" d="M11.692 3.785v-0.4c0-0.338-0.277-0.615-0.615-0.615h-4.308c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615 0.523 0 0.923 0.492 0.8 0.985l-1.108 5.415c-0.092 0.4-0.431 0.677-0.8 0.677h-0.738c-0.338 0-0.615 0.277-0.615 0.615v0.615c0 0.338 0.277 0.615 0.615 0.615h4.308c0.338 0 0.615-0.277 0.615-0.615v-0.615c0-0.338-0.277-0.615-0.615-0.615-0.523 0-0.923-0.492-0.8-0.985l1.108-5.415c0.092-0.4 0.431-0.677 0.8-0.677h0.523c0.462 0 0.831-0.369 0.831-0.831z"></path>
+</svg>
+<svg id="icon-underline" width="16" height="16" viewBox="0 0 16 16" x="0" y="693">
+<path fill="#009688" d="M13.692 12.923h-11.385c-0.246 0-0.462 0.215-0.462 0.462v0.923c0 0.246 0.215 0.462 0.462 0.462h11.385c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462zM7.785 11.692c-2.308-0.123-4.092-2.123-4.092-4.431v-4.185c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.215c0 1.323 0.985 2.462 2.308 2.554 1.446 0.092 2.615-1.046 2.615-2.462v-4.308c0-0.338 0.277-0.615 0.615-0.615h0.615c0.338 0 0.615 0.277 0.615 0.615v4.308c0 2.462-2.062 4.431-4.523 4.308z"></path>
+</svg>
+<svg id="icon-strickout" width="16" height="16" viewBox="0 0 16 16" x="0" y="714">
+<path fill="#009688" d="M3.723 5.569c-0.062-0.308-0.092-0.677-0.092-1.046 0-0.4 0.092-0.862 0.277-1.292 0.185-0.462 0.462-0.892 0.862-1.262 0.369-0.369 0.892-0.708 1.477-0.954 0.615-0.246 1.323-0.4 2.185-0.4 0.769 0 1.508 0.092 2.215 0.308 0.554 0.185 1.077 0.492 1.538 0.923 0.185 0.185 0.185 0.492-0.031 0.677l-0.831 0.769c-0.185 0.154-0.462 0.185-0.646 0-0.215-0.215-0.462-0.4-0.738-0.554-0.431-0.215-0.923-0.338-1.508-0.338-0.523 0-0.985 0.062-1.323 0.215s-0.646 0.308-0.862 0.554-0.369 0.462-0.462 0.708-0.123 0.492-0.123 0.677c0 0.338 0.062 0.615 0.154 0.862 0.092 0.215-0.062 0.431-0.277 0.431h-1.508c-0.154 0-0.277-0.154-0.308-0.277zM12.277 10.154h-1.538c-0.215 0-0.369 0.215-0.277 0.4s0.123 0.431 0.123 0.677c0 0.369-0.092 0.708-0.246 1.015-0.185 0.308-0.4 0.523-0.677 0.738-0.277 0.185-0.585 0.338-0.923 0.431s-0.646 0.154-0.985 0.154c-0.585 0-1.138-0.123-1.662-0.369-0.4-0.185-0.738-0.431-1.046-0.769-0.154-0.185-0.462-0.215-0.646-0.062l-0.862 0.738c-0.185 0.154-0.215 0.462-0.031 0.646 0.431 0.492 0.985 0.862 1.631 1.108 0.8 0.308 1.662 0.462 2.585 0.462 0.677 0 1.323-0.092 1.908-0.308 0.585-0.185 1.108-0.492 1.569-0.862 0.431-0.369 0.8-0.831 1.046-1.385s0.4-1.138 0.4-1.815c0-0.246 0-0.4-0.031-0.615-0.062-0.062-0.185-0.185-0.338-0.185zM15.354 7.354c-0.062-0.185-0.246-0.277-0.431-0.277h-13.846c-0.215 0-0.369 0.092-0.431 0.277-0.031 0.062-0.031 0.092-0.031 0.154v0.923c0 0.246 0.215 0.492 0.462 0.492h13.846c0.246 0 0.462-0.246 0.462-0.492v-0.923c0-0.062 0-0.092-0.031-0.154z"></path>
+</svg>
+<svg id="icon-line-height" width="16" height="16" viewBox="0 0 16 16" x="0" y="735">
+<path fill="#009688" d="M2.499 11.902v-7.682c-0.166 0-0.326 0.009-0.485-0.002-0.265-0.019-0.339-0.2-0.178-0.467 0.254-0.423 0.52-0.837 0.79-1.245 0.145-0.219 0.377-0.212 0.522 0.009 0.262 0.398 0.521 0.801 0.767 1.214 0.055 0.093 0.087 0.254 0.063 0.359-0.016 0.067-0.153 0.115-0.239 0.126-0.153 0.020-0.308 0.006-0.469 0.006v7.672c0.15 0 0.298-0.017 0.444 0.006 0.097 0.015 0.246 0.062 0.266 0.138 0.027 0.104-0.021 0.274-0.080 0.375-0.236 0.397-0.486 0.781-0.737 1.164-0.17 0.26-0.396 0.258-0.566-0.005-0.25-0.384-0.492-0.775-0.737-1.163-0.022-0.035-0.044-0.075-0.061-0.118l-0.002-0.005c-0.088-0.217-0.034-0.357 0.161-0.375 0.176-0.016 0.353-0.003 0.543-0.003z"></path>
+<path fill="#009688" d="M14.841 0v1.166h-13.69v-1.166zM14.849 14.834v1.166h-13.69v-1.166zM10.056 2.956l4.172 10.602h-1.321l-1.129-2.97h-4.871l-1.128 2.97h-1.307l4.173-10.602zM11.392 9.563l-2.004-5.3h-0.059l-2.034 5.3z"></path>
+</svg>
+<svg id="icon-clear-html" width="16" height="16" viewBox="0 0 16 16" x="0" y="756">
+<path fill="#009688" d="M10.175 3.11c-0.106-0.106-0.279-0.106-0.385 0l-8.625 8.625c-0.106 0.106-0.106 0.279 0 0.385l1.678 1.678c0.106 0.106 0.315 0.192 0.464 0.192h5.374c0.15 0 0.358-0.087 0.464-0.192l5.666-5.666c0.106-0.106 0.106-0.279 0-0.385l-4.636-4.636zM8.612 12.774c-0.106 0.106-0.315 0.192-0.464 0.192h-4.161c-0.15 0-0.358-0.087-0.464-0.192l-0.791-0.791c-0.106-0.106-0.106-0.279 0-0.385l3.162-3.162c0.106-0.106 0.279-0.106 0.385 0l3.143 3.143c0.106 0.106 0.106 0.279 0 0.385l-0.81 0.81z"></path>
+</svg>
+<svg id="icon-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="777">
+<path fill="#009688" d="M15.385 3.077c0-0.677-0.554-1.231-1.231-1.231h-12.308c-0.677 0-1.231 0.554-1.231 1.231v9.846c0 0.677 0.554 1.231 1.231 1.231h12.308c0.677 0 1.231-0.554 1.231-1.231v-9.846zM12.185 11.692h-8.923c-0.369 0-0.585-0.4-0.4-0.708l2.708-4.708c0.123-0.215 0.4-0.215 0.523 0l1.631 2.8c0.123 0.185 0.4 0.215 0.523 0.031l1.323-1.908c0.123-0.185 0.4-0.185 0.523 0l2.431 3.877c0.185 0.277 0 0.615-0.338 0.615zM11.385 6.154c-0.677 0-1.231-0.554-1.231-1.231s0.554-1.231 1.231-1.231 1.231 0.554 1.231 1.231-0.554 1.231-1.231 1.231z"></path>
+</svg>
+<svg id="icon-multiple-image" width="16" height="16" viewBox="0 0 16 16" x="0" y="798">
+<path fill="#009688" d="M13 1v12.033h-12v-12.033h12zM13 0h-12c-0.567 0-1 0.433-1 1v12.033c0 0.567 0.433 1 1 1h12.033c0.567 0 1-0.433 1-1v-12.033c-0.033-0.567-0.467-1-1.033-1z"></path>
+<path fill="#009688" d="M13 12.267c0.567-0.6 0.8-2.3 0.8-3.1 0-2.033-1.6-3.7-3.633-3.7-1.433 0-2.633 0.8-3.233 1.967-0.667 1.033-1.8 1.7-3.1 1.7-1.367 0-2.533-0.733-3.2-1.833-0.333 0.567-0.5 1.2-0.5 1.867 0 0.733 0.2 2.333 0.567 2.9v1.133h1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h2.1c0.6 0.3 1.333 0.667 2.133 0.667s1.533-0.4 2.133-0.667h0.7v-0.933z"></path>
+<path fill="#009688" d="M2.767 4.233c0 0 0 0 0 0 0 0.7 0.567 1.267 1.267 1.267s1.267-0.567 1.267-1.267c0-0 0-0 0-0v0c0-0 0-0 0-0 0-0.7-0.567-1.267-1.267-1.267s-1.267 0.567-1.267 1.267c0 0 0 0 0 0v0z"></path>
+<path fill="#009688" d="M15.633 16h-9c-0.267 0-0.5-0.233-0.5-0.5s0.233-0.5 0.5-0.5h8.5v-8.5c0-0.267 0.233-0.5 0.5-0.5s0.5 0.233 0.5 0.5v9c0 0.267-0.233 0.5-0.5 0.5z"></path>
+</svg>
+<svg id="icon-graft" width="17" height="16" viewBox="0 0 17 16" x="0" y="819">
+<path fill="#009688" d="M16.407 3.584c0.106-0.333 0.388-1.214-0.194-1.628-0.171-0.118-0.382-0.188-0.61-0.188-0.013 0-0.026 0-0.039 0.001l0.002-0c-0.449 0-1.133 0.267-1.914 0.713-0.030-0.060-0.067-0.112-0.111-0.157l0 0c-1.435-1.432-3.417-2.318-5.605-2.318-4.379 0-7.93 3.548-7.935 7.926v0c-0 0.009-0 0.020-0 0.031 0 2.264 0.957 4.305 2.489 5.739l0.004 0.004c0.107 0.101 0.251 0.163 0.41 0.163 0.001 0 0.001 0 0.002 0h0.044c-0.291 0.29-0.604 0.557-0.938 0.8l-0.023 0.016c-0.155 0.11-0.255 0.289-0.255 0.491 0 0.279 0.19 0.513 0.448 0.581l0.004 0.001c0.631 0.152 1.356 0.239 2.102 0.239 0.004 0 0.008 0 0.011 0h-0.001c1.236 0 2.256-0.259 3.042-0.777v0.047c0 0.332 0.269 0.601 0.601 0.601v0c4.38-0.005 7.929-3.555 7.935-7.934v-0c0-0.008 0.001-0.018 0.001-0.028 0-0.332-0.269-0.601-0.601-0.601s-0.601 0.269-0.601 0.601c0 0.010 0 0.020 0.001 0.029l-0-0.001c-0.005 3.687-2.969 6.679-6.644 6.731l-0.005 0c0.617-0.614 0.933-1.306 0.906-1.993-0.017-0.336-0.114-0.646-0.272-0.916l0.005 0.009c0.166 0.056 0.358 0.088 0.557 0.088 0.004 0 0.007-0 0.011-0h-0.001c2.749-0.001 6.495-6.143 7.175-8.27zM4.521 13.81c0.268-0.47 1.21-1.992 2.168-1.992 0.209 0.006 0.402 0.071 0.563 0.18l-0.004-0.002c0.265 0.15 0.447 0.419 0.476 0.732l0 0.004c0.021 0.427-0.3 0.928-0.881 1.375s-1.457 0.695-2.549 0.695c-0.181 0-0.369-0.006-0.56-0.021 0.298-0.283 0.558-0.602 0.774-0.952l0.012-0.020zM8.754 9.025c1.072-2.589 5.206-5.632 6.574-6.016-0.129 0.493-0.567 1.583-1.553 3.158-1.643 2.599-3.549 4.486-4.55 4.486-0.003 0-0.007 0-0.010 0-0.167 0-0.317-0.071-0.422-0.185l-0-0c-0.299-0.299-0.312-0.786-0.039-1.443zM1.2 7.933c0-0.002 0-0.004 0-0.006 0-3.717 3.014-6.731 6.731-6.731 1.835 0 3.499 0.734 4.713 1.925l-0.001-0.001c-1.977 1.364-4.207 3.536-4.998 5.444-0.422 1.019-0.327 1.744-0.071 2.246-0.26-0.121-0.564-0.192-0.885-0.193h-0c-1.486 0-2.63 1.588-3.193 2.559-0.021-0.136-0.086-0.254-0.18-0.343l-0-0c-1.303-1.221-2.115-2.952-2.115-4.874 0-0.009 0-0.019 0-0.028v0.001z"></path>
+<path fill="#009688" d="M8.931 4.704c0.858 0 1.553-0.695 1.553-1.553s-0.695-1.553-1.553-1.553c-0.858 0-1.553 0.695-1.553 1.553v0c0 0.858 0.695 1.553 1.553 1.553v0zM8.931 3.504c-0.194 0-0.352-0.158-0.352-0.352s0.158-0.352 0.352-0.352c0.194 0 0.352 0.158 0.352 0.352v0c0 0.194-0.158 0.352-0.352 0.352v0zM5.394 9.012c0-0.858-0.695-1.553-1.553-1.553s-1.553 0.695-1.553 1.553c0 0.858 0.695 1.553 1.553 1.553v0c0.858 0 1.553-0.695 1.553-1.553v0zM3.841 8.659c0.002-0 0.004-0 0.006-0 0.194 0 0.352 0.158 0.352 0.352s-0.158 0.352-0.352 0.352c-0.194 0-0.352-0.158-0.352-0.352v0c0-0 0-0 0-0 0-0.193 0.155-0.349 0.347-0.352h0zM4.977 7.069c1.144 0 2.071-0.927 2.071-2.071s-0.927-2.071-2.071-2.071c-1.144 0-2.071 0.927-2.071 2.071v0c0 1.144 0.927 2.071 2.071 2.071v0zM4.977 4.123c0.482 0 0.872 0.391 0.872 0.872s-0.391 0.872-0.872 0.872c-0.482 0-0.872-0.391-0.872-0.872v0c0.001-0.481 0.391-0.87 0.872-0.871h0z"></path>
+</svg>
+<svg id="icon-flash" width="16" height="16" viewBox="0 0 16 16" x="0" y="840">
+<path fill="#009688" d="M8 0.889c-3.911 0-7.111 3.2-7.111 7.111s3.2 7.111 7.111 7.111 7.111-3.2 7.111-7.111-3.2-7.111-7.111-7.111zM11.556 5.956c-1.244-0.089-1.956 1.244-1.956 1.244l1.422 0.089v1.6h-2.044c-1.067 3.911-3.644 3.2-3.644 3.2v-1.333s1.511 0 2.311-2.756c1.156-4.356 3.911-3.467 3.911-3.467v1.422z"></path>
+</svg>
+<svg id="icon-vedio" width="16" height="16" viewBox="0 0 16 16" x="0" y="861">
+<path fill="#009688" d="M15.385 0.615h-0.615v1.231h-1.846v-1.231h-9.846v1.231h-1.846v-1.231h-0.615c-0.339 0-0.615 0.276-0.615 0.615v13.538c0 0.339 0.276 0.615 0.615 0.615h0.615v-0.615h1.846v0.615h9.846v-0.615h1.846v0.615h0.615c0.339 0 0.615-0.276 0.615-0.615v-13.538c0-0.339-0.276-0.615-0.615-0.615zM3.077 12.923h-1.846v-1.846h1.846v1.846zM3.077 9.231h-1.846v-1.846h1.846v1.846zM3.077 5.538h-1.846v-1.846h1.846v1.846zM10.823 8.404l-4.002 2.334c-0.065 0.033-0.137 0.048-0.207 0.048-0.085 0-0.167-0.023-0.242-0.067-0.135-0.082-0.218-0.228-0.218-0.385v-4.668c0-0.157 0.082-0.303 0.218-0.385 0.137-0.082 0.307-0.090 0.449-0.018l4.002 2.334c0.156 0.077 0.254 0.233 0.254 0.404s-0.098 0.327-0.254 0.404zM14.769 12.923h-1.846v-1.846h1.846v1.846zM14.769 9.231h-1.846v-1.846h1.846v1.846zM14.769 5.538h-1.846v-1.846h1.846v1.846z"></path>
+</svg>
+<svg id="icon-attach" width="16" height="16" viewBox="0 0 16 16" x="0" y="882">
+<path fill="#009688" d="M5.415 11.292c0.185 0.185 0.462 0.154 0.646 0l3.077-3.077c0.215-0.215 0.585-0.246 0.862 0s0.246 0.677 0 0.923l-3.785 3.723c-0.831 0.831-2.215 0.831-3.046 0l-0.031-0.031c-0.831-0.831-0.831-2.215 0-3.046l6.677-6.677c0.831-0.831 2.215-0.831 3.046 0l0.031 0.031c0.831 0.831 0.831 2.215 0 3.046l-0.031 0.031c-0.154 0.154-0.185 0.369-0.062 0.554 0.185 0.338 0.338 0.708 0.431 1.077 0.062 0.246 0.338 0.308 0.523 0.154 0.246-0.246 0.462-0.492 0.462-0.492 1.569-1.569 1.569-4.123 0-5.692h-0.062c-1.569-1.569-4.123-1.569-5.692 0l-6.677 6.646c-1.569 1.569-1.569 4.123 0 5.692l0.062 0.062c1.569 1.569 4.092 1.569 5.662 0l3.815-3.785c0.985-0.985 0.954-2.585-0.062-3.569-0.985-0.954-2.585-0.892-3.538 0.092l-3.015 3.015c-0.185 0.185-0.185 0.492 0 0.677l0.708 0.646z"></path>
+</svg>
+<svg id="icon-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="903">
+<path fill="#009688" d="M17.846 0h-17.231c-0.49 0-0.615 0.129-0.615 0.615v14.769c0 0.486 0.125 0.615 0.615 0.615h17.231c0.49 0 0.615-0.129 0.615-0.615v-14.769c0-0.486-0.125-0.615-0.615-0.615zM5.538 14.769l-4.328 0.051v-3.108l4.328-0.020v3.077zM5.538 10.462h-4.308v-3.077h4.308v3.077zM5.538 6.154h-4.308v-2.462h4.308v2.462zM11.692 14.769h-4.923v-3.077h4.923v3.077zM11.692 10.462h-4.923v-3.077h4.923v3.077zM11.692 6.154h-4.923v-2.462h4.923v2.462zM17.231 14.769h-4.308v-3.077h4.308v3.077zM17.231 10.462h-4.308v-3.077h4.308v3.077zM17.231 6.154h-4.308v-2.462h4.308v2.462z"></path>
+</svg>
+<svg id="icon-split" width="16" height="16" viewBox="0 0 16 16" x="0" y="924">
+<path fill="#009688" d="M14.222 12.412l-1.811 1.811h-1.022l2.833-2.833v1.022zM14.222 13.742v0.48h-0.48l0.48-0.48zM14.222 10.059l-4.164 4.164h-1.022l4.444-4.444h0.741v0.281zM12.15 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM9.796 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM7.444 9.778l-4.444 4.444h-1.022l4.444-4.444h1.022zM5.091 9.778l-3.313 3.313v-1.012l2.3-2.3h1.013zM2.748 9.778l-0.97 0.97v-0.97h0.97zM14.222 3.078l-2.255 2.255h-1.022l3.277-3.277v1.022zM14.222 4.409v0.924h-0.924l0.924-0.924zM13.17 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM10.817 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM8.462 1.778l-3.556 3.556h-1.022l3.556-3.556h1.022zM6.11 1.778l-3.556 3.556h-0.777v-0.244l3.311-3.311h1.022zM3.757 1.778l-1.98 1.98v-1.012l0.967-0.967h1.013zM0 7.111h16v0.889h-16v-0.889z"></path>
+</svg>
+<svg id="icon-face" width="16" height="16" viewBox="0 0 16 16" x="0" y="945">
+<path fill="#009688" d="M8 16c-4.417 0-8-3.58-8-7.993s3.583-8.007 8-8.007 8 3.594 8 8.007c0 4.413-3.583 7.993-8 7.993zM8 1c-3.865 0-7 3.145-7 7.006s3.135 6.994 7 6.994 7-3.132 7-6.994c0-3.861-3.135-7.006-7-7.006zM8 13c-2.419 0-4.436-1.718-4.899-4h1.041c0.446 1.722 1.997 3 3.859 3s3.412-1.278 3.858-3h1.041c-0.463 2.282-2.48 4-4.899 4zM11 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1zM5 6c-0.552 0-1-0.448-1-1s0.448-1 1-1 1 0.448 1 1c0 0.552-0.448 1-1 1z"></path>
+</svg>
+<svg id="icon-split-page" width="16" height="16" viewBox="0 0 16 16" x="0" y="966">
+<path fill="#009688" d="M14.25 1v4h-12.5v-4h1.042v3h10.417v-3zM1.75 15v-4h12.5v4h-1.041v-3h-10.417v3zM1 7h14v2h-14z"></path>
+</svg>
+<svg id="icon-anchor" width="16" height="16" viewBox="0 0 16 16" x="0" y="987">
+<path fill="#009688" d="M15.297 9.614l-1.117-1.117c-0.075-0.075-0.174-0.116-0.28-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l0.442-0.442c-0.107 1.281-0.667 2.486-1.579 3.399-0.925 0.925-2.149 1.487-3.45 1.583l-0-7.611 3.106-0c0.218 0 0.396-0.178 0.396-0.396s-0.178-0.396-0.396-0.396h-3.106v-4.407l2.781 2.781c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-3.434-3.434c-0.083-0.083-0.198-0.125-0.316-0.114-0.109-0.003-0.214 0.038-0.291 0.116l-3.434 3.434c-0.154 0.154-0.154 0.406 0 0.56 0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116l2.781-2.781v4.405h-3.106c-0.218 0-0.396 0.178-0.396 0.396s0.178 0.396 0.396 0.396l3.106-0v7.613c-1.311-0.091-2.546-0.653-3.478-1.585-0.92-0.92-1.481-2.137-1.582-3.43l0.444 0.444c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116c0.075-0.075 0.116-0.174 0.116-0.28s-0.041-0.205-0.116-0.28l-1.117-1.117c-0.075-0.075-0.174-0.116-0.279-0.116-0.012 0-0.024 0.001-0.036 0.002-0.11-0.003-0.214 0.038-0.291 0.116l-1.143 1.143c-0.075 0.075-0.116 0.174-0.116 0.28s0.041 0.205 0.116 0.28 0.174 0.116 0.28 0.116c0.106 0 0.205-0.041 0.28-0.116l0.475-0.475c0.047 0.697 0.208 1.376 0.48 2.018 0.316 0.748 0.769 1.42 1.346 1.997s1.249 1.030 1.997 1.346c0.775 0.328 1.598 0.494 2.446 0.494s1.671-0.166 2.446-0.494c0.748-0.316 1.42-0.769 1.997-1.346s1.030-1.249 1.346-1.997c0.275-0.651 0.437-1.338 0.481-2.045l0.474 0.474c0.075 0.075 0.174 0.116 0.28 0.116s0.205-0.041 0.28-0.116 0.116-0.174 0.116-0.28c0-0.106-0.041-0.205-0.116-0.28z"></path>
+</svg>
+<svg id="icon-link" width="16" height="16" viewBox="0 0 16 16" x="0" y="1008">
+<path fill="#009688" d="M8.369 12.831l-0.646-0.092s-0.431-0.092-0.646-0.185c-0.123-0.031-0.277 0-0.369 0.092l-0.154 0.154c-0.892 0.892-2.338 0.985-3.262 0.185-1.046-0.892-1.077-2.492-0.123-3.446l2.338-2.338c0.308-0.308 0.677-0.492 1.046-0.615 0.492-0.123 1.015-0.092 1.477 0.092 0.277 0.123 0.554 0.277 0.8 0.523 0.123 0.123 0.215 0.246 0.308 0.4 0.123 0.215 0.4 0.246 0.554 0.062l0.862-0.862c0.123-0.123 0.123-0.308 0.031-0.462-0.123-0.185-0.277-0.338-0.431-0.492-0.215-0.215-0.462-0.431-0.738-0.585-0.431-0.277-0.923-0.462-1.446-0.554-0.954-0.185-2-0.031-2.862 0.431-0.338 0.185-0.677 0.431-0.954 0.708l-2.246 2.246c-1.631 1.631-1.754 4.277-0.185 5.938 1.631 1.785 4.4 1.815 6.092 0.123l0.769-0.769c0.215-0.154 0.062-0.523-0.215-0.554zM14.031 1.785c-1.692-1.569-4.338-1.446-5.938 0.185l-0.708 0.677c-0.215 0.215-0.062 0.585 0.215 0.615 0.431 0.031 0.862 0.123 1.292 0.246 0.123 0.031 0.277 0 0.369-0.092l0.154-0.154c0.892-0.892 2.338-0.985 3.262-0.185 1.046 0.892 1.077 2.492 0.123 3.446l-2.338 2.338c-0.308 0.308-0.677 0.492-1.046 0.615-0.492 0.123-1.015 0.092-1.477-0.092-0.277-0.123-0.554-0.277-0.8-0.523-0.123-0.123-0.215-0.246-0.308-0.4-0.123-0.215-0.4-0.246-0.554-0.062l-0.862 0.862c-0.123 0.123-0.123 0.308-0.031 0.462 0.123 0.185 0.277 0.338 0.431 0.492 0.215 0.215 0.492 0.431 0.738 0.585 0.431 0.277 0.923 0.462 1.415 0.554 0.954 0.185 2 0.031 2.862-0.431 0.338-0.185 0.677-0.431 0.954-0.708l2.338-2.338c1.723-1.692 1.662-4.462-0.092-6.092z"></path>
+</svg>
+<svg id="icon-unlink" width="16" height="16" viewBox="0 0 16 16" x="0" y="1029">
+<path fill="#009688" d="M7.385 11.262c-0.185 0-0.369-0.031-0.554-0.092-0.185-0.031-0.4-0.092-0.585-0.154-0.123-0.031-0.246 0-0.308 0.062l-0.123 0.123c-0.769 0.769-2.031 0.862-2.862 0.154-0.892-0.8-0.954-2.185-0.092-3.015l2.031-2.031c0.277-0.277 0.585-0.431 0.923-0.523 0.431-0.123 0.892-0.092 1.292 0.092 0.246 0.092 0.492 0.246 0.677 0.462 0.092 0.092 0.185 0.215 0.277 0.369 0.092 0.185 0.338 0.215 0.492 0.062l0.769-0.769c0.123-0.123 0.123-0.277 0.031-0.4-0.123-0.154-0.246-0.277-0.369-0.431-0.185-0.185-0.431-0.369-0.646-0.523-0.4-0.246-0.8-0.4-1.262-0.492-0.831-0.154-1.723-0.031-2.523 0.4-0.308 0.154-0.585 0.369-0.831 0.615l-1.969 1.969c-1.415 1.415-1.538 3.723-0.154 5.2 1.446 1.538 3.877 1.6 5.354 0.092l0.677-0.677c0.154-0.154 0.031-0.462-0.246-0.492zM12.462 6.923c1.477-1.477 1.446-3.908-0.092-5.354-1.477-1.354-3.785-1.262-5.2 0.154l-0.615 0.615c-0.185 0.185-0.062 0.492 0.185 0.523 0.369 0.031 0.769 0.092 1.138 0.215 0.123 0.031 0.246 0 0.308-0.062l0.123-0.123c0.769-0.769 2.031-0.862 2.862-0.154 0.892 0.8 0.954 2.185 0.092 3.015l-2.031 2.031c-0.277 0.277-0.585 0.431-0.923 0.523-0.431 0.123-0.892 0.092-1.292-0.092-0.246-0.092-0.492-0.246-0.677-0.462-0.092-0.092-0.185-0.215-0.246-0.338-0.092-0.185-0.338-0.215-0.492-0.062l-0.738 0.738c-0.123 0.123-0.123 0.277-0.031 0.4 0.123 0.154 0.215 0.277 0.369 0.431 0.215 0.215 0.431 0.369 0.646 0.523 0.4 0.246 0.8 0.4 1.262 0.492 0.831 0.154 1.723 0.031 2.523-0.4 0.308-0.154 0.585-0.369 0.831-0.615l2-2zM13.877 12.615l1.415-1.415c0.123-0.123 0.123-0.308 0-0.431l-0.862-0.862c-0.123-0.123-0.308-0.123-0.431 0l-1.385 1.446-1.323-1.323c-0.123-0.123-0.308-0.123-0.431 0l-0.862 0.862c-0.123 0.123-0.123 0.308 0 0.431l1.323 1.323-1.292 1.292c-0.123 0.123-0.123 0.308 0 0.431l0.862 0.862c0.123 0.123 0.308 0.123 0.431 0l1.292-1.292 1.385 1.385c0.123 0.123 0.308 0.123 0.431 0l0.862-0.862c0.123-0.123 0.123-0.308 0-0.431l-1.415-1.415z"></path>
+</svg>
+<svg id="icon-baidu-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1050">
+<path fill="#009688" d="M9.473 10.846c0.725-0.156 0.626-1.022 0.605-1.211-0.035-0.292-0.379-0.802-0.845-0.762-0.587 0.053-0.672 0.9-0.672 0.9-0.080 0.392 0.189 1.229 0.913 1.073zM10.243 12.353c-0.021 0.061-0.069 0.217-0.027 0.352 0.081 0.305 0.345 0.318 0.345 0.318h0.379v-0.928h-0.407c-0.183 0.055-0.271 0.197-0.291 0.258zM10.819 9.393c0.401 0 0.724-0.461 0.724-1.031s-0.323-1.030-0.724-1.030c-0.399 0-0.724 0.461-0.724 1.030s0.324 1.031 0.724 1.031zM12.543 9.461c0.535 0.069 0.879-0.501 0.947-0.935 0.070-0.432-0.275-0.935-0.654-1.021-0.379-0.087-0.853 0.521-0.897 0.917-0.052 0.485 0.069 0.969 0.603 1.038zM13.854 12.006s-0.828-0.641-1.311-1.333c-0.655-1.021-1.586-0.605-1.897-0.086-0.31 0.519-0.793 0.847-0.861 0.935-0.069 0.085-1 0.588-0.793 1.505s0.932 0.899 0.932 0.899 0.535 0.053 1.155-0.086c0.621-0.137 1.155 0.035 1.155 0.035s1.449 0.485 1.846-0.449c0.396-0.935-0.224-1.42-0.224-1.42zM11.374 13.397h-0.942c-0.407-0.081-0.569-0.359-0.589-0.406s-0.135-0.271-0.075-0.651c0.176-0.569 0.677-0.61 0.677-0.61h0.501v-0.617l0.427 0.007v2.277zM13.129 13.39h-1.084c-0.42-0.108-0.44-0.407-0.44-0.407v-1.199l0.44-0.007v1.078c0.027 0.115 0.169 0.136 0.169 0.136h0.447v-1.206h0.468v1.605zM14.664 10.189c0-0.207-0.172-0.831-0.81-0.831s-0.725 0.589-0.725 1.005c0 0.397 0.033 0.951 0.827 0.933s0.707-0.899 0.707-1.107zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l0.052-0.111c-0.201-0.083-0.385-0.213-0.533-0.393-0.345-0.423-0.433-0.979-0.368-1.358 0.062-0.522 0.394-1.388 1.275-1.467 0.032-0.003 0.069-0.005 0.106-0.005 0.001 0 0.002 0 0.003 0h-0c0.051 0 0.1 0.003 0.149 0.009 0.061-0.878 0.647-1.546 1.386-1.546 0.072 0 0.14 0.015 0.208 0.027l0.092-0.195c0.143-0.304 0.215-0.692 0.215-1.165 0-0.92-0.325-1.706-0.977-2.357s-1.437-0.977-2.357-0.977-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM8.734 14h-7.401l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h5.811c0.083 0.274 0.202 0.494 0.344 0.667z"></path>
+</svg>
+<svg id="icon-google-map" width="16" height="16" viewBox="0 0 16 16" x="0" y="1071">
+<path fill="#009688" d="M10.813 8.519c0 0.622 0.208 1.071 0.618 1.335 0.335 0.216 0.725 0.249 0.927 0.249 0.049 0 0.089-0.002 0.116-0.004 0 0-0.064 0.418 0.246 0.832h-0.014c-0.537 0-2.289 0.112-2.289 1.553 0 1.465 1.609 1.54 1.932 1.54 0.025 0 0.040-0.001 0.040-0.001 0.003 0 0.027 0.001 0.066 0.001 0.207 0 0.743-0.026 1.24-0.268 0.645-0.313 0.972-0.858 0.972-1.619 0-0.735-0.499-1.173-0.863-1.493-0.222-0.195-0.414-0.363-0.414-0.527 0-0.167 0.14-0.292 0.317-0.451 0.287-0.257 0.557-0.622 0.557-1.313 0-0.607-0.079-1.015-0.564-1.273 0.051-0.026 0.229-0.045 0.318-0.057 0.263-0.036 0.647-0.077 0.647-0.291v-0.041h-1.916c-0.019-0.001-1.937 0.071-1.937 1.827zM13.906 12.274c0.037 0.586-0.465 1.019-1.217 1.073-0.765 0.056-1.394-0.288-1.431-0.873-0.018-0.281 0.106-0.557 0.348-0.777 0.245-0.223 0.583-0.359 0.949-0.387 0.043-0.003 0.086-0.005 0.129-0.005 0.707 0 1.187 0.416 1.221 0.968zM13.405 8.118c0.188 0.661-0.096 1.353-0.548 1.48-0.048 0.014-0.103 0.022-0.16 0.022-0 0-0 0-0 0h0c-0.415 0-0.825-0.419-0.977-0.997-0.085-0.325-0.078-0.608 0.019-0.881 0.096-0.268 0.268-0.449 0.485-0.511 0.048-0.014 0.103-0.022 0.16-0.022 0 0 0 0 0 0h-0c0.501 0 0.823 0.207 1.021 0.908zM7.258 11.538c0.065 0.143 0.166 0.256 0.303 0.339s0.283 0.124 0.439 0.124 0.303-0.041 0.439-0.124c0.137-0.083 0.24-0.195 0.309-0.339l1.275-2.711c-0.009-0.099-0.017-0.199-0.017-0.308 0-1.052 0.509-1.742 1.153-2.151 0.109-0.284 0.174-0.621 0.174-1.034 0-0.92-0.325-1.706-0.977-2.357-0.651-0.652-1.437-0.977-2.357-0.977s-1.706 0.325-2.357 0.977c-0.651 0.651-0.977 1.437-0.977 2.357 0 0.473 0.071 0.862 0.215 1.165l2.377 5.039zM6.821 4.155c0.325-0.325 0.718-0.488 1.179-0.488s0.853 0.163 1.179 0.488c0.325 0.325 0.488 0.718 0.488 1.178s-0.163 0.853-0.488 1.179c-0.325 0.325-0.719 0.488-1.179 0.488s-0.853-0.163-1.179-0.488c-0.325-0.325-0.488-0.718-0.488-1.179 0-0.459 0.163-0.852 0.488-1.178zM9.895 10.667l0.313-0.667h0.225c0.137 0.189 0.299 0.35 0.483 0.48l0.006 0.004c-0.115 0.055-0.221 0.116-0.322 0.182h-0.705zM10.184 14h-8.851l2.667-4h1.795l0.315 0.667h-1.753l-1.778 2.667h7.195c0.099 0.255 0.235 0.479 0.411 0.667z"></path>
+</svg>
+<svg id="icon-about" width="16" height="16" viewBox="0 0 16 16" x="0" y="1092">
+<path fill="#009688" d="M8.011 0.991c-3.868 0-7.003 3.135-7.003 7.003s3.135 7.003 7.003 7.003 7.003-3.136 7.003-7.003c0-3.868-3.135-7.003-7.003-7.003zM7.984 11.487c-0.399 0-0.723-0.333-0.723-0.743s0.324-0.743 0.723-0.743c0.399 0 0.723 0.333 0.723 0.743s-0.324 0.743-0.723 0.743zM10.003 6.816c-0.1 0.192-0.218 0.357-0.355 0.496s-0.384 0.374-0.739 0.704c-0.098 0.093-0.177 0.174-0.236 0.245s-0.103 0.134-0.132 0.193c-0.026 0.050-0.049 0.108-0.066 0.168l-0.002 0.007c-0.016 0.059-0.040 0.161-0.072 0.308-0.055 0.312-0.227 0.467-0.516 0.467-0.15 0-0.277-0.051-0.379-0.153s-0.154-0.253-0.154-0.454c0-0.251 0.037-0.47 0.113-0.654s0.175-0.347 0.299-0.486c0.124-0.139 0.292-0.305 0.503-0.497 0.185-0.168 0.319-0.294 0.401-0.38 0.080-0.083 0.149-0.176 0.205-0.279l0.003-0.007c0.056-0.105 0.085-0.219 0.085-0.341 0-0.24-0.086-0.442-0.258-0.607s-0.394-0.247-0.666-0.247c-0.318 0-0.552 0.083-0.702 0.25s-0.277 0.411-0.382 0.735c-0.098 0.339-0.285 0.508-0.559 0.508-0.162 0-0.298-0.059-0.41-0.178s-0.167-0.247-0.167-0.384c0-0.285 0.088-0.573 0.264-0.866s0.434-0.534 0.772-0.726c0.338-0.192 0.733-0.288 1.183-0.288 0.419 0 0.789 0.080 1.11 0.24s0.569 0.378 0.743 0.654c0.175 0.276 0.262 0.576 0.262 0.899 0 0.255-0.050 0.478-0.15 0.67z"></path>
+</svg>
+<svg id="icon-blockquote" width="16" height="16" viewBox="0 0 16 16" x="0" y="1113">
+<path fill="#009688" d="M13.631 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8zM6 2c-2.769 0-4.892 2.154-4.892 4.923v6.615c0 0.246 0.215 0.462 0.462 0.462h5.231c0.246 0 0.462-0.215 0.462-0.462v-5.231c0-0.246-0.215-0.462-0.462-0.462h-3.846v-0.923c0-1.538 1.508-3.077 3.046-3.077h0.8c0.246 0 0.462-0.215 0.462-0.462v-0.923c0-0.246-0.215-0.462-0.462-0.462h-0.8z"></path>
+</svg>
+<svg id="icon-table-attr" width="16" height="16" viewBox="0 0 16 16" x="0" y="1134">
+<path fill="#009688" d="M15.204 1.055h-14.364c-0.41 0-0.743 0.333-0.743 0.743v12.383c0 0.41 0.333 0.743 0.743 0.743h14.364c0.41 0 0.743-0.333 0.743-0.743v-12.383c0-0.41-0.333-0.743-0.743-0.743l-0-0zM15.204 4.027v2.903h-4.293v-2.903h4.293zM5.875 10.563v-2.889h4.293v2.889h-4.293zM10.168 11.306v2.875h-4.293v-2.875h4.293zM5.132 10.563h-4.293v-2.889h4.293v2.889zM10.168 4.027v2.903h-4.293v-2.903h4.293zM10.911 7.674h4.293v2.889h-4.293v-2.889zM6.040 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM3.811 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 1.798c0.41 0 0.743 0.333 0.743 0.743s-0.333 0.743-0.743 0.743c-0.41 0-0.743-0.333-0.743-0.743s0.333-0.743 0.743-0.743v-0zM1.582 4.027h3.55v2.903h-4.293l0-2.903h0.743zM0.839 11.306h4.293v2.875h-4.293v-2.875zM10.911 14.181v-2.875h4.293v2.875h-4.293z"></path>
+</svg>
+<svg id="icon-insert-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1155">
+<path fill="#009688" d="M14 0h-2s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h2c0.552 0 1-0.448 1-1v-10c0-0.552-0.448-1-1-1zM14 11h-2v-3h2v3zM14 7h-2v-2h2v2zM14 4h-2v-3h2v3zM9 13l-2 3h5l-2-3h-1zM8 11v-10c0-0.552-0.448-1-1-1h-5s-1 0.448-1 1v10c0 0.552 0.448 1 1 1h5c0.552 0 1-0.448 1-1zM7 7h-2v-2h2v2zM7 1v3h-2v-3h2zM4 11h-2v-3h2v3zM4 7h-2v-2h2v2zM4 4h-2v-3h2v3zM5 8h2v3h-2v-3z"></path>
+</svg>
+<svg id="icon-insert-row" width="18" height="16" viewBox="0 0 18 16" x="0" y="1176">
+<path fill="#009688" d="M17.143 16h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143zM9.143 9.143h-3.429v2.286h3.429v-2.286zM9.143 12.571h-3.429v2.286h3.429v-2.286zM12.571 9.143h-2.286v2.286h2.286v-2.286zM12.571 12.571h-2.286v2.286h2.286v-2.286zM17.143 9.143h-3.429v2.286h3.429v-2.286zM13.714 12.571v2.286h3.429v-2.286h-3.429zM17.143 4.571h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143zM9.143 1.143h-3.429v2.286h3.429v-2.286zM12.571 1.143h-2.286v2.286h2.286v-2.286zM17.143 1.143h-3.429v2.286h3.429v-2.286zM0 3.429l3.429 2.286v1.143l-3.429 2.286v-5.714z"></path>
+</svg>
+<svg id="icon-merge-table" width="21" height="16" viewBox="0 0 21 16" x="0" y="1197">
+<path fill="#009688" d="M1.484 2.296c0-0.615 0.242-1.198 0.682-1.63 0.43-0.432 1.005-0.666 1.62-0.666h0.016l10.845 0.059c0.615 0 1.198 0.242 1.63 0.682s0.666 1.021 0.666 1.637l-0.059 10.845c0 0.615-0.242 1.198-0.682 1.63-0.432 0.432-1.007 0.666-1.622 0.666h-0.016l-10.845-0.059c-0.615 0-1.198-0.242-1.63-0.682s-0.666-1.023-0.666-1.639l0.061-10.843zM6.199 1.048l-2.412-0.016c-0.333 0-0.65 0.134-0.897 0.374-0.242 0.242-0.374 0.556-0.374 0.897l-0.016 2.461h3.7v-3.716zM10.98 1.072l-3.742-0.024v3.718h3.742v-3.693zM12.020 14.463l2.552 0.016c0.341 0 0.658-0.124 0.897-0.365 0.242-0.242 0.374-0.556 0.374-0.897l0.016-2.579h-3.842v3.825zM12.020 9.598h3.844l0.016-3.793h-3.868v3.793h0.008zM12.020 4.765h3.868l0.016-2.396c0-0.333-0.124-0.658-0.365-0.897-0.242-0.242-0.556-0.374-0.897-0.374l-2.619-0.016v3.683z"></path>
+<path fill="#009688" d="M5.005 1.478c0.008 0 0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-merge-td" width="16" height="16" viewBox="0 0 16 16" x="0" y="1218">
+<path fill="#009688" d="M11.371 9.493h2.837v-2.987h-12.416v2.987h9.579zM0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333z"></path>
+</svg>
+<svg id="icon-remove-col" width="16" height="16" viewBox="0 0 16 16" x="0" y="1239">
+<path fill="#009688" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM7 12h1v1h-1s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h5c0.552 0 1 0.448 1 1v7h-1v-3h-2v3h-1v-3h-2v3h1v1h-1v3zM10 4h2v-3h-2v3zM9 4v-3h-2v3h2zM1 13s-1-0.448-1-1v-11c0-0.552 0.448-1 1-1h2c0.552 0 1 0.448 1 1v12h-3zM3 1h-2v3h2v-3zM3 5h-2v3h2v-3zM3 9h-2v3h2v-3z"></path>
+</svg>
+<svg id="icon-remove-row" width="16" height="16" viewBox="0 0 16 16" x="0" y="1260">
+<path fill="#009688" d="M16 16h-2l-2-2.334-2 2.334h-2l3-3.5-3-3.5h2l2 2.333 2-2.333h2l-3 3.5 3 3.5zM9 8h-4v2h1.667l0.333 1h-2v2h2.667l0.333 1h-7c-0.552 0-1-0.448-1-1v-5s0.448-1 1-1h12v1h-4zM4 8h-3v2h3v-2zM4 11h-3v2h3v-2zM1 4c-0.552 0-1-0.448-1-1v-2s0.448-1 1-1h11c0.552 0 1 0.448 1 1v3h-12zM4 1h-3v2h3v-2zM8 1h-3v2h3v-2zM12 1h-3v2h3v-2z"></path>
+</svg>
+<svg id="icon-remove-table" width="18" height="16" viewBox="0 0 18 16" x="0" y="1281">
+<path fill="#009688" d="M14.857 16v-3.429l3.429-2.286v3.429l-3.429 2.286zM8 11.429l4.571-3.429h5.714l-4.571 3.429h-5.714zM13.714 4.571h-3.429v3.429h-4.571v2.286h1.143v1.143h-5.714c-0.631 0-1.143-0.512-1.143-1.143v-9.143c0-0.631 0.512-1.143 1.143-1.143h12.571c0.631 0 1.143 0.512 1.143 1.143v5.714h-1.143v-2.286zM4.571 1.143h-3.429v2.286h3.429v-2.286zM4.571 4.571h-3.429v2.286h3.429v-2.286zM4.571 8h-3.429v2.286h3.429v-2.286zM9.143 1.143h-3.429v2.286h3.429v-2.286zM9.143 4.571h-3.429v2.286h3.429v-2.286zM13.714 1.143h-3.429v2.286h3.429v-2.286zM13.714 16h-5.714v-3.429h5.714v3.429z"></path>
+</svg>
+<svg id="icon-insert-col2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1302">
+<path fill="#009688" d="M2 16h2s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-2c-0.552 0-1 0.448-1 1v10c0 0.552 0.448 1 1 1zM2 5h2v3h-2v-3zM2 9h2v2h-2v-2zM2 12h2v3h-2v-3zM7 3l2-3h-5l2 3h1zM8 5v10c0 0.552 0.448 1 1 1h5s1-0.448 1-1v-10c0-0.552-0.448-1-1-1h-5c-0.552 0-1 0.448-1 1zM9 9h2v2h-2v-2zM9 15v-3h2v3h-2zM12 5h2v3h-2v-3zM12 9h2v2h-2v-2zM12 12h2v3h-2v-3zM11 8h-2v-3h2v3z"></path>
+</svg>
+<svg id="icon-insert-row2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1323">
+<path fill="#009688" d="M1.154 0h11.429c0.631 0 1.143 0.512 1.143 1.143v5.714s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-5.714s0.512-1.143 1.143-1.143zM9.154 6.857h3.429v-2.286h-3.429v2.286zM9.154 3.429h3.429v-2.286h-3.429v2.286zM5.725 6.857h2.286v-2.286h-2.286v2.286zM5.725 3.429h2.286v-2.286h-2.286v2.286zM1.154 6.857h3.429v-2.286h-3.429v2.286zM4.583 3.429v-2.286h-3.429v2.286h3.429zM1.154 11.429h11.429c0.631 0 1.143 0.512 1.143 1.143v2.286s-0.512 1.143-1.143 1.143h-11.429c-0.631 0-1.143-0.512-1.143-1.143v-2.286s0.512-1.143 1.143-1.143zM9.154 14.857h3.429v-2.286h-3.429v2.286zM5.725 14.857h2.286v-2.286h-2.286v2.286zM1.154 14.857h3.429v-2.286h-3.429v2.286zM18.297 12.571l-3.429-2.286v-1.143l3.429-2.286v5.714z"></path>
+</svg>
+<svg id="icon-split-table" width="16" height="16" viewBox="0 0 16 16" x="0" y="1344">
+<path fill="#009688" d="M0 0h16v16h-16v-16zM14.208 4.779v-2.987h-5.333v2.987h5.333zM14.208 14.208v-2.987h-5.333v2.987h5.333zM7.125 4.779v-2.987h-5.333v2.987h5.333zM7.125 14.208v-2.987h-5.333v2.987h5.333zM10.667 9.493v-2.987h-1.792v2.987h1.792zM14.208 9.493v-2.987h-1.792v2.987h1.792zM3.584 9.493v-2.987h-1.792v2.987h1.792zM7.125 9.493v-2.987h-1.792v2.987h1.792z"></path>
+</svg>
+<svg id="icon-merge-table2" width="21" height="16" viewBox="0 0 21 16" x="0" y="1365">
+<path fill="#009688" d="M19.297 2.296c0-0.615-0.242-1.198-0.682-1.63-0.43-0.432-1.005-0.666-1.62-0.666h-0.016l-10.845 0.059c-0.615 0-1.198 0.242-1.63 0.682s-0.666 1.021-0.666 1.637l0.059 10.845c0 0.615 0.242 1.198 0.682 1.63 0.432 0.432 1.007 0.666 1.622 0.666h0.016l10.845-0.059c0.615 0 1.198-0.242 1.63-0.682s0.666-1.023 0.666-1.639l-0.061-10.843zM14.583 1.048l2.412-0.016c0.333 0 0.65 0.134 0.897 0.374 0.242 0.242 0.374 0.556 0.374 0.897l0.016 2.461h-3.7v-3.716zM9.801 1.072l3.742-0.024v3.718h-3.742v-3.693zM8.761 14.463l-2.552 0.016c-0.341 0-0.658-0.124-0.897-0.365-0.242-0.242-0.374-0.556-0.374-0.897l-0.016-2.579h3.842v3.825zM8.761 9.598h-3.844l-0.016-3.793h3.868v3.793h-0.008zM8.761 4.765h-3.868l-0.016-2.396c0-0.333 0.124-0.658 0.365-0.897 0.242-0.242 0.556-0.374 0.897-0.374l2.619-0.016v3.683z"></path>
+<path fill="#009688" d="M15.777 1.478c-0.008 0-0.008 0.008 0 0z"></path>
+</svg>
+<svg id="icon-remove2" width="16" height="16" viewBox="0 0 16 16" x="0" y="1386">
+<path fill="#009688" d="M6.214 13.804c0.401 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726zM15.299 1.464h-6.178v-0.726c0-0.401-0.325-0.726-0.727-0.726h-0.727c-0.401 0-0.727 0.325-0.727 0.726v0.726h-6.177c-0.008-0-0.017-0-0.026-0-0.401 0-0.726 0.325-0.726 0.726s0.325 0.726 0.726 0.726c0.009 0 0.018-0 0.027-0.001l-0.001 0h1.090v11.615c0.001 0.802 0.651 1.452 1.453 1.452 0 0 0.001 0 0.001 0h9.448c0 0 0.001 0 0.001 0 0.802 0 1.452-0.65 1.453-1.452v-11.615h1.090c0.008 0 0.017 0 0.026 0 0.401 0 0.726-0.325 0.726-0.726s-0.325-0.726-0.726-0.726c-0.009 0-0.018 0-0.027 0l0.001-0zM12.755 13.804c0 0.401-0.325 0.726-0.727 0.726h-7.994c-0.401 0-0.727-0.325-0.727-0.726v-10.889h9.448v10.889zM9.847 13.804c0.402 0 0.727-0.325 0.727-0.726v-8.711c0-0.401-0.325-0.727-0.727-0.727s-0.727 0.325-0.727 0.727v0 8.711c0 0.401 0.325 0.726 0.727 0.726z"></path>
+</svg>
+<svg id="icon-ok" width="16" height="16" viewBox="0 0 16 16" x="0" y="1407">
+<path fill="#009688" d="M8 16c-4.418 0-8-3.582-8-8s3.582-8 8-8c4.418 0 8 3.582 8 8s-3.582 8-8 8zM12.177 4.986l-4.894 4.894-3.364-3.365-0.918 0.918 4.282 4.283 5.811-5.812-0.917-0.918z"></path>
+</svg>
+<svg id="icon-remove" width="16" height="16" viewBox="0 0 16 16" x="0" y="1428">
+<path fill="#009688" d="M8 1c-3.867 0-7 3.133-7 7s3.133 7 7 7 7-3.133 7-7c0-3.867-3.133-7-7-7zM11.167 10.7c0.133 0.133 0.133 0.333 0 0.467s-0.333 0.133-0.467 0l-2.7-2.7-2.7 2.7c-0.133 0.133-0.333 0.133-0.467 0s-0.133-0.333 0-0.467l2.7-2.7-2.7-2.7c-0.133-0.133-0.133-0.333 0-0.467s0.333-0.133 0.467 0l2.7 2.7 2.7-2.7c0.133-0.133 0.333-0.133 0.467 0s0.133 0.333 0 0.467l-2.7 2.7 2.7 2.7z"></path>
+</svg>
+<svg id="icon-graft2" width="18" height="16" viewBox="0 0 18 16" x="0" y="1449">
+<path fill="#009688" d="M11.658 0.504c0.216-0.218 0.516-0.354 0.848-0.354s0.631 0.135 0.847 0.354l1.664 1.664c0.217 0.217 0.351 0.517 0.351 0.848s-0.134 0.631-0.351 0.848l-9.336 9.336c-0.468 0.468-1.365 0.954-2.024 1.089l-3.048 0.625 0.625-3.048c0.133-0.65 0.62-1.557 1.088-2.025l9.336-9.336zM9.96 2.202l-0.848 0.849 3.358 3.359 0.849-0.849-3.359-3.359zM12.184 12.804c0.905-0.457 1.054-0.865 0.639-1.526-0.338-0.537-1.675-0.285-1.797 0.805-0.044 0.398 0.117 0.753 0.421 1.026 0.28-0.096 0.525-0.197 0.737-0.305zM13.063 13.682c-0.092 0.059-0.206 0.124-0.322 0.183l-0.025 0.012c-0.396 0.201-0.877 0.38-1.442 0.54-1.27 0.36-2.968 0.617-5.104 0.781-0.013 0.001-0.028 0.002-0.043 0.002-0.314 0-0.572-0.243-0.594-0.552l-0-0.002c-0.001-0.014-0.002-0.031-0.002-0.048 0-0.313 0.24-0.57 0.547-0.596l0.002-0c1.652-0.127 3.021-0.311 4.101-0.548 0.479-0.104 0.901-0.22 1.266-0.345 0.367 0.331 0.943 0.544 1.616 0.573 0.981 0.043 2.17-0.303 3.22-1.242 0.104-0.093 0.242-0.15 0.393-0.15 0.177 0 0.336 0.078 0.444 0.202l0.001 0.001c0.093 0.106 0.149 0.245 0.149 0.398 0 0.178-0.077 0.338-0.2 0.449l-0.001 0c-1.888 1.687-4.29 1.855-5.796 1.079-0.462-0.238-0.84-0.565-1.093-0.964-0.221-0.346-0.353-0.767-0.353-1.219 0-0.101 0.007-0.2 0.019-0.297l-0.001 0.011c0.25-2.25 3.058-2.78 3.979-1.315 0.752 1.197 0.45 2.291-0.762 3.048z"></path>
+</svg>
+<svg id="icon-func" width="17" height="16" viewBox="0 0 17 16" x="0" y="1470">
+<path fill="#009688" d="M0.531 15.51v-2.065h4.213c-1.236-0.919-2.162-1.924-2.78-3.018-0.582-1.007-0.926-2.215-0.926-3.503 0-0.014 0-0.029 0-0.043l-0 0.002c0-1.992 0.695-3.612 2.086-4.861 1.39-1.25 3.193-1.874 5.406-1.874 2.215 0 4.017 0.625 5.408 1.874s2.086 2.869 2.086 4.86c0 1.263-0.309 2.441-0.927 3.535s-1.544 2.103-2.78 3.028h4.213v2.065h-6.854v-2.065c1.012-0.756 1.772-1.663 2.278-2.72 0.506-1.056 0.76-2.263 0.76-3.62 0-1.519-0.373-2.715-1.12-3.59-0.745-0.874-1.767-1.31-3.063-1.31s-2.317 0.438-3.063 1.316c-0.746 0.877-1.119 2.076-1.119 3.595 0 1.356 0.253 2.562 0.76 3.615s1.265 1.958 2.278 2.714v2.065h-6.857z"></path>
+</svg>
+<svg id="icon-find" width="16" height="16" viewBox="0 0 16 16" x="0" y="1491">
+<path fill="#009688" d="M1 0h6v1h-6zM9 0h6v1h-6zM14.875 5h-0.875v-4h-4v4h-4v-4h-4v4h-0.875c-0.619 0-1.125 0.506-1.125 1.125v8.75c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-5.875h2v5.875c0 0.619 0.506 1.125 1.125 1.125h4.75c0.619 0 1.125-0.506 1.125-1.125v-8.75c0-0.619-0.506-1.125-1.125-1.125zM5.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5zM8.5 8h-1c-0.275 0-0.5-0.225-0.5-0.5s0.225-0.5 0.5-0.5h1c0.275 0 0.5 0.225 0.5 0.5s-0.225 0.5-0.5 0.5zM14.438 15h-3.875c-0.309 0-0.563-0.225-0.563-0.5s0.253-0.5 0.563-0.5h3.875c0.309 0 0.563 0.225 0.563 0.5s-0.253 0.5-0.563 0.5z"></path>
+</svg>
+<svg id="icon-date" width="16" height="16" viewBox="0 0 16 16" x="0" y="1512">
+<path fill="#009688" d="M13.597 2.081h-0.584v2.837c0 0.603-0.489 1.093-1.093 1.093s-1.092-0.49-1.092-1.093v-2.837h-5.64v2.83c0 0.604-0.49 1.094-1.094 1.094-0.603 0-1.092-0.49-1.092-1.094v-2.83h-0.6c-0.775 0-1.402 0.628-1.402 1.402v3.070h14v-3.070c0-0.774-0.627-1.402-1.403-1.402zM4.927 4.612c0 0.463-0.376 0.837-0.837 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.375-0.837 0.837-0.837v0c0.461 0 0.837 0.374 0.837 0.837v2.76zM12.78 4.612c0 0.463-0.374 0.837-0.838 0.837v0c-0.463 0-0.837-0.374-0.837-0.837v-2.76c0-0.463 0.374-0.837 0.837-0.837v0c0.464 0 0.838 0.374 0.838 0.837v2.76zM14.182 7.133v5.608c0 0.774-0.627 1.401-1.401 1.401h-9.573c-0.774 0-1.401-0.627-1.401-1.401v-5.608h-0.807v6.45c0 0.774 0.627 1.403 1.403 1.403h11.193c0.776 0 1.403-0.629 1.403-1.403v-6.45h-0.817zM8.393 11.198h1.101c0.109 0.504 0.389 0.649 0.662 0.649 0.405 0 0.651-0.262 0.651-0.723 0-0.26-0.097-0.626-0.651-0.64h-0.351v-0.69h0.159c0.554-0.014 0.687-0.241 0.687-0.66 0-0.271-0.201-0.468-0.526-0.477-0.426-0.011-0.491 0.185-0.598 0.443l-1.031 0.002c0.239-0.793 0.793-1.196 1.661-1.21 1.052 0.028 1.597 0.453 1.635 1.274 0 0.403-0.232 0.708-0.692 0.909 0.589 0.202 0.885 0.563 0.885 1.080-0.037 0.865-0.646 1.319-1.827 1.362-0.998 0.001-1.599-0.483-1.765-1.319zM7.633 11.479v0.975h-3.543v-0.629c0.386-0.605 0.771-1.059 1.492-1.52 0.663-0.433 0.894-0.763 0.894-1.080 0-0.070 0.003-0.433-0.531-0.433-0.372 0.014-0.645 0.182-0.645 0.565l-1.128 0.007c0.065-1.087 0.95-1.473 1.856-1.473 1.032 0.043 1.586 0.482 1.66 1.317 0.037 0.563-0.28 1.101-1.148 1.634-0.48 0.287-0.523 0.319-0.817 0.636h1.91z"></path>
+</svg>
+<svg id="icon-clock" width="16" height="16" viewBox="0 0 16 16" x="0" y="1533">
+<path fill="#009688" d="M11.331 7.805h-2.732v-2.199c0-0.333-0.267-0.6-0.6-0.6s-0.6 0.267-0.6 0.6v2.932c0.067 0.267 0.267 0.466 0.533 0.466h3.398c0.333 0 0.6-0.267 0.6-0.6s-0.267-0.6-0.6-0.6zM13.53 3.074c-1.399-1.399-3.331-2.199-5.53-2.199-2.132 0-4.131 0.866-5.53 2.199-1.399 1.399-2.265 3.265-2.265 5.33s0.866 3.998 2.265 5.33c1.399 1.399 3.331 2.199 5.53 2.199 2.132 0 4.131-0.866 5.53-2.199 1.399-1.399 2.265-3.265 2.265-5.33s-0.866-3.998-2.265-5.33zM12.664 12.935c-1.199 1.133-2.865 1.866-4.664 1.866s-3.465-0.733-4.664-1.866c-1.199-1.133-1.932-2.732-1.932-4.531s0.733-3.398 1.932-4.531c1.199-1.133 2.865-1.866 4.664-1.866s3.465 0.733 4.664 1.866c1.199 1.133 1.932 2.798 1.932 4.531 0 1.799-0.733 3.398-1.932 4.531zM1.271 2.874l2.332-1.866c0.267-0.2 0.267-0.6 0.067-0.8-0.2-0.267-0.6-0.267-0.866-0.067l-2.332 1.866c-0.267 0.2-0.333 0.6-0.067 0.8 0.2 0.267 0.6 0.267 0.866 0.067zM14.729 2.874c0.267 0.2 0.666 0.133 0.866-0.067 0.2-0.267 0.133-0.6-0.067-0.8l-2.332-1.866c-0.267-0.2-0.666-0.133-0.866 0.067-0.2 0.267-0.2 0.6 0.067 0.8l2.332 1.866z"></path>
+</svg>
+</svg>
diff --git a/public/assets/js/addons.js b/public/assets/js/addons.js
index d2c1d20..58b77cc 100644
--- a/public/assets/js/addons.js
+++ b/public/assets/js/addons.js
@@ -1,3 +1,309 @@
 define([], function () {
-    
+    require.config({
+    paths: {
+        'nkeditor': '../addons/nkeditor/js/customplugin',
+        'nkeditor-core': '../addons/nkeditor/nkeditor.min',
+        'nkeditor-lang': '../addons/nkeditor/lang/zh-CN',
+    },
+    shim: {
+        'nkeditor': {
+            deps: [
+                'nkeditor-core',
+                'nkeditor-lang'
+            ]
+        },
+        'nkeditor-core': {
+            deps: [
+                'css!../addons/nkeditor/themes/black/editor.min.css',
+                'css!../addons/nkeditor/css/common.css'
+            ],
+            exports: 'window.KindEditor'
+        },
+        'nkeditor-lang': {
+            deps: [
+                'nkeditor-core'
+            ]
+        }
+    }
+});
+require(['form'], function (Form) {
+    var _bindevent = Form.events.bindevent;
+    Form.events.bindevent = function (form) {
+        _bindevent.apply(this, [form]);
+        if ($(".editor", form).size() > 0) {
+            require(['nkeditor', 'upload'], function (Nkeditor, Upload) {
+                var getImageFromClipboard, getImageFromDrop, getFileFromBase64;
+                getImageFromClipboard = function (data) {
+                    var i, item;
+                    i = 0;
+                    while (i < data.clipboardData.items.length) {
+                        item = data.clipboardData.items[i];
+                        if (item.type.indexOf("image") !== -1) {
+                            return item.getAsFile() || false;
+                        }
+                        i++;
+                    }
+                    return false;
+                };
+                getImageFromDrop = function (data) {
+                    var i, item, images;
+                    i = 0;
+                    images = [];
+                    while (i < data.dataTransfer.files.length) {
+                        item = data.dataTransfer.files[i];
+                        if (item.type.indexOf("image") !== -1) {
+                            images.push(item);
+                        }
+                        i++;
+                    }
+                    return images;
+                };
+                getFileFromBase64 = function (data, url) {
+                    var arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1],
+                        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
+                    while (n--) {
+                        u8arr[n] = bstr.charCodeAt(n);
+                    }
+                    var filename, suffix;
+                    if (typeof url != 'undefined') {
+                        var urlArr = url.split('.');
+                        filename = url.substr(url.lastIndexOf('/') + 1);
+                        suffix = urlArr.pop();
+                    } else {
+                        filename = Math.random().toString(36).substring(5, 15);
+                    }
+                    console.log(filename);
+                    if (!suffix) {
+                        suffix = data.substring("data:image/".length, data.indexOf(";base64"));
+                    }
+
+                    var exp = new RegExp("\\." + suffix + "$", "i");
+                    filename = exp.test(filename) ? filename : filename + "." + suffix;
+                    var file = new File([u8arr], filename, {type: mime});
+                    return file;
+                };
+
+                var getImageFromUrl = function (url, callback, outputFormat) {
+                    var canvas = document.createElement('CANVAS'),
+                        ctx = canvas.getContext('2d'),
+                        img = new Image;
+                    img.crossOrigin = 'Anonymous';
+                    img.onload = function () {
+                        var urlArr = url.split('.');
+                        var suffix = urlArr.pop();
+                        suffix = suffix.match(/^(jpg|png|gif|bmp|jpeg)$/i) ? suffix : 'png';
+
+                        try {
+                            canvas.height = img.height;
+                            canvas.width = img.width;
+                            ctx.drawImage(img, 0, 0);
+                            var dataURL = canvas.toDataURL(outputFormat || 'image/' + suffix);
+                            var file = getFileFromBase64(dataURL, url);
+                        } catch (e) {
+                            callback.call(this, null);
+                        }
+
+                        callback.call(this, file);
+                        canvas = null;
+                    };
+                    img.onerror = function (e) {
+                        callback.call(this, null);
+                    };
+                    img.src = url;
+                };
+                //上传Word图片
+                Nkeditor.uploadwordimage = function (index, image) {
+                    var that = this;
+                    (function () {
+                        var file = getFileFromBase64(image);
+                        var placeholder = new RegExp("##" + index + "##", "g");
+                        Upload.api.send(file, function (data) {
+                            that.html(that.html().replace(placeholder, Fast.api.cdnurl(data.url)));
+                        }, function (data) {
+                            that.html(that.html().replace(placeholder, ""));
+                        });
+                    }(index, image));
+                };
+
+                Nkeditor.lang({
+                    remoteimage: '下载远程图片'
+                });
+                //远程下载图片
+                Nkeditor.plugin('remoteimage', function (K) {
+                    var editor = this, name = 'remoteimage';
+                    editor.plugin.remoteimage = {
+                        download: function (e) {
+                            var that = this;
+                            var html = that.html();
+                            var staging = {}, orgined = {}, index = 0, images = 0, completed = 0, failured = 0;
+                            var checkrestore = function () {
+                                if (completed + failured >= images) {
+                                    $.each(staging, function (i, j) {
+                                        that.html(that.html().replace("<code>" + i + "</code>", j));
+                                    });
+                                }
+                            };
+                            html.replace(/<code>([\s\S]*?)<\/code>/g, function (code) {
+                                    staging[index] = code;
+                                    return "<code>" + index + "</code>";
+                                }
+                            );
+                            html = html.replace(/<img([\s\S]*?)\ssrc\s*=\s*('|")((http(s?):)([\s\S]*?))('|")([\s\S]*?)[\/]?>/g, function () {
+                                images++;
+                                var url = arguments[3];
+                                var placeholder = '<img src="' + Fast.api.cdnurl("/assets/addons/nkeditor/img/downloading.png") + '" data-index="' + index + '" />';
+                                //如果是云存储的链接,则忽略
+                                if (Config.upload.cdnurl && url.indexOf(Config.upload.cdnurl) > -1) {
+                                    completed++;
+                                    return arguments[0];
+                                } else {
+                                    orgined[index] = arguments[0];
+                                }
+                                //下载远程图片
+                                (function (index, url, placeholder) {
+                                    getImageFromUrl(url, function (file) {
+                                        if (!file) {
+                                            failured++;
+                                            that.html(that.html().replace(placeholder, orgined[index]));
+                                            checkrestore();
+                                        } else {
+                                            Upload.api.send(file, function (data) {
+                                                completed++;
+                                                that.html(that.html().replace(placeholder, '<img src="' + Fast.api.cdnurl(data.url) + '" />'));
+                                                checkrestore();
+                                            }, function (data) {
+                                                failured++;
+                                                that.html(that.html().replace(placeholder, orgined[index]));
+                                                checkrestore();
+                                            });
+                                        }
+                                    });
+                                })(index, url, placeholder);
+                                index++;
+                                return placeholder;
+                            });
+                            if (index > 0) {
+                                that.html(html);
+                            } else {
+                                Toastr.info("没有需要下载的远程图片");
+                            }
+                        }
+                    };
+                    // 点击图标时执行
+                    editor.clickToolbar(name, editor.plugin.remoteimage.download);
+                });
+
+                $(".editor", form).each(function () {
+                    var that = this;
+                    Nkeditor.create(that, {
+                        width: '100%',
+                        filterMode: false,
+                        wellFormatMode: false,
+                        allowMediaUpload: true, //是否允许媒体上传
+                        allowFileManager: true,
+                        allowImageUpload: true,
+                        wordImageServer: typeof Config.nkeditor != 'undefined' && Config.nkeditor.wordimageserver ? "127.0.0.1:10101" : "", //word图片替换服务器的IP和端口
+                        urlType: Config.upload.cdnurl ? 'domain' : '',//给图片加前缀
+                        cssPath: Fast.api.cdnurl('/assets/addons/nkeditor/plugins/code/prism.css'),
+                        cssData: "body {font-size: 13px}",
+                        fillDescAfterUploadImage: false, //是否在上传后继续添加描述信息
+                        themeType: typeof Config.nkeditor != 'undefined' ? Config.nkeditor.theme : 'black', //编辑器皮肤,这个值从后台获取
+                        fileManagerJson: Fast.api.fixurl("/addons/nkeditor/index/attachment/module/" + Config.modulename),
+                        items: [
+                            'source', 'undo', 'redo', 'preview', 'print', 'template', 'code', 'quote', 'cut', 'copy', 'paste',
+                            'plainpaste', 'wordpaste', 'justifyleft', 'justifycenter', 'justifyright',
+                            'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
+                            'superscript', 'clearhtml', 'quickformat', 'selectall',
+                            'formatblock', 'fontname', 'fontsize', 'forecolor', 'hilitecolor', 'bold',
+                            'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', 'image', 'multiimage', 'graft',
+                            'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
+                            'anchor', 'link', 'unlink', 'remoteimage', 'about', 'fullscreen'
+                        ],
+                        afterCreate: function () {
+                            var self = this;
+                            //Ctrl+回车提交
+                            Nkeditor.ctrl(document, 13, function () {
+                                self.sync();
+                                $(that).closest("form").submit();
+                            });
+                            Nkeditor.ctrl(self.edit.doc, 13, function () {
+                                self.sync();
+                                $(that).closest("form").submit();
+                            });
+                            //粘贴上传
+                            $("body", self.edit.doc).bind('paste', function (event) {
+                                var image, pasteEvent;
+                                pasteEvent = event.originalEvent;
+                                if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
+                                    image = getImageFromClipboard(pasteEvent);
+                                    if (image) {
+                                        event.preventDefault();
+                                        Upload.api.send(image, function (data) {
+                                            self.exec("insertimage", Fast.api.cdnurl(data.url));
+                                        });
+                                    }
+                                }
+                            });
+                            //挺拽上传
+                            $("body", self.edit.doc).bind('drop', function (event) {
+                                var image, pasteEvent;
+                                pasteEvent = event.originalEvent;
+                                if (pasteEvent.dataTransfer && pasteEvent.dataTransfer.files) {
+                                    images = getImageFromDrop(pasteEvent);
+                                    if (images.length > 0) {
+                                        event.preventDefault();
+                                        $.each(images, function (i, image) {
+                                            Upload.api.send(image, function (data) {
+                                                self.exec("insertimage", Fast.api.cdnurl(data.url));
+                                            });
+                                        });
+                                    }
+                                }
+                            });
+                        },
+                        //FastAdmin自定义处理
+                        beforeUpload: function (callback, file) {
+                            var file = file ? file : $("input.ke-upload-file", this.form).prop('files')[0];
+                            Upload.api.send(file, function (data) {
+                                var data = {code: '000', data: {url: Fast.api.cdnurl(data.url)}, title: '', width: '', height: '', border: '', align: ''};
+                                callback(data);
+                            });
+
+                        },
+                        //错误处理 handler
+                        errorMsgHandler: function (message, type) {
+                            try {
+                                console.log(message, type);
+                            } catch (Error) {
+                                alert(message);
+                            }
+                        }
+                    });
+                });
+            });
+        }
+    }
+});
+
+//修改上传的接口调用
+require(['upload'], function (Upload) {
+    var _onUploadResponse = Upload.events.onUploadResponse;
+    Upload.events.onUploadResponse = function (response) {
+        try {
+            var ret = typeof response === 'object' ? response : JSON.parse(response);
+            if (ret.hasOwnProperty("code") && ret.hasOwnProperty("data")) {
+                return _onUploadResponse.call(this, response);
+            } else if (ret.hasOwnProperty("key") && !ret.hasOwnProperty("err_code")) {
+                ret.code = 1;
+                ret.data = {
+                    url: '/' + ret.key
+                };
+                return _onUploadResponse.call(this, JSON.stringify(ret));
+            }
+        } catch (e) {
+        }
+        return _onUploadResponse.call(this, response);
+
+    };
+});
 });
\ No newline at end of file
diff --git a/public/assets/js/backend/banner.js b/public/assets/js/backend/banner.js
new file mode 100644
index 0000000..1cc5c9a
--- /dev/null
+++ b/public/assets/js/backend/banner.js
@@ -0,0 +1,51 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'banner/index' + location.search,
+                    add_url: 'banner/add',
+                    edit_url: 'banner/edit',
+                    del_url: 'banner/del',
+                    multi_url: 'banner/multi',
+                    table: 'banner',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'id',
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id')},
+                        {field: 'image', title: __('Image'), events: Table.api.events.image, formatter: Table.api.formatter.image},
+                        {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ]
+                ]
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});
\ No newline at end of file
diff --git a/public/assets/js/backend/command.js b/public/assets/js/backend/command.js
new file mode 100644
index 0000000..f31d8f4
--- /dev/null
+++ b/public/assets/js/backend/command.js
@@ -0,0 +1,234 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function ($, undefined, Backend, Table, Form, Template) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'command/index',
+                    add_url: 'command/add',
+                    edit_url: '',
+                    del_url: 'command/del',
+                    multi_url: 'command/multi',
+                    table: 'command',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'id',
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id')},
+                        {field: 'type', title: __('Type'), formatter: Table.api.formatter.search},
+                        {field: 'type_text', title: __('Type')},
+                        {
+                            field: 'command', title: __('Command'), formatter: function (value, row, index) {
+                                return '<input type="text" class="form-control" value="' + value + '">';
+                            }
+                        },
+                        {
+                            field: 'executetime',
+                            title: __('Executetime'),
+                            operate: 'RANGE',
+                            addclass: 'datetimerange',
+                            formatter: Table.api.formatter.datetime
+                        },
+                        {
+                            field: 'createtime',
+                            title: __('Createtime'),
+                            operate: 'RANGE',
+                            addclass: 'datetimerange',
+                            formatter: Table.api.formatter.datetime
+                        },
+                        {
+                            field: 'updatetime',
+                            title: __('Updatetime'),
+                            operate: 'RANGE',
+                            addclass: 'datetimerange',
+                            formatter: Table.api.formatter.datetime
+                        },
+                        {
+                            field: 'status',
+                            title: __('Status'),
+                            table: table,
+                            custom: {"successed": 'success', "failured": 'danger'},
+                            searchList: {"successed": __('Successed'), "failured": __('Failured')},
+                            formatter: Table.api.formatter.status
+                        },
+                        {
+                            field: 'operate',
+                            title: __('Operate'),
+                            buttons: [
+                                {
+                                    name: 'execute',
+                                    title: __('Execute again'),
+                                    text: __('Execute again'),
+                                    url: 'command/execute',
+                                    icon: 'fa fa-repeat',
+                                    classname: 'btn btn-success btn-xs btn-execute btn-ajax',
+                                    success: function (data) {
+                                        Layer.alert("<textarea class='form-control' cols='60' rows='5'>" + data.result + "</textarea>", {
+                                            title: __("执行结果"),
+                                            shadeClose: true
+                                        });
+                                        table.bootstrapTable('refresh');
+                                        return false;
+                                    }
+                                },
+                                {
+                                    name: 'execute',
+                                    title: __('Detail'),
+                                    text: __('Detail'),
+                                    url: 'command/detail',
+                                    icon: 'fa fa-list',
+                                    classname: 'btn btn-info btn-xs btn-execute btn-dialog'
+                                }
+                            ],
+                            table: table,
+                            events: Table.api.events.operate,
+                            formatter: Table.api.formatter.operate
+                        }
+                    ]
+                ]
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            require(['bootstrap-select', 'bootstrap-select-lang']);
+            var mainfields = [];
+            var relationfields = {};
+            var maintable = [];
+            var relationtable = [];
+            var relationmode = ["belongsto", "hasone"];
+
+            var renderselect = function (select, data) {
+                var html = [];
+                for (var i = 0; i < data.length; i++) {
+                    html.push("<option value='" + data[i] + "'>" + data[i] + "</option>");
+                }
+                $(select).html(html.join(""));
+                select.trigger("change");
+                if (select.data("selectpicker")) {
+                    select.selectpicker('refresh');
+                }
+                return select;
+            };
+
+            $("select[name=table] option").each(function () {
+                maintable.push($(this).val());
+            });
+            $(document).on('change', "input[name='isrelation']", function () {
+                $("#relation-zone").toggleClass("hide", !$(this).prop("checked"));
+            });
+            $(document).on('change', "select[name='table']", function () {
+                var that = this;
+                Fast.api.ajax({
+                    url: "command/get_field_list",
+                    data: {table: $(that).val()},
+                }, function (data, ret) {
+                    mainfields = data.fieldlist;
+                    $("#relation-zone .relation-item").remove();
+                    renderselect($("#fields"), mainfields);
+                    return false;
+                });
+                return false;
+            });
+            $(document).on('click', "a.btn-newrelation", function () {
+                var that = this;
+                var index = parseInt($(that).data("index")) + 1;
+                var content = Template("relationtpl", {index: index});
+                content = $(content.replace(/\[index\]/, index));
+                $(this).data("index", index);
+                $(content).insertBefore($(that).closest(".row"));
+                $('select', content).selectpicker();
+                var exists = [$("select[name='table']").val()];
+                $("select.relationtable").each(function () {
+                    exists.push($(this).val());
+                });
+                relationtable = [];
+                $.each(maintable, function (i, j) {
+                    if ($.inArray(j, exists) < 0) {
+                        relationtable.push(j);
+                    }
+                });
+                renderselect($("select.relationtable", content), relationtable);
+                $("select.relationtable", content).trigger("change");
+            });
+            $(document).on('click', "a.btn-removerelation", function () {
+                $(this).closest(".row").remove();
+            });
+            $(document).on('change', "#relation-zone select.relationmode", function () {
+                var table = $("select.relationtable", $(this).closest(".row")).val();
+                var that = this;
+                Fast.api.ajax({
+                    url: "command/get_field_list",
+                    data: {table: table},
+                }, function (data, ret) {
+                    renderselect($(that).closest(".row").find("select.relationprimarykey"), $(that).val() == 'belongsto' ? data.fieldlist : mainfields);
+                    renderselect($(that).closest(".row").find("select.relationforeignkey"), $(that).val() == 'hasone' ? data.fieldlist : mainfields);
+                    return false;
+                });
+            });
+            $(document).on('change', "#relation-zone select.relationtable", function () {
+                var that = this;
+                Fast.api.ajax({
+                    url: "command/get_field_list",
+                    data: {table: $(that).val()},
+                }, function (data, ret) {
+                    renderselect($(that).closest(".row").find("select.relationmode"), relationmode);
+                    renderselect($(that).closest(".row").find("select.relationfields"), mainfields)
+                    renderselect($(that).closest(".row").find("select.relationforeignkey"), data.fieldlist)
+                    renderselect($(that).closest(".row").find("select.relationfields"), data.fieldlist)
+                    return false;
+                });
+            });
+            $(document).on('click', ".btn-command", function () {
+                var form = $(this).closest("form");
+                var textarea = $("textarea[rel=command]", form);
+                textarea.val('');
+                Fast.api.ajax({
+                    url: "command/command/action/command",
+                    data: form.serialize(),
+                }, function (data, ret) {
+                    textarea.val(data.command);
+                    return false;
+                });
+            });
+            $(document).on('click', ".btn-execute", function () {
+                var form = $(this).closest("form");
+                var textarea = $("textarea[rel=result]", form);
+                textarea.val('');
+                Fast.api.ajax({
+                    url: "command/command/action/execute",
+                    data: form.serialize(),
+                }, function (data, ret) {
+                    textarea.val(data.result);
+                    window.parent.$(".toolbar .btn-refresh").trigger('click');
+                    top.window.Fast.api.refreshmenu();
+                    return false;
+                }, function () {
+                    window.parent.$(".toolbar .btn-refresh").trigger('click');
+                });
+            });
+            $("select[name='table']").trigger("change");
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});
diff --git a/public/uploads/20191127/79e122b17786dbf0365a1018e27872d7.png b/public/uploads/20191127/79e122b17786dbf0365a1018e27872d7.png
new file mode 100644
index 0000000..b97a1f8
Binary files /dev/null and b/public/uploads/20191127/79e122b17786dbf0365a1018e27872d7.png differ
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
index e092371..ab846e2 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
@@ -330,7 +330,7 @@ class CurlFactory implements CurlFactoryInterface
                 $conf[CURLOPT_SSL_VERIFYPEER] = false;
             } else {
                 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
-                $conf[CURLOPT_SSL_VERIFYPEER] = true;
+                $conf[CURLOPT_SSL_VERIFYPEER] = false;
                 if (is_string($options['verify'])) {
                     // Throw an error if the file/folder/link path is not valid or doesn't exist.
                     if (!file_exists($options['verify'])) {
--
libgit2 0.24.0